假设您有多个可以分别附带一个或多个注释的“事物”。产品和订单,例如。应如何进行表结构....多用表的数据库设计
- 产品,订单,评论,ProductComment {产品ID,CommentID},{OrderComment订单ID,CommentID}
- 产品,订单,ProductComment {产品ID,文字},OrderComment {订单ID,文字}
- 产品,订单,评论{产品ID,订单ID,文字}
使用SQL Server 2008,顺便说一句。
想法,意见?
假设您有多个可以分别附带一个或多个注释的“事物”。产品和订单,例如。应如何进行表结构....多用表的数据库设计
使用SQL Server 2008,顺便说一句。
想法,意见?
肯定只能使用一个评价表,这样你就不必重复评论信息(例如时间戳,flagged_for_moderation等)。评论中有两个字段很好,因为它明确表示它是一对多的链接。我可能会倾向于通过多个链接表,尽管我很欣赏链接表中只有行在链接表中,而有一半的值是NULL
。也许在一个非常大的数据库中有更多的东西可以被评论,你可以去链接表。
同意重复方面。我喜欢链接表,除了我不喜欢额外的步骤去评论表。 – 2010-11-12 05:20:35
是的,链接表确实会让你的查询更加复杂。使用多个列代替也意味着如果你得到所有的评论,你可以告诉他们什么样的评论,而不做任何JOIN,并且如果你使用URL(或其他参考)中的ID,你可以直接链接到正在评论的项目。 – theazureshadow 2010-11-12 05:25:18
我喜欢链接表的另一个原因是,您可以根据需要添加其他字段。也许ProductComment表格也有一些与产品\评论组合相关的字段。 – 2010-11-12 05:30:54
我认为Order/Product
表应该保持原样。
的Comments
表可以
CommentID
EntityID
EntityType
Comment
凡EntityType
会再告诉你到EntityID
属于(ProductID/OrderID
)
谢谢。我没有列出这个选项的原因是因为这打破了外键。我真的不想检查EntityType来确定要查找哪个表来获取实体。 – 2010-11-12 05:04:55
这具有限制,您不能在支持它们的数据库中使用显式外键(例如,InnoDB),这意味着你不能真正使用像CASCADE这样的功能。我很欣赏它减少了必要的表的数量,在很多情况下这是很好的,但这并不是普遍值得的。 – theazureshadow 2010-11-12 05:05:07
@Josh不错,打我吧:) – theazureshadow 2010-11-12 05:05:31
如果你不喜欢entityID
,entityType
方法,因为你不能使用外键约束,你可以采取混合策略,像
COMMENT(commentID, comment, productID, orderID, ....)
与...的作为每个可评论表的附加列。
这也许可以工作,但是旁观者的答案是它通常是如何完成的。 – SingleNegationElimination 2010-11-12 05:37:12
这是我的选项#3。不知道我是否喜欢它......我倾向于选项1. – 2010-11-12 05:38:52
@TokenMacGuy我认为,旁观者的回答比我列出的3个选项差。 – 2010-11-12 05:39:54
如果你使用链接表,并且有超过2或3个可以链接到评论的“类型”,那么就开始考虑生成的代码来创建所需的所有SQL。你将很快有一个101连接表和大量的表定义SQL来维护。
如果您对所有ID使用GUIDS并且不介意没有在数据库中定义外键,那么还有其他选项,但我不认为您拥有的数据库模式的风格。
这是使我认为关系模型是颈部疼痛的用例之一!
我很喜欢添加实体ID和实体类型列以添加灵活性而无需额外的连接。
感谢您的建议,但我觉得这是一个非常肮脏,非OO的方式来构建数据库。您正在失去数据库逻辑来验证实体实际存在。当然,你可以在代码中做到这一点,但从数据库的角度来看,这不是一个非常干净的解决方案。 – 2011-04-19 14:52:05
@Josh M - 你将不得不考虑空间贸易。并非一切都可以完美。这是一种非常OO的做事方式 - 实体是多态的,因为它表示一个表中的许多不同类型。 – skaz 2011-04-19 14:54:13
看看** [类似的问题/答案](http://stackoverflow.com/questions/4050784/defining-multiple-foreign-keys-in-one-table-to-many-tables/4051523 #4051523)**。 – 2010-11-12 12:17:57