创建映射表时,我发现人们不使用主键,而其他人则使用它们。有它有什么好处与没有它提供。
请记住,我正在考虑一个简单的映射表,它有两个数值,可以映射回另一个表中的代理键。
实施例
Cars
id - 1
name - Honda
Car_Parts
id - 3
name - Hood
Cars_Parts_Mapping
cars_id - 1
car_parts - 3
答案 0 :(得分:3)
(升级评论回答)
始终使用主键。在这种情况下,您的主键是(cars_id,car_parts)
。两个世界中最好的:和主键,没有额外的列。但是,很多人创建带有自动递增整数主键的额外列的原因是因为他们懒得构建一个基于2个字段而不是1个字段来操作行的接口。
PRIMARY KEY
表格需要InnoDB
:如果你没有定义一个,那么引擎只会create a hidden one for you:
如果没有为表定义PRIMARY KEY,MySQL会找到第一个UNIQUE索引,其中所有键列都是NOT NULL,而InnoDB将它用作聚簇索引。
如果表没有PRIMARY KEY或合适的UNIQUE索引,InnoDB会在包含行ID值的合成列内部生成隐藏聚簇索引。行按InnoDB分配给此类表中的行的ID排序。行ID是一个6字节的字段,随着新行的插入而单调增加。因此,按行ID排序的行在物理上按插入顺序排列。
在这些类型的表上定义第二个索引以便能够 快速搜索car_parts
并不常见(现在它只能对{{1}上的搜索做出很好的响应}),通过创建反向索引:car_id
。这意味着INDEX(car_parts,car_id)
中的性能很小,但是如果你INSERT
更多,那么你操纵数据(通常就是这种情况),这可以通过更快SELECT
来证明。
答案 1 :(得分:0)
尽可能尝试使用主键。它们通常是JOIN
反对最快的,并且保证是唯一的。
作为最后的手段,应该链接到主键之外的其他内容。