设计评论表

时间:2009-04-15 14:00:11

标签: sql-server database-design

基本上我想创建一个评论系统,其中评论可能有父母也是评论但我也希望他们可能有父母可能是其他东西,如用户或产品(即,我希望能够评论产品,用户,其他评论,或几乎任何资源)

我该怎么做?

当前表:

标签,产品,用户,评论

编辑 - 这将是一个有点高流量的网站,所以我不能让它做各种疯狂: - )

4 个答案:

答案 0 :(得分:8)

您想对产品,用户,评论等发表评论吗? 或者查找评论所指的产品,用户,评论等?

对于前者,我会有表格将事情与他们的评论联系起来:

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
);

其中comment_thread只是对每个注释引用的线程的引用:

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
);

因此,系统中的每个可评论实体都会有一个连接表和一个comment_thread,只等待渴望用户添加注释。或者你可以直接链接到根注释,而不用那个间接。

答案 1 :(得分:0)

您最好的选择是将评论与目标隔离开来。有点像...

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

然后表格......

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

只有根评论(没有父母)才会有一行。这将使您仍然可以保持强大的外键架构,并且仍然只能将注释与一个产品相关联。

答案 2 :(得分:-1)

也许

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

在table_source中,您将保存表源(产品,用户等),并在row_source中保存注释所指向的行的ID。

答案 3 :(得分:-1)

我的尝试:

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

)

这将允许您使用索引找到它们,而不会有太多的存储浪费