【问题标题】:Designing a comment table设计评论表
【发布时间】:2009-04-16 20:05:16
【问题描述】:

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

我该怎么做?

当前表格:

标签、产品、用户、cmets

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

【问题讨论】:

  • 选择参考线程版本...但会稍微改变它以包含一个表格来处理动态/以编程方式添加的表格。

标签: sql-server database-design


【解决方案1】:

您想对产品、用户、评论等进行 cmet 吗? 或者找到评论所指的产品、用户、评论等?

对于前者,我会使用表格将事物与它们的 cmets 关联起来:

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

因此,系统中的每个可评论实体都会有一个连接表和一个评论线程,等待热切的用户添加 cmets。或者,您可以直接链接到根评论,而不使用这种间接方式。

【讨论】:

  • 这似乎是一种合理的方法。为了清楚起见,我可能还会在答案中包含 comment_threads 表。
【解决方案2】:

您最好的选择是将 cmets 与目标隔离开来。比如……

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)

只有根 cmets(没有父级)会有一行。这将允许您仍然保持强大的外键架构,并且仍然只能将评论与一个产品相关联。

【讨论】:

  • 你的设计很不错,我只是有一个问题,我们不能用一个comment_id(FK)制作一个普通的产品表吗?为什么我们需要product_comment?还是 product_comment 和 product 表一样?
【解决方案3】:

我的尝试:

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

)

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

【讨论】:

  • 如果您想在未来将 cmets 附加到其他资源,如 Jack 所述(最终可能有 10-20 个 FK 列),您将需要修改 Comment 表。但我对数据库设计和运行大容量网站的了解还不够,无法说出这是否真的是一个问题。
  • 在他最初的问题中,他从未提到 10-20,只是提到了 3
【解决方案4】:

也许

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。

【讨论】:

  • 我更喜欢这种方法,我们使用类似的结构为我们的大型 SaaS 应用程序创建审计记录。我将通过用 FK 替换 table_source 来进一步规范化数据,以查找表名,甚至是来自 sys.tables 的 object_id
  • 您仍然无法将评论绑定到任何表中的特定记录,因为您将在此处存储来自多个表的主键。你也不能处理复合主键。
  • 亚当指出的方法同样有价值,这只是一个不同的解决方案,也许杰克不想打扰很多外键关系表,也许他想要一个动态设计
  • 杰夫,我确实喜欢使用 FK 来查找表的想法,因为我不知道表的数量是否会保持固定(事实上,完全有可能以编程方式添加表。 )
  • 这不是检索 cmets 的好方法。你将如何索引它并查询它?
猜你喜欢
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多