多对多链接表设计:只有两个外键还是一个额外的主键?

Tom*_*Lee 6 sql database database-design data-modeling

这无疑是一个新手问题,但我一直未能找到满意的答案.在为多对多关系创建链接表时,最好是创建唯一的id还是仅使用相应表的两个外键(复合键?).

以Northwind数据库的不同图表为例,我发现了两个"版本".即:带有fkProductID和fkOrderID的OrderDetails表以及添加了OrderDetailsID的版本.

有什么不同?(它还取决于数据库引擎吗?).SQL(或Linq)的优点/缺点是什么?

提前感谢您的解释.

汤姆

OMG*_*ies 9

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

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

乍一看,它使删除或更新一个特定的顺序/等容易-直到你意识到你需要知道的值适用的ID 第一.如果您必须根据订单细节搜索该id值,那么您最好直接在第一时间使用这些标准.

但复合键很复杂......

在此示例中,主键约束将确保两列(fkProductID和fkOrderID)将是唯一的并且已编制索引(如果聚簇索引尚不存在,这些天大多数DB会自动索引主键)使用最佳索引对于表.

单独的主键方法意味着OrderDetailsID使用表的最佳索引编制索引(SQL Server和MySQL将它们称为聚簇索引,对Oracle而言,它们都只是索引),并且需要额外的复合唯一约束/索引.某些数据库可能需要超出唯一约束的额外索引...因此,这会使数据模型更复杂,更复杂,并且没有任何好处:

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

结论

我没有看到单个列主键相对于复合主键的好处.更多的工作需要额外的开销,没有净利益......


TcK*_*cKs 3

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