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)
上的主键保证是唯一的(假设你引用的表中的col1
和col2
值是唯一的), (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。 这就是大多数人在链接表上依次递增主键的原因。