sql >> Databasteknik >  >> RDS >> Mysql

För många bord; MySQL kan bara använda 61 tabeller i en join

Du använder en EAV-design och försöker rekonstruera en enda rad från ett variabelt antal attribut. Detta pekar på en av de många landminor som du kommer att stöta på när du använder EAV-designen:det finns en praktisk gräns för antalet joins du kan göra i en enda SQL-fråga.

Speciellt i MySQL -- det finns en hård gräns, som du har upptäckt. Men även i andra RDBMS-märken finns det en effektiv gräns eftersom kostnaden för sammanfogningar är geometrisk med avseende på antalet tabeller.

Om du använder EAV, försök inte att bygga om en rad i SQL som om du hade en konventionell databasdesign. Hämta istället attributen som rader, sorterade efter enhets-id. Efterbehandla dem sedan i din ansökningskod. Det betyder att du inte kan dumpa data i ett steg -- du måste skriva kod för att loopa över attributraderna och reformera varje rad med data innan du kan mata ut den.

EAV är inte en bekväm databasdesign. Det finns många dyra nackdelar med att använda det, och du har precis träffat en av dem.

Se http://www.simple-talk.com/opinion /opinion-pieces/bad-carma/ för en fantastisk berättelse om hur användningen av EAV dömde till ett företag.

Och se även http://en.wikipedia.org/wiki/Inner-platform_effect eftersom EAV är ett exempel på detta antimönster.

Jag förstår behovet av att stödja en dynamisk uppsättning attribut per produkt i en katalog. Men EAV kommer att döda din ansökan. Så här gör jag för att stödja dynamiska attribut:

  • Definiera en riktig kolumn i bastabellen för varje attribut som är gemensamt för alla produkttyper. Produktnamn, pris, kvantitet i lager etc. Arbeta hårt för att föreställa dig den kanoniska produkten enhet så att du kan inkludera så många attribut som möjligt i denna uppsättning.

  • Definiera ytterligare en kolumn av typen TEXT för alla ytterligare attribut för varje given produkttyp. Lagra i den här kolumnen som Serialized LOB av attributen, oavsett format som passar dig:XML, JSON, YAML, din egen hemmagjorda DSL, etc.

    Behandla detta som en enda kolumn i dina SQL-frågor. All sökning, sortering eller visning du behöver göra baserat på dessa attribut kräver att du hämtar hela TEXT blob in i din applikation avserialisera den och analysera attributen med applikationskod.



  1. RODBC odbcDriverConnect() Anslutningsfel

  2. Varför finns null<>null=null i mysql

  3. Hur man hittar n:e raden i MySQL

  4. SQL, hur man uppdaterar data