2010-12-27 5 views
3

Ich versuche, eine Datenbank mit ASP.net MVC-Anwendung zu verwenden. Hier ist das Szenario: Es gibt drei Entitäten und Benutzer können ihre Kommentare für jede dieser verschiedenen Entitäten veröffentlichen. Ich frage mich nur, wie man einfach einen Tisch für Kommentare anlegt und alle anderen Entitäten damit verbindet. Offensichtlich benötigt die Kommentartabelle 3 Referenzen (Fremdschlüssel) zu diesen Tabellen, aber wie Sie wissen, können diese Fremdschlüssel nicht null sein und nur einer von ihnen kann für jede Zeile gefüllt werden. Gibt es einen besseren Weg, als drei verschiedene Tabellen für die Kommentare jeder Entität zu implementieren?Wie Multi-Beziehung in SQL Server implementieren?

Antwort

7

Entweder: Ein Kommentar Tabelle pro Entitätstyp

Oder: ein Master-Entity-Tabellen mit Kind Kommentare und EntityType-spezifische Tabellen.

  • EntityMaster: EntityID, foo, bar
  • Kommentare: EntityID, CommentID, UserID, ... PK (EntityID, CommentID etc)

Für die 3 Entity Tabellen, PK ist EntityID

  • EntityOne: EntityID, EntityTypeID (check constraint = 1), ...
  • EntityTwo: EntityID, EntityTypeID (check constraint = 2), ...
  • EntityThree: EntityID, EntityTypeID (Check-Constraint = 3), ...

Es ist für drei Eltern eine Kommentartabelle keine Verknüpfung oder Eleganz mit: es ist falsch, in Datenbank-Design Bedingungen.

Persönlich würde ich wahrscheinlich für Option 1 ... gehen

bearbeiten, auf Reflexion:

Manchmal muss man bei der Nutzung der Daten suchen.

Wenn die drei Einheiten separat verwendet werden, auf separaten Bildschirmen, stellen keine Verbindung miteinander, dann würde es Option 1.

werden, wenn die drei Einheiten verwendet werden und angezeigt zusammen, dann 2 Option macht mehr Sinn, weil Sie Daten leichter zusammenziehen können.

+0

+1 Zum Aufzeigen, wie "verteilte" Schlüssel mit Prüfbedingungen simuliert werden können. Ich würde jedoch argumentieren, dass es Zeiten gibt (nicht hier), wenn der letztere Ansatz akzeptabel ist. –

+0

@pst: ja, da sind. Siehe meine Bearbeitung bitte – gbn

3

Wenn Sie alle drei Entitätstabellen mit derselben Kommentartabelle verbinden, können Sie keine referenzielle Integrität durch Fremdschlüssel erhalten. In diesem Szenario hätten Sie eine "Schlüssel" -Spalte und eine "Entitätstyp" -Spalte in Ihrer Kommentartabelle. Um die Kommentare für eine Entität zu erhalten, müssten Sie nach Entitätstyp filtern.

Persönlich würde ich drei Kommentartabellen mit der gleichen Struktur bevorzugen, die durch Vereinigung vereinigt werden kann, um alle Kommentare für alle Wesen zu erhalten.

+0

Ich stimme den Tabellen mit mehreren Kommentaren mit demselben Strukturvorschlag zu.- Solange die Spalten konsistent sind, sollte es leicht sein, die Kommentare auch in einer Ansicht zu konsolidieren. – Nikhil

1

Sie db Struktur wie im Bild unten. Sie müssen beim Erstellen von Entity1 oder Entity2 CommentHistory erstellen.

alt text

Also, wenn Sie alle Kommentare zu Entity1 bekommen brauchen Sie brauchen nur:

Select * from Comment where CommentHistoryId = 5 -- '5' it CommentHistoryId from Entity1