0

我有一个表可以保存各种内容类型的评论。这些保存在其他表格(新闻、文章、用户)中。我想知道连接这些表的最佳方法是什么?在以前的项目中,我为每种内容使用了第二个表格。他们持有映射到评论表 id 的某些内容的 id。因此,对于每条评论,我都有评论条目本身和一个“连接器”条目。另一种方法是对任何类型的内容使用单独的评论表。最后,两种方式都包含一些冗余缺陷。

那么我应该使用哪一个或者是否有一个解决方案?

4

4 回答 4

3

有一些明显的方法来设计你的桌子:

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

这种风格的优点是保留了引用完整性,并且任何查看您的模式的人都可以轻松理解。缺点是具有相同架构的表数量过多。

于 2008-11-29T23:17:04.930 回答
2

我可能会为每个内容表创建一个单独的注释表,以便我可以利用外键关系在更改/删除原始内容时自动管理更新/删除。因此,如果我有新闻和文章表,那么我将有 news_comments 和 article_comments 表。其中每一个都有一个 content_id 字段和一个 user_id 字段。content_id 字段将引用回内容表,而 user_id 字段将引用回用户表。我会在适当的内容和评论表与用户和每个评论表之间建立外键关系,并让更改在更新/删除时传播。您可能还想在 id 字段上设置索引,以便在它们之间进行索引连接。

如果您有一个注释表,则必须在代码中手动管理关系,而不是让数据库为您处理它——因为您只能让 FK 与另一个表相关。

于 2008-11-29T23:00:29.300 回答
0

您的问题似乎类似于

如何将一张表关联到许多不同的表?

于 2008-11-29T23:10:41.247 回答
0

另一种方式可能是这样的:

Comments
-------
ID
NewsID
ArticleID
UserID

对于每一行,只有一个非零。这将使查询比使用中间表更简单。

然而,从数据完整性的角度来看,为每个 Contents 表设置一个 Comments 表会更明智。

于 2008-11-29T23:57:28.170 回答