在数据库中编写注释表

时间:2008-11-28 02:01:45

标签: database database-design

我正在开发一个社交网络系统,该系统会有来自几个不同位置的评论。一个可能是朋友,一个可能是活动,一个可能是团体 - 就像Facebook一样。我想知道的是,从实际的角度来看,编写评论表的最简单方法是什么?我应该在一个表中完成所有操作并允许外键到各种不同的表,还是每个不同的表都有自己的注释表?谢谢你的帮助!

6 个答案:

答案 0 :(得分:4)

我认为单个评论表是更优雅的设计。但不是多个FK,而是考虑一个中间表 - CommentedItem。因此,朋友,事件,组等都有FK到CommentedItem,并为每个表中的每个新行创建一个CommentedItem行。现在注释只需要一个FK,即CommentedItem。例如,获取给定朋友的所有评论:

SELECT * FROM Comment c
JOIN CommentedItem ci on c.CommentedItemId = ci.CommentedItemId
JOIN Friend f on f.CommentedItemId = ci.CommentedItemId
WHERE f.FriendId = @FriendId

答案 1 :(得分:2)

我已经完成了两个,答案取决于具体情况。对于正在尝试做什么,我会做一个单一的“评论”表,然后分开“链接”表。这将为您提供最佳性能,因为您可以实现“Perfect Index”。

我还建议在“注释”表中放置一个“CommentTypeID”字段,以提供一个“线索”,表示您将从哪个链接表中提取附加详细信息。

编辑:不应在索引中使用CommentTypeID字段,而是仅用于代码。

答案 2 :(得分:0)

这是与this one相同的问题。

编辑:根据评论,目前尚不清楚这是一个等价的问题,所以我在下面拼写出来。

这两个问题都询问项目(两者都恰好是社交​​网络,但这只是巧合),其中存在关于数据库性能的问题。两者都有一组不同的对象,这些对象共享一个共同的属性集合(一个是事件,发生在每个对象上,另一个是每个对象上发生的注释)。

这两个问题都有效地询问创建一个UNION查询是否更有效,该UNION查询结合了不同的共同特征,或者将它们分解为具有适当外键的公共表。

我认为它们是等同的;一个人的最佳答案同样适用于另一个人。

(如果您不同意,我很高兴听到原因;请发表评论。)

答案 3 :(得分:0)

要注意的一件事是,如果不进行高度规范化的数据库,它有时会导致IO行链接和表扫描。

我相信oracle建议执行大约第3范式的标准化模型。

答案 4 :(得分:0)

我会选择polymorphic associations。许多现代Web开发框架都支持开箱即用,这使得它成为处理这种关系的最简单,最轻松的方式。

答案 5 :(得分:0)

实际上你可以去http://www.zazazine.com查看他们的文章。你可以在那里找到答案