sql >> Databáze >  >> RDS >> Mysql

Příliš mnoho stolů; MySQL může ve spojení používat pouze 61 tabulek

Používáte návrh EAV a pokoušíte se znovu sestavit jeden řádek z proměnného počtu atributů. To poukazuje na jednu z mnoha nášlapných min, na které narazíte při použití návrhu EAV:existuje praktický limit na počet spojení, která můžete provést v jednom SQL dotazu.

Zejména v MySQL - jak jste zjistili, existuje pevný limit. Ale i v jiných značkách RDBMS existuje efektivní limit, protože náklady na spojení jsou geometrické s ohledem na počet tabulek.

Pokud používáte EAV, nepokoušejte se znovu vytvořit řádek v SQL jako byste měli konvenční návrh databáze. Místo toho načtěte atributy jako řádky seřazené podle ID entity. Poté je zpracujte v kódu aplikace. To znamená, že nemůžete data vypsat v jednom kroku – musíte napsat kód, který bude opakovat řádky atributů, a přeformátovat každý řádek dat, než je budete moci odeslat.

EAV není vhodný návrh databáze. Jeho používání má mnoho drahých nevýhod a právě jste narazili na jednu z nich.

Viz http://www.simple-talk.com/opinion /opinion-pieces/bad-carma/ za skvělý příběh o tom, jak používání EAV odsoudilo jeden podnik k zániku.

A také viz http://en.wikipedia.org/wiki/Inner-platform_effect protože EAV je příkladem tohoto Anti-vzoru.

Chápu potřebu podporovat dynamickou sadu atributů na produkt v katalogu. Ale EAV vaši aplikaci zabije. Zde je to, co dělám pro podporu dynamických atributů:

  • Definujte skutečný sloupec v základní tabulce pro každý atribut, který je společný pro všechny typy produktů. Název produktu, cena, množství na skladě atd. Snažte se představit si kanonický produkt entity, abyste do této sady mohli zahrnout co nejvíce atributů.

  • Definujte ještě jeden sloupec typu TEXT pro všechny další atributy každého daného typu produktu. Uložit v tomto sloupci jako Serializovaný LOB atributů v jakémkoli formátu, který vám vyhovuje:XML, JSON, YAML, vaše vlastní domácí DSL atd.

    Považujte to za jeden sloupec v dotazech SQL. Jakékoli vyhledávání, řazení nebo zobrazení, které musíte provést na základě těchto atributů, vyžaduje, abyste načetli celý TEXT blobu do vaší aplikace deserializujte ji a analyzujte atributy pomocí kódu aplikace.



  1. SQLAlchemy a UnicodeDecodeError

  2. Vytvoření webové aplikace od nuly pomocí Python Flask a MySQL:Část 3

  3. Tipy pro zámky čtení/zápisu v závislosti na úrovni izolace transakcí v MSSQL

  4. trvalý způsob provádění mysqli->set_charset()?