2009-08-26 7 views
2

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

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 un paramètre « Date de naissance » à certains de ses éléments, nous ajouterons un paramètre à la table des paramètres, puis une entrée dans la table de valeurs pour chaque élément qu'il veut avoir ce paramètre, avec la date allant dans la colonne datevalue et tous les autres champs 'value' left null.

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

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 cette ORDER BY est performant? Fera-t-il bon usage des indices? Fera-t-il du travail inutile?

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

Répondre

1

Vous parlez de la modélisation EAV.

Jetez un oeil à EAV modelling

+1

Merci! C'est de ça que je parle! Je suis toujours curieux si quelqu'un peut me parler d'utiliser ORDER BY COALESCE de cette façon ... –

0

Cette ORDER BY COALESCE ... ne sera pas en mesure d'utiliser un index. La COALESCE est-elle importante? Il semble que si vous regardez un seul paramètre, l'ordre des colonnes suffirait car toutes les valeurs seront du même type.

Cette requête pourrait utiliser un index sur (paramètre_id, datetimevalue, datevalue, integervalue) si vous venez de faire "ORDER BY datetimevalue, datevalue, integervalue". Les inconvénients: 1) il semble un peu en désordre 2) si vous avez beaucoup de colonnes de valeur et si votre table de valeurs va être grande, cet index va perdre de l'espace et lit/écrit.

Vous pourriez être mieux loti si vous ajoutez simplement une colonne "sort_order" (ou quelque chose) à votre table de valeurs et à votre index. De même, si vous avez vraiment besoin de COALESCE parce que vous voulez trier des valeurs de types différents, vous pouvez choisir un calcul sort_order qui fera le bon choix.

Questions connexes