2009-04-15 7 views
1

Fondamentalement, je veux créer un système de commentaires où les commentaires peuvent avoir des parents qui sont aussi des commentaires MAIS je voudrais aussi qu'ils aient potentiellement des parents qui pourraient être quelque chose d'autre, comme des utilisateurs ou des produits pouvoir commenter les produits, utilisateurs, autres commentaires, ou pratiquement n'importe quelle ressource)Conception d'un tableau de commentaires

Comment est-ce que je devrais faire ceci?

tables actuelles:

étiquettes, produits, utilisateurs, commentaires

modifier - ce serait pour un site de trafic assez élevé, donc je ne peux pas l'avoir fait toutes sortes de folie :-)

+0

Choisissez la version du thread de référence ... mais modifiez-la légèrement pour inclure une table de tables pour gérer les tables dynamiques/programmées. –

Répondre

8

Voulez-vous avoir des commentaires sur les produits, les utilisateurs, commentaires, etc. ? Ou trouvez les produits, utilisateurs, avis, etc, auxquels un commentaire fait référence?

Pour les premiers, je mettrais des tables à associer des choses avec leurs commentaires:

create table join_products_comments (
    product_id int (unique, i.e., one thread of comments per product), 
    comment_thread_id int 
); 

create table join_users_comments (
    user_id int (unique, i.e., one thread of comments per user), 
    comment_thread_id int 
); 

Lorsqu'un comment_thread est juste une référence à un fil que chaque références de commentaire:

create table comment_threads (
    thread_id int (PK), 
    thread_name nvarchar2(256), 
    created datetime 
); 

create table comments (
    comment_id int (PK), 
    comment_thread_id int (FK), 
    parent_comment_id int (FK), 
    user_id int (FK), -- person who posted the comment 
    comment text, 
    created datetime 
); 

Ainsi, chaque Entité commentable dans le système aurait une table de jointure et un comment_thread juste en attente pour les utilisateurs désireux d'ajouter des commentaires. Ou vous pouvez simplement lier à un commentaire racine à la place et faire sans cette indirection.

+0

Cela semble être une approche saine. J'inclurais probablement aussi la table comment_threads dans la réponse juste pour des raisons de clarté. – Calvin

+0

Oui, ajouté pour plus de clarté. – JeeBee

-1

peut-être

CREATE TABLE comment (
id INT PK, 
parent_comment INT NULL FK, 
content TEXT, 
table_source VARCHAR(30), -- SYSNAME, 
row_source INT, 
) 

en table_source vous économiseriez la source de table (produit, utilisateur, etc.), et row_source, l'identifiant de la ligne le commentaire est pointé.

+1

Je préfère cette approche, et nous utilisons une structure similaire pour créer des enregistrements d'audit pour notre grande application SaaS. Je voudrais normaliser les données plus loin en remplaçant table_source avec un FK à une table de recherche de noms de table, ou même le object_id de sys.tables –

+0

Vous ne pouvez toujours pas lier un commentaire à un enregistrement particulier dans une table, car vous allez stocker les clés primaires de plusieurs tables ici. Vous ne pouvez pas non plus gérer les clés primaires composées. –

+0

L'approche Adam points est tout aussi valable, c'est juste une solution différente, Peut-être que Jack ne veut pas s'embêter avec beaucoup de tables de relations clés étrangères, et peut-être qu'il veut un design dynamique –

0

Votre meilleur pari serait d'isoler les commentaires des cibles. Quelque chose comme ...

comment: 
    comment_id (PK), 
    user_id (FK), 
    date, 
    comment, 
    parent_comment_id (FK) 

Alors tables comme ...

product_comment: 
    product_comment_id (PK), 
    product_id (FK), 
    comment_id (FK, unique) 

où seuls les commentaires des racines (sans parents) auraient une rangée. Cela vous permet de conserver une architecture de clé étrangère solide tout en continuant à associer un commentaire à un seul produit.

-1

mon essai:

CREATE TABLE Comment 
(
    CommentID    INT   NOT NULL IDENTITY(1,1) PRIMARY KEY 
    ,CommentValue   VARCHAR(5000) NOT NULL 
    ,CommentParentCommentID INT   NULL  --fk to self 
    ,CommentParentTagID  INT   NULL  --fk to Tags 
    ,CommentParentProductID INT   NULL  --fk to Parents 
    ,CommentParentUserID  INT   NULL  --fk to Users 

) 

cela permettra de vous les trouver en utilisant un index, sans trop de déchets avec le stockage

+0

Vous devrez modifier la table des commentaires si vous souhaitez joindre des commentaires à d'autres ressources dans le futur, comme Jack l'a indiqué (se terminant par 10-20 colonnes FK potentiellement). Mais je n'en sais pas assez sur la conception de bases de données et l'exécution de sites à haut volume pour dire si c'est réellement un problème ou non. – Calvin

+0

dans sa question initiale, il ne mentionne jamais 10-20, juste les 3 –