Relationale Datenbanken sind nicht dafür ausgelegt, mit dieser Situation perfekt umzugehen. Sie müssen entscheiden, was für Sie am wichtigsten ist, und dann Ihre Kompromisse eingehen. Sie haben mehrere Ziele:
- Behalten Sie die dritte Normalform bei
- Aufrechterhaltung der referenziellen Integrität
- Behalten Sie die Einschränkung bei, dass jedes Konto entweder einem Unternehmen oder einer natürlichen Person gehört.
- Erhalten Sie die Fähigkeit, Daten einfach und direkt abzurufen
Das Problem ist, dass einige dieser Ziele miteinander konkurrieren.
Subtypisierungslösung
Sie können eine Subtypisierungslösung auswählen, bei der Sie einen Supertyp erstellen, der sowohl Unternehmen als auch Personen umfasst. Dieser Supertyp hätte wahrscheinlich einen zusammengesetzten Schlüssel des natürlichen Schlüssels des Untertyps plus ein Partitionierungsattribut (z customer_type. B. ). Dies ist für die Normalisierung in Ordnung und ermöglicht es Ihnen, die referenzielle Integrität sowie die Einschränkung durchzusetzen, dass Unternehmen und Personen sich gegenseitig ausschließen. Das Problem ist, dass dies das Abrufen von Daten erschwert, da Sie immer nach dem customer_typeZeitpunkt verzweigen müssen, an dem Sie das Konto dem Kontoinhaber hinzufügen. Dies bedeutet wahrscheinlich, UNIONdass Sie eine Menge sich wiederholender SQL-Anweisungen in Ihrer Abfrage verwenden und verwenden müssen.
Zwei Fremdschlüssel Lösung
Sie könnten eine Lösung wählen , wo Sie halten zwei Fremdschlüssel in Ihrem Konto Tisch, ein körperschaft und eine zu Person. Diese Lösung ermöglicht es Ihnen auch, die referenzielle Integrität, Normalisierung und gegenseitige Ausschließlichkeit aufrechtzuerhalten. Es hat auch den gleichen Nachteil beim Abrufen von Daten wie die Subtypisierungslösung. Tatsächlich ist diese Lösung genau wie die Untertypisierungslösung, mit der Ausnahme, dass Sie das Problem haben, Ihre Verknüpfungslogik "früher" zu verzweigen.
Dennoch würden viele Datenmodellierer diese Lösung aufgrund der Art und Weise, in der die gegenseitige Ausschließlichkeitsbeschränkung durchgesetzt wird, als der Subtypisierungslösung unterlegen betrachten. In der Subtypisierungslösung verwenden Sie Schlüssel, um die gegenseitige Exklusivität zu erzwingen. In der Lösung mit zwei Fremdschlüsseln verwenden Sie eine CHECKEinschränkung. Ich kenne einige Leute, die eine ungerechtfertigte Voreingenommenheit gegenüber Prüfungsbeschränkungen haben. Diese Leute würden die Lösung bevorzugen, die die Einschränkungen in den Schlüsseln beibehält.
Lösung für das Partitionierungsattribut "Denormalized" (Denormalisiert)
Es gibt eine andere Option, bei der Sie eine einzelne Fremdschlüsselspalte in der Tabelle des Prüfkontos behalten und in einer anderen Spalte erfahren, wie die Fremdschlüsselspalte (RoKa's) zu interpretieren istOwnerTypeIDSäule). Dadurch wird die Supertyp-Tabelle in der Untertypisierungslösung im Wesentlichen eliminiert, indem das Partitionierungsattribut für die untergeordnete Tabelle denormalisiert wird. (Beachten Sie, dass dies gemäß der formalen Definition keine reine "Denormalisierung" ist, da das Partitionierungsattribut Teil eines Primärschlüssels ist.) Diese Lösung erscheint recht einfach, da keine zusätzliche Tabelle vorhanden ist, um mehr oder weniger dasselbe zu tun Reduziert die Anzahl der Fremdschlüsselspalten auf eins. Das Problem bei dieser Lösung besteht darin, dass das Verzweigen der Abruflogik nicht vermieden wird und darüber hinaus die deklarative referenzielle Integrität nicht aufrechterhalten werden kann . SQL-Datenbanken können keine einzelne Fremdschlüsselspalte für eine von mehreren übergeordneten Tabellen verwalten.
Shared Primary Key Domain-Lösung
Eine Möglichkeit, mit diesem Problem umzugehen, besteht manchmal darin, einen einzelnen ID-Pool zu verwenden, damit für eine bestimmte ID nicht verwechselt werden kann, ob sie zu einem Subtyp oder einem anderen gehört. In einem Bankenszenario würde dies wahrscheinlich ganz natürlich funktionieren, da Sie nicht die gleiche Bankkontonummer sowohl für ein Unternehmen als auch für eine natürliche Person vergeben. Dies hat den Vorteil, dass kein Partitionierungsattribut erforderlich ist. Sie können dies mit oder ohne eine Super-Typ-Tabelle tun. Wenn Sie eine Supertyp-Tabelle verwenden, können Sie deklarative Einschränkungen verwenden, um die Eindeutigkeit zu erzwingen. Andernfalls müsste dies verfahrensrechtlich durchgesetzt werden. Diese Lösung ist normalisiert, ermöglicht es Ihnen jedoch nicht, die deklarative referenzielle Integrität beizubehalten, es sei denn, Sie führen die Supertyp-Tabelle. Es wird immer noch nichts unternommen, um eine komplexe Abruflogik zu vermeiden.
Sie sehen also, dass es nicht wirklich möglich ist, ein sauberes Design zu haben, das alle Regeln einhält, und gleichzeitig den Datenabruf einfach zu halten. Sie müssen entscheiden, wo Ihre Kompromisse sein werden.
OwnerTypeIDin derChecquingAccountTabelle zu haben, mit1=Corporationund2=NaturalPerson? Auf diese Weise benötigen Sie nur eineOwnerIDin derChecquingAccountTabelle, die Sie zusammen mit der indizieren könnenOwnerTypeID.