entity-attribute-value model, som du foreslår, kunne passe ind i dette scenarie.
Med hensyn til filtreringsforespørgslen skal du forstå, at med EAV-modellen vil du ofre masser af forespørgselskraft, så dette kan blive ret vanskeligt. Men denne ene måde at løse dit problem på:
SELECT stuff.id FROM stuff JOIN (SELECT COUNT(*) matcher FROM tabel WHERE (`nøgle` =X1 OG `værdi` =V1) ELLER (`nøgle` =X2 OG `værdi` =V2) GROUP BY id ) sub_t ON (sub_t.matches =2 OG sub_t.id =stuff.id) GROUP BY stuff.id;
En uelegant egenskab ved denne tilgang er, at du skal angive antallet af attribut/værdi-par, som du forventer at matche i sub_t.matches =2
. Hvis vi havde tre betingelser, ville vi have været nødt til at angive sub_t.matches =3
, og så videre.
Lad os bygge en testcase:
CREATE TABLE stuff (`id` varchar(20), `key` varchar(20), `value` varchar(20));INSERT INTO stuff VALUES ('æble', 'farve', 'rød' ');INSERT INTO stuff VALUES ('mango', 'farve', 'gul');INSERT INTO stuff VALUES ('banan', 'farve', 'gul');INSERT INTO stuff VALUES ('æble', 'smag' ', 'sød'); INDSÆT I ting-VÆRDIER ('mango', 'smag', 'sød'); INDSÆT I ting-VÆRDIER ('banan', 'smag', 'bitter-sød'); INDSÆT I ting-VÆRDIER ( 'æble', 'oprindelse', 'US');INSERT INTO stuff VALUES ('mango', 'origin', 'MEXICO');INSERT INTO stuff VALUES ('banan', 'origin', 'US');
Forespørgsel:
SELECT stuff.id FROM stuff JOIN (SELECT COUNT(*) matcher, id FROM stuff WHERE (`key` ='color' OG `value` ='gul') ELLER (`key` ='smag ' OG `value` ='sød') GRUPPER EFTER id ) sub_t ON (sub_t.matches =2 OG sub_t.id =stuff.id) GRUPPER EFTER stuff.id;
Resultat:
+-------+| id |+-------+| mango |+-------+1 række i sæt (0,02 sek.)
Lad os nu indsætte en anden frugt med color=yellow
og smag=sød
:
INSERT INTO stuff VALUES ('pære', 'farve', 'gul');INSERT INTO stuff VALUES ('pære', 'smag', 'sød');INSERT INTO stuff VALUES ('pære' , 'oprindelse', 'et sted');
Den samme forespørgsel ville returnere:
+-------+| id |+-------+| mango || pære |+-------+2 rækker i sæt (0,00 sek.)
Hvis vi ønsker at begrænse dette resultat til enheder med origin=MEXICO
, bliver vi nødt til at tilføje en anden ELLER
betingelse og kontroller for sub_t.matches =3
i stedet for 2
.
SELECT stuff.id FROM stuff JOIN (SELECT COUNT(*) matcher, id FROM stuff WHERE (`key` ='color' OG `value` ='gul') ELLER (`key` ='smag ' OG `value` ='sweet') ELLER (`key` ='origin' OG `value` ='MEXICO') GRUPPER EFTER id ) sub_t ON (sub_t.matches =3 OG sub_t.id =stuff.id)GROUP AF stuff.id;
Resultat:
+-------+| id |+-------+| mango |+-------+1 række i sæt (0,00 sek.)
Som i enhver tilgang er der visse fordele og ulemper ved brug af EAV-modellen. Sørg for at undersøge emnet grundigt i forbindelse med din ansøgning. Du vil måske endda overveje en alternativ relationsdatabase, såsom Cassandra , CouchDB , MongoDB , Voldemort , HBase , SimpleDB eller andre nøgleværdibutikker.