2010-11-12 69 views
5

假设您有多个可以分别附带一个或多个注释的“事物”。产品和订单,例如。应如何进行表结构....多用表的数据库设计

  1. 产品,订单,评论,ProductComment {产品ID,CommentID},{OrderComment订单ID,CommentID}
  2. 产品,订单,ProductComment {产品ID,文字},OrderComment {订单ID,文字}
  3. 产品,订单,评论{产品ID,订单ID,文字}

使用SQL Server 2008,顺便说一句。

想法,意见?

+0

看看** [类似的问题/答案](http://stackoverflow.com/questions/4050784/defining-multiple-foreign-keys-in-one-table-to-many-tables/4051523 #4051523)**。 – 2010-11-12 12:17:57

回答

1

肯定只能使用一个评价表,这样你就不必重复评论信息(例如时间戳,flagged_for_moderation等)。评论中有两个字段很好,因为它明确表示它是一对多的链接。我可能会倾向于通过多个链接表,尽管我很欣赏链接表中只有行在链接表中,而有一半的值是NULL。也许在一个非常大的数据库中有更多的东西可以被评论,你可以去链接表。

+0

同意重复方面。我喜欢链接表,除了我不喜欢额外的步骤去评论表。 – 2010-11-12 05:20:35

+0

是的,链接表确实会让你的查询更加复杂。使用多个列代替也意味着如果你得到所有的评论,你可以告诉他们什么样的评论,而不做任何JOIN,并且如果你使用URL(或其他参考)中的ID,你可以直接链接到正在评论的项目。 – theazureshadow 2010-11-12 05:25:18

+0

我喜欢链接表的另一个原因是,您可以根据需要添加其他字段。也许ProductComment表格也有一些与产品\评论组合相关的字段。 – 2010-11-12 05:30:54

2

我认为Order/Product表应该保持原样。

Comments表可以

CommentID 
EntityID 
EntityType 
Comment 

EntityType会再告诉你到EntityID属于(ProductID/OrderID

其表
+0

谢谢。我没有列出这个选项的原因是因为这打破了外键。我真的不想检查EntityType来确定要查找哪个表来获取实体。 – 2010-11-12 05:04:55

+0

这具有限制,您不能在支持它们的数据库中使用显式外键(例如,InnoDB),这意味着你不能真正使用像CASCADE这样的功能。我很欣赏它减少了必要的表的数量,在很多情况下这是很好的,但这并不是普遍值得的。 – theazureshadow 2010-11-12 05:05:07

+0

@Josh不错,打我吧:) – theazureshadow 2010-11-12 05:05:31

0

如果你不喜欢entityIDentityType方法,因为你不能使用外键约束,你可以采取混合策略,像

COMMENT(commentID, comment, productID, orderID, ....) 

与...的作为每个可评论表的附加列。

+0

这也许可以工作,但是旁观者的答案是它通常是如何完成的。 – SingleNegationElimination 2010-11-12 05:37:12

+0

这是我的选项#3。不知道我是否喜欢它......我倾向于选项1. – 2010-11-12 05:38:52

+0

@TokenMacGuy我认为,旁观者的回答比我列出的3个选项差。 – 2010-11-12 05:39:54

0

如果你使用链接表,并且有超过2或3个可以链接到评论的“类型”,那么就开始考虑生成的代码来创建所需的所有SQL。你将很快有一个101连接表和大量的表定义SQL来维护。

如果您对所有ID使用GUIDS并且不介意没有在数据库中定义外键,那么还有其他选项,但我不认为您拥有的数据库模式的风格。

这是使我认为关系模型是颈部疼痛的用例之一!

0

我很喜欢添加实体ID和实体类型列以添加灵活性而无需额外的连接。

+0

感谢您的建议,但我觉得这是一个非常肮脏,非OO的方式来构建数据库。您正在失去数据库逻辑来验证实体实际存在。当然,你可以在代码中做到这一点,但从数据库的角度来看,这不是一个非常干净的解决方案。 – 2011-04-19 14:52:05

+0

@Josh M - 你将不得不考虑空间贸易。并非一切都可以完美。这是一种非常OO的做事方式 - 实体是多态的,因为它表示一个表中的许多不同类型。 – skaz 2011-04-19 14:54:13