Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zu viele Tische; MySQL kann nur 61 Tabellen in einem Join verwenden

Sie verwenden ein EAV-Design und versuchen, eine einzelne Zeile aus einer variablen Anzahl von Attributen zu rekonstruieren. Dies weist auf eine der vielen Landminen hin, auf die Sie bei der Verwendung des EAV-Designs stoßen werden:Es gibt eine praktische Grenze für die Anzahl der Verknüpfungen, die Sie in einer einzigen SQL-Abfrage ausführen können.

Besonders in MySQL gibt es eine harte Grenze, wie Sie festgestellt haben. Aber selbst bei anderen RDBMS-Marken gibt es eine effektive Grenze, da die Kosten für Joins in Bezug auf die Anzahl der Tabellen geometrisch sind.

Wenn Sie EAV verwenden, versuchen Sie nicht, eine Zeile in SQL neu zu erstellen als ob Sie ein herkömmliches Datenbankdesign hätten. Rufen Sie stattdessen die Attribute als Zeilen ab, sortiert nach der Entitäts-ID. Bearbeiten Sie sie dann in Ihrem Anwendungscode nach. Dies bedeutet jedoch, dass Sie die Daten nicht in einem Schritt ausgeben können – Sie müssen Code schreiben, um die Attributzeilen zu durchlaufen, und jede Datenzeile umformen, bevor Sie sie ausgeben können.

EAV ist kein bequemes Datenbankdesign. Es gibt viele kostspielige Nachteile bei der Verwendung, und Sie haben gerade einen davon getroffen.

Siehe http://www.simple-talk.com/opinion /meinungsstücke/schlechtes-carma/ für eine großartige Geschichte darüber, wie die Verwendung von EAV ein Unternehmen zum Scheitern verurteilt hat.

Siehe auch http://en.wikipedia.org/wiki/Inner-platform_effect denn EAV ist ein Beispiel für dieses Anti-Pattern.

Ich verstehe die Notwendigkeit, einen dynamischen Satz von Attributen pro Produkt in einem Katalog zu unterstützen. Aber EAV wird Ihre Anwendung beenden. Folgendes mache ich, um dynamische Attribute zu unterstützen:

  • Definieren Sie eine echte Spalte in der Basistabelle für jedes Attribut, das allen Produkttypen gemeinsam ist. Produktname, Preis, Menge auf Lager usw. Arbeiten Sie hart daran, sich das kanonische Produkt vorzustellen Entität, damit Sie so viele Attribute wie möglich in diesen Satz aufnehmen können.

  • Definieren Sie eine weitere Spalte vom Typ TEXT für alle zusätzlichen Attribute des jeweiligen Produkttyps. In dieser Spalte als Serialized LOB speichern der Attribute in dem für Sie passenden Format:XML, JSON, YAML, Ihre eigene hausgemachte DSL usw.

    Behandeln Sie dies in Ihren SQL-Abfragen als einzelne Spalte. Jede Suche, Sortierung oder Anzeige, die Sie basierend auf diesen Attributen durchführen müssen, erfordert, dass Sie den gesamten TEXT abrufen Blob in Ihre Anwendung, deserialisieren Sie sie und analysieren Sie die Attribute mithilfe des Anwendungscodes.