Bonjour,
J'ai l'occasion de me frotter aujourd'hui à une modélisation EAV, consistant en gros à associer de manière creuse des paires de clés/valeurs à des objets.
C'est normalement quelque chose d'assez classique et je ne rencontrais pas de problèmes jusqu'à ce que je cherche à sélectionner des objets possédant une clé portant une valeur égale à une constante donnée ou une valeur nulle.
Le fait de rechercher la clé de valeur nulle me semble compliqué puisqu'elle n'existe pas du tout dans ma table de paires.
Voici un exemple de requête qui me donne les résultats attendus.
Les deux jointures LEFT JOIN sont là pour donner une idée du modèle retenu.
Ici je veux donc tous les objets disposant d'une clé 'key' à la valeur 'value' ou ne disposant pas de la clé 'key'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 SELECT DISTINCT obj.record_id,T.value FROM objets obj LEFT JOIN tagsCollection Tc ON Tc.record_id = obj.record_id LEFT JOIN tags T ON T.tag_id = Tc.tag_id AND T.name = 'key' WHERE 'value' NOT IN (SELECT DISTINCT T.name FROM tags T JOIN tagsCollection Tc ON (Tc.tag_id = T.tag_id AND T.name = 'key') WHERE Tc.record_id = obj.record_id AND T.value != 'value' AND T.name = 'key') ORDER BY T.value DESC;
Donc en gros je recherche tous les objets qui ne satisfont pas cette contrainte, puis je fais mon 'NOT IN' en prenant l'opposé de cet ensemble.
Cela fonctionne, mais me semble vraiment trop compliqué, d'autant que je veux pouvoir faire ça sur plusieurs champs en même temps (donc autant de requêtes imbriquées pour l'instant). Est-ce possible et comment ?
Je suis sur qu'il y a moyen d'optimiser un peu tout ça et je souhaiterais avoir vos retour d'expérience sur ce point.
Le but derrière tout ça est d'identifier des objets de manière certaine sur la base de champs marquant leur unicité. Sauf que les objets peuvent ne pas avoir tout ces champs définis en même temps.
Par exemple, la plaque d’immatriculation et le modèle d'une voiture marquent son unicité. Les objets qui peuvent correspondre sont donc les enregistrements avec la même plaque d'immatriculation et avec le même modèle ou un modèle nul.
En vous remerciant par avance pour toute indication, bonne après-midi.
Partager