implications sur les performances de ORDER BY COALESCE dans MySQL

voix
2

Mon problème général est que je veux que les utilisateurs puissent, en effet, ajouter un nombre arbitraire de champs de différents types d'associer aux éléments. Donc, une solution que je considérais est la suivante:

table `items`
item_id  |  name  

table `parameters`  
parameter_id  |  name  |  type

table `values`  
item_id  |  parameter_id  |  datetimevalue  |  datevalue  |  integervalue  |  etc...

Si un utilisateur veut ajouter une « date de naissance » paramètre à certains de ses éléments, nous ajouterons un paramètre à la table des paramètres, puis une entrée dans le tableau des valeurs pour chaque élément qu'il veut avoir ce paramètre, la la date va dans la colonne datevalue et tous les autres champs « valeur » gauche null.

Pour commander ses articles par « Date de naissance », en supposant que ce paramètre a parameter_id = 1, je ferais

SELECT * from 
items
join values on items.item_id = values.item_id
join parameters on parameters.parameter_id = values.parameter_id

where parameter_id = 1
order by coalesce(values.datetimevalue, values.datevalue, values.integervalue...)

Ma question est, sera le présent ORDER être performant? Est-il faire bon usage des indices? Est-il faire un travail inutile?

Ma question est générale, cette approche est une bonne pratique? Y a-t-il une meilleure manière de faire cela?

Créé 26/08/2009 à 22:20
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

Vous parlez de la modélisation EAV.

Jetez un coup d' œil à la modélisation EAV

Créé 26/08/2009 à 22:28
source utilisateur

voix
0

Cette ORDER BY COALESCE ... ne sera pas en mesure d'utiliser un index. Est-COALESCE important? Il semble que si vous êtes à la recherche à un seul paramètre, la commande par les colonnes serait suffisant parce que toutes les valeurs sont du même type.

Cette requête serait en mesure d'utiliser un index sur (parameter_id, DatetimeValue, datevalue, IntegerValue) si vous venez de faire "ORDER BY DatetimeValue, datevalue, IntegerValue".

Les inconvénients: 1) il semble un peu désordonné 2) si vous avez beaucoup de colonnes de valeur et si votre table de valeurs va être grande, cet indice va perdre de l'espace et lecture / écriture.

Vous pourriez être mieux si vous ajoutez juste un « sort_order » (ou quelque chose) colonne à votre table de valeurs et index à la place. En outre, si vous avez vraiment besoin COALESCE parce que vous voulez trier les valeurs de différents types, vous pouvez choisir un calcul sort_order qui fera la bonne chose.

Créé 03/09/2009 à 05:52
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more