【问题标题】:Advice on Structuring a Comment System关于构建评论系统的建议
【发布时间】:2011-07-16 06:58:13
【问题描述】:
我是数据库设计的初学者,我想创建一个评论系统,能够回复用户 cmets 并可能显示用户所做的所有 cmets。此外,还会有许多页面,每个页面都有一个评论部分。
到目前为止,我已经提出了两种潜在的数据库设计来构建评论系统。第一个将为每个页面的 cmets 提供一个表格,为每个用户的 cmets 提供一个表格。页面注释表将具有用于表链接目的的 user_id 和 page_id 字段。
第二种可能的设计结构是有一个大型的 cmets 分区表,其中只有 comment_id 和 user_id 字段用于表链接。我还没有考虑如何使用回复功能;在我解决这个问题之前,我想获得一些关于哪种设计方法(如果有的话)可以有效执行的意见。
【问题讨论】:
标签:
mysql
database
database-design
【解决方案1】:
comments
id
user_id
comment_text
page_id
parent_id
使用它来存储页面的评论。 parent_id 是一条评论,它是对另一条评论的回复。对于页面上的评论,parent_id 将为零(无父评论),但对于回复,parent_id 将非零,它将是回复所属评论的 ID。
例如,你会有这样的数据
id user_id comment_text page_id parent_id
1 6 sdh 1 0 <-- comment on the page
2 9 gfdf 2 0 <-- another comment on other page
3 4 reply xzy 1 1 <-- reply to comment id 1 by user id 4 on page 1
您可以考虑使用timestamp、flagged、deleted 等字段来帮助您对评论进行排序、排序、过滤、监控和软删除。您可以按页面、按用户、按父级分组。
【解决方案2】:
我会使用两张表:一张用于评论线程,另一张用于 cmets。评论线程看起来像这样:
id
/* Other bookkeeping things like created time and such */
和 cmets:
id
thread_id
user_id
comment
parent_id
/* Other bookkeeping stuff */
然后通过在页表中添加comment_thread_id 列将线程附加到页面。
拥有一个单独的独特的评论线程为您提供了一个方便的地方来附加访问控制或类似的扩展,它还允许您将评论线程附加到事物。将评论线程附加到页面而不是其他方式可以方便地稍后将评论线程添加到系统中的其他对象。