2010-04-12 4 views
8

Ich versuche eine Spezialisierung/Generalisierung zu modellieren, die auf die Verwendung der Vererbung von Klassentabellen ausgerichtet ist (siehe this answer).Klassentabellenvererbung vs. Denormalisierung

Allerdings hat mein Kollege Bedenken wegen Wartung und Leistung, da es viele (50+) überlappende Spezialisierungen derselben Tabelle geben wird. Sein Vorschlag ist eine Tabelle mit den folgenden Spalten zu erstellen:

  • Verweis auf die allgemeine Tabelle
  • Verweis auf eine Tabelle, die Arten von Spezialisierungen
  • Verweis auf eine Tabelle, das Attribut unterhält unterhält Wert

Auf diese Weise werden alle Attribute in einer Tabelle verwaltet und können nach der Spezialisierungsspalte gefiltert werden. Ich weiß nicht, was dieser Entwurf genannt wird, aber ich mache mir Sorgen, dass es irgendwie zu EAV verwendet ist ...

Mein Hauptanliegen ist modification anomalies, aber davon abgesehen, dass ich sehe keinen Grund, warum es eine schlechte Idee ist. Ist eine Lösung der anderen klar überlegen, oder sollten wir nur eine auswählen und weitermachen?

Antwort

7

Beim Entwerfen von Tabellen entwerfe ich sie in der Regel mit einem Gedanken: Benutzung.

Wie schreibe ich die Daten dort und wie frage ich sie zurück. Ich verzerren das Design in Richtung liest oder schreibt basierend auf die für die Leistung wichtiger sein wird, wie repetitive, usw.

Ihre Frage erklärt nicht wirklich Ihre Verwendung, so dass alle Vorschläge in meiner Antwort hier vollständige Spekulation sind. Wenn Sie 20k Zeilen pro Tag einfügen, wäre das Design anders, als wenn Sie 5 pro Tag einfügen würden. Auch, wenn Sie 20k Suchen pro Tag an irgendeiner Spalte irgendeines Typs laufen lassen müssen oder wenn Sie 5 pro Tag laufen lassen. Diese würden sich darauf auswirken, wie Sie Ihre Tabellen einrichten.

das gesagt ist, ein allgemeiner Ansatz könnte sein, so etwas zu tun:

Die 50+ Tabellen Spezialisierungen überlappende wird ein Alptraum Abfragen schreiben auf. Ich würde versuchen, 1 Haupthaupttabelle und vielleicht 5 oder so andere allgemeine Tabellen zu finden, wo Sie ein wenig in "Single Table Inheritance" (wo Sie mehrere Spalten haben können, die nicht für jeden Typ gelten, aber enthalten sind) Sie decken so viele Spalten wie möglich ab. Von dort überdecken Sie die übrigen Spalten mit dem EAV-ähnlichen Ansatz.

+0

Ich komme gerade von einem Treffen zurück, und das ist sehr ähnlich zu dem, was wir am Ende hatten. Es stellte sich heraus, dass eine große Mehrheit der Spezialisierungen nur informativ war. Daher verwendeten wir den generischen Datenmodellansatz für sie. Für die paar Spezialisierungen, die eine gute Performance erforderten/wir planten, viel abzufragen, verwendeten wir die Vererbung der Klassentabelle. Also danke, tolle Antwort! –