我有一些innoDbs只有2个int列,它们是其他表主键的外键。
例如,一个表是user_items,它有2列,userId,itemId,用户和项目表的外键,如果更新或删除,则设置为级联。
我应该在这些表中添加第3列并将其作为主键,还是在性能或任何其他好处方面,它现在的方式更好?
答案 0 :(得分:6)
仅仅为了添加ID列而添加第三个ID列是没有意义的。实际上,当您插入或删除行时,它只会增加处理开销(索引维护)。
主键不一定是“ID列”。
如果您只允许在用户和项目之间关联一个(用户不能两次分配相同的项目),那么将(userid, itemid)
定义为表的主键是有意义的。
如果你允许同一对出现不止一次,那么你当然不需要那个约束。
答案 1 :(得分:2)
您已拥有自然键{userId, itemId}
。除非有特定原因要添加另一个(代理)密钥,否则只需将现有密钥用作主密钥。
代理人的一些原因可能包括:
我认为这不适用于您的情况。
另外,请注意InnoDB tables are clustered和群集表中的二级索引比基于堆的表中的二级索引更昂贵。理想情况下,你应该尽可能避免使用二级索引。
答案 2 :(得分:0)
一般情况下,如果它没有为您正在编写的代码添加真正的复杂性,并且该表预计包含100,000-500,000行或更少,我建议添加主键。我有时也建议添加created_at
和updated_at
列。
是的,它们需要更多存储 - 但它是最小的。还存在必须维护主键索引的问题,因此如果表变大,插入和更新可能会更慢。但除非表格很大(100或数千或数百行),否则处理速度可能没有差别。
因此,除非表格非常大,否则对空间和处理速度的影响微不足道 - 因此您需要决定维护它所需的工作量以及它提供的潜在效用。如果只需要很少的额外代码,那么它提供的几乎任何实用程序都可能使它值得。
拥有主键的最佳理由之一是根据插入的顺序为行提供自然顺序。如果您想要检索添加的最后100行(或前100行),如果您在表上有自动增量主键,则非常简单快速。
添加inserted_at
和updated_at
列可以在根据日期范围提取数据方面提供类似的效用。同样,除非行数非常大,否则也值得对它们进行评估。