考虑以下表格结构:
titles(titleID*, titleName)
platforms(platformID*, platformName)
products(platformID*, titleID*, releaseDate)
publishers(publisherID*, publisherName)
developers(developerID*, developerName)
products_publishers(platformID*, titleID*,publisherID*)
products_developers(platformID*, titleID*, developerID*)
products表是一个使用platformID和titleID的两个外键的joiner表。这是因为某些标题在不同平台上具有相同的属性。为了避免重复数据,我创建了连接表。
我在创建products_publishers表时遇到了问题。因为一个产品可以有多个发布者,所以我必须创建一个由三个外键构成的joiner表。这是最佳做法吗?我的场景可以让我创建一个包含四个这样的条目的表。我考虑使用一列来将这些数据存储在products表中,并放弃了joiner表和publisher表,但直觉上这感觉不对。
有什么想法吗?
非常感谢
答案 0 :(得分:6)
这完全没问题,在实践中很常见。我认为我用过的每个数据库都有这样的表格。
答案 1 :(得分:3)
我想说,是的,这是最佳做法,使用products表中的附加列会阻止您使用多个平台的产品。
您可以考虑哪些字段应属于连接表中的键。如果是每个平台和标题只能有一个发布者,那么publisherID不应该是products_publishers密钥的一部分。
答案 2 :(得分:1)
同意。在许多项目中,我们在某些表中使用2-3个外键。它工作正常,我想不出更好的解决方案可以解决许多关系问题 - 我也没见过。
答案 3 :(得分:1)
这很正常,并称为复合键。我见过的另一个常见策略是给表提供一个主键(代理键),就像所有其他表一样。做的一些原因:
我个人认为两个复合键是可行的,但是一旦你有三个或更多,你应该考虑引入代理键。您选择哪种策略,只需在数据模型中与其保持一致即可。