Du bruger et EAV-design og prøver at rekonstruere en enkelt række ud fra et variabelt antal attributter. Dette peger på en af de mange landminer, du vil støde på ved hjælp af EAV-designet:Der er en praktisk grænse for antallet af joinforbindelser, du kan lave i en enkelt SQL-forespørgsel.
Især i MySQL -- der er en hård grænse, som du har fundet. Men selv i andre RDBMS-mærker er der en effektiv grænse, fordi omkostningerne ved joinforbindelser er geometriske i forhold til antallet af tabeller.
Hvis du bruger EAV, forsøg ikke at rekonstruere en række i SQL som om du havde et konventionelt databasedesign. Hent i stedet attributterne som rækker, sorteret efter enheds-id'et. Efterbehandle dem derefter i din ansøgningskode. Dette betyder, at du ikke kan dumpe dataene i ét trin -- du skal skrive kode for at sløjfe over attributrækkerne og reformere hver række data, før du kan udlæse dem.
EAV er ikke et praktisk databasedesign. Der er mange dyre ulemper ved at bruge det, og du har lige ramt en af dem.
Se http://www.simple-talk.com/opinion /opinion-pieces/bad-carma/ for en god historie om, hvordan brugen af EAV dømte én virksomhed.
Og se også http://en.wikipedia.org/wiki/Inner-platform_effect fordi EAV er et eksempel på dette anti-mønster.
Jeg forstår behovet for at understøtte et dynamisk sæt attributter pr. produkt i et katalog. Men EAV vil dræbe din ansøgning. Her er, hvad jeg gør for at understøtte dynamiske attributter:
-
Definer en reel kolonne i basistabellen for hver egenskab, der er fælles for alle produkttyper. Produktnavn, pris, mængde på lager osv. Arbejd hårdt på at forestille dig det kanoniske produkt enhed, så du kan inkludere så mange attributter som muligt i dette sæt.
-
Definer en kolonne mere af typen
TEXT
for alle yderligere attributter for hver given produkttype. Gem i denne kolonne som Serialiseret LOB af attributterne, uanset hvilket format der passer dig:XML, JSON, YAML, din egen hjemmelavede DSL osv.Behandl dette som en enkelt kolonne i dine SQL-forespørgsler. Enhver søgning, sortering eller visning, du skal udføre baseret på disse attributter, kræver, at du henter hele
TEXT
blob ind i din applikation deserialiser den, og analyser attributterne ved hjælp af applikationskoden.