【问题标题】:Suggested table structure for one level deep nested comment?一级深层嵌套评论的建议表结构?
【发布时间】:2023-07-09 16:59:01
【问题描述】:

我想为我的帖子建立一个评论系统。现在它只会是一个级别的深度,意味着评论和它的回复。 在阅读了网络上的各种文章后,有 2 种建议的方法来制作您的表格结构。

1.使用两个表

//comments table

-id
-post_id
-user_id
-comment
-created_at
-updated_at
-deleted_at

//replies table

-id
-comment_id
-user_id
-comment
-created_at
-updated_at
-deleted_at

然后是这两个表之间的一对多关系。现在是第二种方法

2。使用一张表

//comments table

-id
-post_id
-user_id
-comment
-parent_id     //this is important
-created_at
-updated_at
-deleted_at

在第二种方法中,对于*评论,parent_id 可以设置为NULL

您建议的方法是什么?

我认为第一个是更规范化的版本,而第二个给了我将来增加回复嵌套级别的灵活性,所以无论出于何种原因,如果我打算增加评论系统的嵌套级别,我不必更改数据库结构没有了。

此外,如果可能,请链接任何文章,该文章解释了为上述第二个表结构按正确顺序获取和重新排列评论的逻辑。

【问题讨论】:

  • 解决方案 2 的标准化程度如何?仅仅因为它只有 1 个表并不能证明它的标准化程度较低。它偏离解 1 不偏离的范式是什么?

标签: php mysql database database-design


【解决方案1】:

第一种方法过于复杂。你最终有两个表,这意味着 cmets 和评论的 cmets 是不同的实体,并被视为不同的实体。这意味着工作量和代码行数增加一倍。

第二种方法允许您以相同的方式处理任何评论并且很容易实现,唯一的区别是,不是检查任何具有您当前视为其comment_id 的评论的 id 的回复,而是检查对于任何将其作为parent_id 的评论。

优点是您可以根据需要处理任意多的评论层,或者根本不设置任何限制,并且由于所有实体都是 cmets,您可以以相同的方式对待它们。如果您想升级/更正某些内容,这也更容易:一次完成所有更改。

【讨论】:

    最近更新 更多