在一个表中有几个外键是一种好习惯吗?

时间:2010-02-19 12:45:44

标签: sql foreign-keys

考虑以下表格结构:

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表,但直觉上这感觉不对。

有什么想法吗?

非常感谢

4 个答案:

答案 0 :(得分:6)

这完全没问题,在实践中很常见。我认为我用过的每个数据库都有这样的表格。

答案 1 :(得分:3)

我想说,是的,这是最佳做法,使用products表中的附加列会阻止您使用多个平台的产品。

您可以考虑哪些字段应属于连接表中的键。如果是每个平台和标题只能有一个发布者,那么publisherID不应该是products_publishers密钥的一部分。

答案 2 :(得分:1)

同意。在许多项目中,我们在某些表中使用2-3个外键。它工作正常,我想不出更好的解决方案可以解决许多关系问题 - 我也没见过。

答案 3 :(得分:1)

这很正常,并称为复合键。我见过的另一个常见策略是给表提供一个主键(代理键),就像所有其他表一样。做的一些原因:

  • 每个的一致数据模型 你的桌子有一个主键
  • 它也使得更容易和更快 在单个键上比较 复合键加入
  • 如果您使用数据模型 ORM,它通常得到更好的支持,使你的代码更易于处理单个密钥而不是多个密钥。

我个人认为两个复合键是可行的,但是一旦你有三个或更多,你应该考虑引入代理键。您选择哪种策略,只需在数据模型中与其保持​​一致即可。