【问题标题】:Many-to-many link table design : two foreign keys only or an additional primary key?多对多链接表设计:只有两个外键还是一个附加主键?
【发布时间】:2011-04-15 08:23:09
【问题描述】:

这无疑是一个新手问题,但我一直无法 找到满意的答案。 在为多对多关系创建链接表时,是否最好 创建一个唯一的 id 或只使用各个表的两个外键(复合键?)。

例如,查看 Northwind 数据库的不同图表,我遇到过 两个“版本”。 即:带有 fkProductID 和 fkOrderID 以及版本的 OrderDetails 表 添加了 OrderDetailsID。

有什么区别? (它是否也取决于数据库引擎?)。 SQL(或 Linq)的优点/缺点是什么?

提前感谢您的解释。

汤姆

【问题讨论】:

  • 这取决于您是否希望多对多在完整的表/实体中扩展... OrderDetails 可以保留产品中的重复信息(价格、SKU、标签),以存档订单详细信息,无论产品的未来变化;实际上将其与产品表/实体解耦。

标签: sql database database-design data-modeling


【解决方案1】:

ORM 一直在强制使用非复合主键来简化查询...

但它使查询更容易......

乍一看,它使删除或更新特定订单/等变得更加容易 - 直到您意识到您需要知道适用的 id 值首先。如果您必须根据订单细节搜索该 id 值,那么您最好直接使用该条件。

但是复合键很复杂...

在此示例中,主键约束将确保两列——fkProductID 和 fkOrderID——将是唯一的并被索引(如果聚集索引尚不存在,大多数 DB 会自动索引主键)使用表的最佳索引。

单独的主键方法意味着OrderDetailsID 使用表的最佳索引进行索引(SQL Server 和 MySQL 将它们称为聚集索引,对于 Oracle,它们都只是索引),并且需要额外的复合唯一约束/指数。一些数据库可能需要超出唯一约束的额外索引......所以这使得数据模型更加复杂/复杂,并且没有任何好处:

  • 某些数据库(如 MySQL)对可用于索引的空间量进行了限制。
  • 主键得到了最理想的索引,但值与表中的数据无关,因此很少使用与主键相关的索引。

结论

我看不出单列主键比复合主键有什么好处。更多的工作需要额外的开销而没有净收益...

【讨论】:

  • 谢谢。很好的解释。这就是我一直在寻找的答案。
【解决方案2】:

我习惯使用 PrimaryKey 列。这是因为主键唯一地标识了记录。 如果您对表关系进行了级联更新设置,则可以在从应用程序发送的“SELECT”和“UPDATE/DELETE”命令之间更改外键的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多