如果一个数据库有属性A1, A2, A3…a and A1, A2 &A3可以一起组成组合键,使用代理键代替组合键是否更好?
使用代理键将提高记录的插入执行速度(这支持代理键而不是复合键),但是SELECT, UPDATE和DELETE查询基于属性A1, A2 &A3将大大减慢如果我们使用代理键(这支持复合键代替代理键)。在这种情况下,哪个在性能方面更好?代理键还是组合键?
在几乎所有的测试中,代理键与自然键相比几乎没有性能优势。自然键还具有更容易使用的优点。
性能是不是选择是否实现代理主键的主要关注点。
我们发现理想的主键有几个理想的属性
- simple(单列,原生数据类型)
- 唯一(肯定没有重复值)
- 非空(每一行都有一个值)
- 不可变(一旦赋值,永远不会更改)
- anonymous(不携带"information")
没有"规则"规定选择作为主键的候选键必须具有所有这些属性,但是出于各种原因,这些属性是需要的。
甚至没有"规则"说所有的表都需要有一个主键。但我们认为他们这样做是可取的。
成功的软件系统已经使用替代键以及自然键构建。
就性能而言,实际上并没有那么大的差异可以证明。但是请考虑一下:如果一个实体表有一个主键是由几个"大"列组成的组合键,那么这些相同的大列必须在任何一个有外键引用的表中重复,并且在一些存储引擎(InnoDB)中,这些列在每个索引中重复。 但是性能并不是真正的决定因素。(任何认为性能应该是选择候选键作为主键的决定性因素的人都没有真正考虑到这一点。)
就"更容易使用"而言,许多开发人员发现使用单列作为主键比使用由两列、三列或更多列组成的组合键更容易。
一些选择了自然键作为主键的开发人员后来因为选择了一个候选键而被烧毁。不是因为它是一个自然的键,而是因为在进一步的开发中,"新"需求被"发现",并且结果证明他们选择的作为主键的候选键并不总是唯一的,或者它不能免于更改,或者它不是真正的匿名的。
有许多软件项目已经成功地使用了自然键和组合键作为主键。就像使用代理键作为主键一样成功。