Wie erstelle ich einen (Typ, ID) (auch bekannt als 'polymorph')- Fremdschlüsselspalte im MS-Zugriff?
Frage
In Ruby-on-Rails wird dies als "polymorphe Assoziation" bezeichnet.
Ich habe mehrere Commentable
Dinge in meiner Bewerbung sind die Tabellen für jeden unten:
Post
id | title | text | author (FK:Person.id) | ...
Person
id | name | ...
Photo
id | title | owner (FK:Person.id) | path | ...
Ich möchte eine hinzufügen Comments
Tabelle wie folgt:
Comments
id | commentable_type | commentable_id | text | author (FK:Person.id)
Ich verstehe, dass ich die referenzielle Integrität der Datenbank auf diese Weise verliere, aber die einzige andere Option ist, mehrere zu haben Comments
Tische: PostComments
, PersonComments
, PhotoComments
, ...
Und jetzt für die Frage:
Wie kann ich ein Formular erstellen, das grokiert, wie man die Lookup durchführt, indem ich den Tabellennamen aus bekomme? Comments.commentable_type
und dann die ID von Comments.commentable_id
?
Lösung
Diese Technik ist in der SQL -Welt umgangssprachlich als "Subklasse" bekannt. Für ein bearbeitetes Beispiel (SQL Server -Syntax ist jedoch leicht für MS -Zugriff angepasst) siehe David Portas Blog..
In Ihrem Szenario befinden sich die Datenelemente, die allen Kommentaren gemeinsam sind, in Ihrer Kommentartabelle. Alles, was für jeden Typ spezifisch ist, wäre in spezialisierten Tabellen wie Photocomments usw. Beachten Sie, dass die FK die zweispaltige Verbindung des ID plus der Typ sein sollte, das oft übersehen wird, aber für die Referenzintegrität hier, z. B. Sie nicht Ich möchte, dass etwas als Fotokommentar in der Tabelle der Personaltringe angezeigt wird.
Andere Tipps
Ich glaube, viele Menschen machen Meta-Tabellen für so etwas. Ziemlich genau so, wie du es beschrieben hast.