Polymorphe Assoziationen (PA's) ist ein ziemlich großer Begriff für eine relativ einfache Datenbankanforderung: verschiedene Tabellen sollen Kinddatensätze in einer gemeinsamen Tabelle haben. Das klassische Beispiel ist eine einzelne Tabelle mit Kommentar-Datensätzen, die sich auf verschiedene, nicht unbedingt verwandte Entitäten beziehen.
Unter diese Frage Mark hat in hervorragender Weise drei gängige Ansätze zur Implementierung von PAs aufgezeigt. Ich möchte den Ansatz der Basistabelle verwenden, der in einem ebenso ausgezeichneten Artikel beschrieben wird Antwort von Bill Karwin .
Ein konkretes Beispiel könnte so aussehen:
Die Primärschlüssel der Entitäten verweisen auf identische Schlüsselwerte in der Basistabelle und die Tabelle Kommentar verweist auf die Basistabelle, so dass die referentielle Integrität gewahrt bleibt. Entscheidend ist dabei, dass die Primärschlüssel der Entitätstabellen deutlich Bereiche. Sie werden erzeugt, indem ein neuer Datensatz in der Basistabelle angelegt und sein erzeugter Schlüssel in den Primärschlüssel der Entität kopiert wird.
Nun meine Frage: Was ist, wenn ich PAs mit referentieller Integrität in eine bestehende Datenbank mit Entitäten einführen möchte, die ihre eigenen, sich gegenseitig überschneidenden Primärschlüssel erzeugen?
Bislang sehe ich zwei Möglichkeiten:
Option 1:
Jede Entität behält ihren eigenen Primärschlüssel, erhält aber auch einen alternativen Schlüssel.
Wie:
- Kommt dem empfohlenen Ansatz sehr nahe.
- Der Basistisch ist stabil.
Abneigung:
- Bestehende Einrichtungen müssen geändert werden.
- Es ist schwer, den Eigentümer eines Kommentars zu finden.
Option 2:
Jede Entität hat ihre eigene Fremdschlüsselspalte in der Basistabelle. Dies sieht aus wie Marks Ansatz mit mehreren Spalten.
Wie:
- Bestehende Einrichtungen sind nicht betroffen.
- Einfaches Auffinden des Eigentümers eines Kommentars.
Abneigung:
- Spärliche Spalten
- Basistabelle nicht stabil: muss geändert werden, wenn eine neue Entität mit PA eingeführt wird
Ich tendiere zu Option 1, möglicherweise mit einem Feld "EntityName" in der Basistabelle für die bidirektionale Suche. Welche Option wäre besser? Oder gibt es einen anderen, noch besseren Ansatz?