2009-03-20 5 views
2

Also, ich baue eine Website und ich werde Standard-CMS-Tabellen wie Artikel, Blog, Umfrage, etc. Ich möchte die Benutzer können Kommentare zu irgendwelchen von diese Gegenstände. Meine Frage ist also, muss ich separate Kommentartabellen für jeden erstellen (z. B. ArticleComment, BlogComment, PollComment), oder kann ich einfach eine generische Kommentartabelle erstellen, die mit jeder Tabelle verwendet werden kann? Was hat für Menschen funktioniert?SQL-Schema, um Benutzern das Hinzufügen von Kommentaren zu verschiedenen Tabellen zu ermöglichen

Methode 1: Viele Kommentar Tabellen

  • Artikel {ArticleID [PK], Titel, FriendlyUrl}
  • ArticleComment {ArticleCommendID [PK], ArticleID [FK], Kommentar}
  • Blog {blogid, Titel, PubDate, Kategorie}
  • BlogComment {BlogCommendID [PK], blogid [FK], Kommentar}
  • Poll {PollID, Titel, IsClosed}
  • PollComment {PollCommentID [PK], PollID [FK], Kommentar}

Methode 2: Einzel Kommentar Tabellen

  • Artikel {ArticleID [PK], Titel, FriendlyUrl}
  • Blog {BlogID, Titel, PubDate, Kategorie}
  • Abfrage {PollID, Titel, IsClosed}
  • Kommentar {CommentID [PK], ReferenceID [FK], Kommentar}
+0

Das Deklarieren des Fremdschlüssels in der Einzelkommententabelle ist nicht möglich. – derobert

+0

@ derobert - Ich glaube an SQL Server, dass ich mehrere Fremdschlüsselbeziehungen erstellen kann. Ich muss nur sicherstellen, dass die referenzielle Integrität nicht durchgesetzt wird. Das verhindert einen Teil des Zwecks für die Verwendung von Fremdschlüsseln, aber es scheint zu funktionieren. Linq2Sql scheint in Ordnung zu sein. – Jim

+0

Ja, Sie werden referentielle Integrität opfern, aber es klingt so, als ob Sie die FKs für das ORM sowieso nur wollen? – RobS

Antwort

3

Ich würde mit der generischen Kommentartabelle gehen. Es wird viele Dinge viel einfacher machen. Ich würde Kommentare auch mit der ID des Benutzers versehen, der sie erstellt hat, oder andere Quellen identifizierende Informationen (IP-Adresse usw.). Auch wenn Sie dies nicht anzeigen, kann es sehr nützlich sein, wenn Sie Spam usw. bereinigen müssen.

0

Ich würde nur eine Kommentartabelle vorschlagen und ein ItemID-Feld hinzufügen, das angibt, um welchen Typ von Element es sich handelt:

Article {ArticleID [PK], Title, FriendlyUrl} 
Blog {BlogID, Title, PubDate, Category} 
Poll {PollID, Title, IsClosed} 
Comment {CommentID [PK], ReferenceID [FK], ItemID, Comment} 
Item {ItemID, Type} 

Die letzte Tabelle würde Datensätze enthalten, wie (1, ‚Artikel‘), (2, ‚Blog‘) usw.

auf diese Weise können Sie auch jeden Inhaltstyp identifizieren sein werden Kommentar wurde gemacht für.

+0

Wenn die Primärschlüssel GUIDs wären, müsste ich sogar eine Spalte "Typ" hinzufügen? – Jim

+0

@Jim nein, wenn die Dinge richtig eingerichtet sind, würdest du nicht. Mit Setup-Recht meine ich, dass Sie einen Weg (keine Suche) haben, um den Objekttyp zu ermitteln, auf den eine GUID verweist. – MarkusQ

+0

Wie richten Sie Ihren FK auf "ReferenceID" ein? –

0

ich auf einem System arbeite, wo wir das folgende Modell für Kommentare:

Data Table(s)  Many-to-many Assoc    Comment Table 
    CommentableId -> CommentableId/CommentId -> Comment_Id 

Nicht mein Design, aber Ich mag die flexibilität. Es erlaubt uns, einen Kommentar in vielen verschiedenen Orten zu verwenden. Da dies in der Benutzeroberfläche nicht einfach zu implementieren ist, können Benutzer diese Funktion (nur ein Textfeld zum Eingeben eines Kommentars) nicht sehen, aber sie wird verwendet, wenn wir Batch-Importe und Altdatenverarbeitung in der Datenbank durchführen.

3

Es scheint zwei große Möglichkeiten der Zuordnung OO-Vererbung auf relationale Datenbanken zu sein:

  1. alle Nehmen Sie die Attribute aus der übergeordneten Klasse und alle untergeordneten Klassen und sie in den Tisch legen, zusammen mit einem "Welche Klasse ist das?" Feld.Jedes Objekt wird als eine Zeile in einer Tabelle serialisiert.

  2. Erstellen Sie eine Tabelle für die Elternklasse und eine Tabelle für jede Kindklasse. Die Tabelle für die Elternklasse Tabelle enthält die 'welche Klasse ist das?' Feld. Die Kindklassentabelle enthält einen Fremdschlüssel, der auf die Elternklasse verweist. Jedes Objekt wird in der übergeordneten Klassentabelle als eine Zeile und in der untergeordneten Klassentabelle als eine Zeile serialisiert.

Methode eins ist wirklich nicht gut skalieren: es windet schnell mit vielen Nullable-Felder auf, fast immer null und beängstigend CHECK Einschränkungen. Aber es ist ziemlich einfach für kleine Klassenhierarchien.

Methode zwei Skalen viel besser, aber es ist mehr Arbeit. Es führt auch zu viel mehr Tabellen in Ihrem Schema.

Ich schlage vor, einen Blick auf Methode zwei für Ihre Artikel/Umfragen/Blogs Tabellen - für mich, sie klingen wie Kinder Tabellen von einem Content oder etwas. Sie haben dann einen sehr klaren und einfachen Ort, um Kommentare anzuhängen: an die Content.

+0

tolle Sachen mit dem OO zu relationalen Zuordnung –

1

Warum möchten Sie alle Ihre Kommentare in der gleichen Tabelle behalten? Wirst du alle Kommentare als Gruppe behandeln? Wenn Sie nicht erwarten, mit allen Kommentaren zu allen Elementen als eine einzige Gruppe zu arbeiten, gibt es keinen Grund, sie alle zusammen zu gruppieren. Nur weil zwei Entitäten in einer Datenbank dieselben Attribute haben, heißt das nicht, dass sie in dieselbe physische Tabelle eingefügt werden sollten.

Verwandte Themen