我有一个表可以保存各种内容类型的评论。这些保存在其他表格(新闻、文章、用户)中。我想知道连接这些表的最佳方法是什么?在以前的项目中,我为每种内容使用了第二个表格。他们持有映射到评论表 id 的某些内容的 id。因此,对于每条评论,我都有评论条目本身和一个“连接器”条目。另一种方法是对任何类型的内容使用单独的评论表。最后,两种方式都包含一些冗余缺陷。
那么我应该使用哪一个或者是否有一个解决方案?
我有一个表可以保存各种内容类型的评论。这些保存在其他表格(新闻、文章、用户)中。我想知道连接这些表的最佳方法是什么?在以前的项目中,我为每种内容使用了第二个表格。他们持有映射到评论表 id 的某些内容的 id。因此,对于每条评论,我都有评论条目本身和一个“连接器”条目。另一种方法是对任何类型的内容使用单独的评论表。最后,两种方式都包含一些冗余缺陷。
那么我应该使用哪一个或者是否有一个解决方案?
有一些明显的方法来设计你的桌子:
1) 您可以拥有一个主评论表和中间表,以将每个评论连接到您的文章、新闻和用户表:
评论 -------- ID 新闻动态评论 ---- ------------ ID NewsID 评论ID 文章文章评论 -------- --------------- ID 文章ID 评论ID 用户用户评论 ----- ------------ 用户ID 评论ID
这样做的好处是查询每个功能的评论相对容易。但是,这种风格存在引用完整性问题:它可能将单个评论与多个评论、新闻文章和用户联系起来。此外,它的可扩展性不是很好:如果您为 RSS 提要、收藏链接、用户状态等添加评论,那么您就有所有这些类型的中间表。
2)另一种方法是稍微非规范化的版本:
评论 -------- ID 表名 PkID(连接其他表中的主键) 消息 ---- ID 文章 -------- ID 用户 ----- ID
这很有效,并且在您添加新功能时可以轻松扩展,但是您不能同时将 Comments.RefID 字段键入多个表,因此您失去了参照完整性。
3) 最后一个选项需要为每个功能提供大量冗余的“评论”表。
新闻动态评论 ---- ------------ ID NewsID 文章文章评论 -------- --------------- ID 文章ID 用户用户评论 ----- ------------ 用户ID
这种风格的优点是保留了引用完整性,并且任何查看您的模式的人都可以轻松理解。缺点是具有相同架构的表数量过多。
我可能会为每个内容表创建一个单独的注释表,以便我可以利用外键关系在更改/删除原始内容时自动管理更新/删除。因此,如果我有新闻和文章表,那么我将有 news_comments 和 article_comments 表。其中每一个都有一个 content_id 字段和一个 user_id 字段。content_id 字段将引用回内容表,而 user_id 字段将引用回用户表。我会在适当的内容和评论表与用户和每个评论表之间建立外键关系,并让更改在更新/删除时传播。您可能还想在 id 字段上设置索引,以便在它们之间进行索引连接。
如果您有一个注释表,则必须在代码中手动管理关系,而不是让数据库为您处理它——因为您只能让 FK 与另一个表相关。
您的问题似乎类似于
另一种方式可能是这样的:
Comments
-------
ID
NewsID
ArticleID
UserID
对于每一行,只有一个非零。这将使查询比使用中间表更简单。
然而,从数据完整性的角度来看,为每个 Contents 表设置一个 Comments 表会更明智。