SQL – 多对多表主键

在阅读这个问题的评论之后,出现这个问题:

数据库devise

当你创build一个多对多的表时,你应该在两个外键列上创build一个复合主键,还是创build一个自动增量代理“ID”主键,然后在你的两个FK列上放上索引一个独特的约束)? 在每种情况下插入新logging/重新索引对性能有什么影响?

基本上这个:

PartDevice ---------- PartID (PK/FK) DeviceID (PK/FK) 

与此相比:

 PartDevice ---------- ID (PK/auto-increment) PartID (FK) DeviceID (FK) 

评论者说:

使两个ID为PK意味着该表按物理顺序在磁盘上进行物理sorting。 因此,如果我们插入(Part1 / Device1),(Part1 / Device2),(Part2 / Device3),则(Part 1 / Device3)数据库将不得不拆分表并插入条目2和3之间的最后一个。许多logging,这变得非常成问题,因为每次添加数百条,数千条或数百万条logging时都会涉及到这些logging。 相比之下,自动增量PK允许将新logging添加到最后。

我问的原因是因为我一直倾向于做没有代理自动增量列复合主键,但我不知道是否代理键实际上是更高性能。

通过简单的双列多对多映射,我没有看到有代理键的真正优势。 (col1,col2)上的主键保证是唯一的(假设你引用的表中的col1col2值是唯一的), (col2,col1)上的一个单独的索引将会捕获到相反顺序执行速度更快的情况。 代理是浪费空间。

由于表只能用于将两个引用的表连接在一起,所以不需要在各个列上使用索引。

在我看来,你提到的这个问题的评论是不值得它使用的电子。 这听起来像作者认为表格存储在一个数组,而不是一个非常高的性能平衡的多路树结构。

首先,没有必要存储或获取sorting的 ,只是索引。 索引不会被顺序存储 ,而是以高效的方式存储,以便能够快速检索。

另外,绝大多数数据库表的读取次数比写入的次数多得多。 这使得你在select方面做的任何事情都比插入方面的任何事情都要重要得多。

链接表不需要代理键。

(col1,col2)上的一个PK和(col2,col1)上的另一个唯一索引就是您所需要的

除非你使用不能应付和指定你的数据库devise的ORM …

编辑:我在这里回答同样的: SQL:你需要一个自动增量主键为许多表吗?

如果引用表,则可能需要增量主键。 多对多表中可能有细节需要使用增量主键从另一个表中拉出。

例如

 PartDevice ---------- ID (PK/auto-increment) PartID (FK) DeviceID (FK) Other Details 

使用PartDevice.ID作为FK很容易拉动“其他细节”。 因此需要使用增量主键。

我可以回答你的问题的最短和最直接的方式是说,如果你连接的两个表没有连续的主键,将会有性能的影响。 正如您所述/引用的,链接表的索引将变成分段,或者如果链接表没有自己的顺序主键,DBMS将更难以插入logging。 这就是大多数人在链接表上依次递增主键的原因。