Generalisierung vs Spezialisierung der DB-Tabelle

8

Wenn ich Datenbanktabellen entwerfen möchte, die eine endliche Eltern-Kind-Beziehung modellieren, z. B. Computer als Elternteil und die Komponenten darin als Kind; oder eine einfache organisatorische Hierarchie, ich bin in der Regel gerissen, welchen Ansatz zu verwenden -

  1. Ein "spezialisierter Tabellen" -Ansatz, bei dem ich für jede der möglichen Entitäten eine Tabelle erstelle. Im Beispiel der Computerkomponente hätte ich eine Computer-Tabelle und eine Komponententabelle mit der Computer-ID als FK in der Component-Tabelle, die auf Computer.ComputerID verweist. oder
  2. Ein 'verallgemeinerter Tabellenansatz', in dem ich eine Tabellentabelle namens Component mit ComponentID als PK und eine ParentComponentID als FK habe, die auf die ComponentID ihres Elternteils verweist.
chethong 23.01.2009, 15:43
quelle

5 Antworten

4

Der Grund, warum ich die meiste Zeit die Option 1 über 2 wähle, ist, dass es einfacher ist, meine Elternzeilen aus der Datenbank zu entfernen. Andernfalls müssen Sie die SQL-Anweisung so schreiben, dass Sie die Zeilen aus der Tabelle erhalten, die untergeordnete Zeilen haben, aber nur diese Zeilen. Es wird schnell unordentlich.

Wenn Sie eine der gängigen relationalen Datenbanken verwenden, verwenden Sie sie so, wie sie für die Verwendung vorgesehen sind.

    
Nick DeVore 23.01.2009 15:50
quelle
3

Es gibt eine große Gefahr im relationalen Design, wenn Sie versuchen, Verallgemeinerungen zu erstellen, die eigentlich nicht wahr sind, aber elegant aussehen. Wenn Sie eine allgemeine Tabelle mit einem Typfeld haben, führt dies zu einer Form der Indirektion, die stattdessen in Ihrem Code aufgelöst werden muss, was sowohl die Leistung als auch die Klarheit des Codes beeinträchtigen kann.

Auf der anderen Seite kann eine solche Indirektion ihre Verwendung haben, und für bestimmte Zwecke benutze ich sie ziemlich viel. Die Frage, die Sie stellen müssen, ist, ob Computer und Component wirklich Aspekte derselben Sache sind oder ob Sie sie nur zusammen manipulieren, weil es sich gut anhört.

    
Marcus Downing 23.01.2009 15:54
quelle
3

Ich bevorzuge die verallgemeinerte Tabelle, wenn ich weiß, dass ich das Modell erweitern muss, um neue Ebenen in einer Hierarchie zu unterstützen.

Der Nachteil einer verallgemeinerten Tabelle besteht darin, dass sie die starke Typisierung verliert, die ich normalerweise durch Hinzufügen einer "Typ" -Tabelle (d. h. "ComponentType" für die generische "Component" -Tabelle) gelöst habe.

Dies ermöglicht ein Modell, das erweitert werden kann, und bietet dennoch eine starke Typisierung jeder Komponente in der Hierarchie.

BEARBEITEN: Marcus hat die Frage aufgeworfen, ob Computer derselbe ist wie eine Komponente. Ich sollte klarstellen, dass der verallgemeinerte Tabellenansatz für ähnliche Objekte verwendet werden sollte.

    
Jay S 23.01.2009 15:49
quelle
2

Nach meiner Erfahrung ist ein verallgemeinerter Tabellenansatz verlockend, weil er Ihnen mehr Macht gibt, aber auf lange Sicht werden Sie feststellen, dass es kompliziert zu befolgen und zu pflegen ist.

    
Eduardo Molteni 23.01.2009 15:57
quelle
1

Wenn man beides benutzt, ist Ersteres für neue Programmierer definitiv einfacher zu verstehen. Es ist auch einfacher in den einfachsten Fällen zu behandeln.

Wo letzteres nützlich ist, kann sich die Hierarchie der Dinge ändern; oder ein Objekt ändert seine hierarchische Reihenfolge oder die Hierarchie selbst ändert sich. Es ist auch nützlich, wenn die Hierarchie komplex ist, da Sie sie nicht als Tabellen in der Datenbank modellieren müssen.

    
Loki 23.01.2009 15:50
quelle

Tags und Links