【发布时间】:2011-01-12 12:19:55
【问题描述】:
在阅读此问题的评论后出现此问题:
当你创建一个多对多表时,你应该在两个外键列上创建一个复合主键,还是创建一个自增代理“ID”主键,然后在你的两个外键列上放置索引(也许是一个独特的约束)?在每种情况下插入新记录/重新索引对性能有何影响?
基本上是这样的:
PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)
对比这个:
PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
评论者说:
将这两个 ID 设为 PK 意味着 表在磁盘上物理排序 以该顺序。所以如果我们插入 (Part1/Device1), (Part1/Device2), (第 2 部分/设备 3),然后(第 1 部分/设备 3) 数据库将不得不打破 分开表并插入最后一个 在条目 2 和 3 之间。对于许多 记录,这变得非常有问题 因为它涉及洗牌数百, 数千或数百万条记录 每次添加一个。相比之下, 一个自动递增的 PK 允许新的 记录要附加到最后。
我问的原因是因为我一直倾向于使用没有代理自动增量列的复合主键,但我不确定代理键是否实际上更具性能。
【问题讨论】:
-
这是在 SO 上发布的一个类似问题:stackoverflow.com/questions/344068/…
-
(试图将此添加到我之前的评论中但不能)根据插入的数量,您还可以定期重建索引以确保它快速返回结果。在 SQL Server 中,您还可以调整索引的 FILLFACTOR 以在必须移动数据之前为插入提供足够的空间。
-
这个问题的答案不取决于使用的 DBMS 吗?我怀疑 MySQL 在这种情况下会以某种方式运行,SQL-Server 会以另一种方式运行等等。
-
警告:如果没有特定的数据库标签,这里所说的大部分内容都是可疑的。不同的引擎工作方式不同!
标签: sql primary-key many-to-many