我有一些innoDbs与外键的其他表的主键只有2 INT列。
例如,一个表是user_items,它有2列,用户id,的itemId,外国键的用户和项目表,如果更新或删除设置为级联。
我应该在第三列添加到这些表,并使它成为一个主键,或者是更好它是现在的样子,在性能方面或任何其他好处?
我有一些innoDbs与外键的其他表的主键只有2 INT列。
例如,一个表是user_items,它有2列,用户id,的itemId,外国键的用户和项目表,如果更新或删除设置为级联。
我应该在第三列添加到这些表,并使它成为一个主键,或者是更好它是现在的样子,在性能方面或任何其他好处?
增加第三ID栏只是用于添加ID列起见没有意义的。 事实上,它只是增加了处理开销(索引维护)当您插入或删除行。
主键是不一定是“ID列”。
如果只允许用户与项目之间关联的单个(用户不能两次分配相同的项目),那么它确实是有意义的定义(userid, itemid)
作为你的表的主键。
如果您允许同一对出现不止一次那么你当然不需要那么约束。
你已经有一个自然键{userId, itemId}
除非有特殊原因,添加另一个(代理)键,只需使用现有的密钥作为主。
一些原因替代可能包括:
我不认为任何适用于你的情况。
另外,请注意, InnoDB表聚集 ,并在聚集表次级指标均优于基于堆的表辅助索引更加昂贵。 所以,理想情况下,你应该避免二级指标时,您可以。
在一般情况下,如果它没有任何实际的复杂性你写的代码和表应该包含100,000-500,000行或更少,我建议你添加主键。 我有时也建议增加created_at
和updated_at
列。
是的,他们需要更多的存储 - 但它是最小的。 另外还有一个问题是,主键索引将不得不维护等插入和更新,如果表变大可能会比较慢。 但是,除非该表是大(100点的数千或数百万行),这将可能使处理速度没有差别。
所以,除非该表将是相当大的,在空间和处理速度的影响是微不足道的 - 所以你就需要多少精力来维护它,它提供的潜在效用的决定。 如果需要非常少的额外代码来执行,那么实际上它提供的任何实用程序可能使它值得。
其中一个有一个主键的最佳理由是给行基于它们插入的顺序上的自然顺序 。 如果你想找回过去的100(或前100)加行,如果你有在桌子上一个自动增加的主键是非常简单和快速。
添加inserted_at
和updated_at
列可以在获取基础上的日期范围数据方面提供类似的工具。 同样,除非行的数量将是非常大的,它可能是值得评估这些为好。