如果数据库具有属性A1,A2,A3 ...... An和A1,A2和A3可以一起形成复合键,那么使用代理键而不是复合键更好吗?
使用代理键将提高记录的插入执行速度(这支持复合键的代理)但是如果我们使用代理键,则基于属性A1,A2和A3的SELECT,UPDATE和DELETE查询将大大减慢(这支持复合密钥超过代理密钥)。
在这样的条件下,哪种性能更好?代理键还是复合键?
在几乎所有测试中,代理键相对于自然键几乎没有性能优势。自然键还具有易于使用的优点。 A better write-up is available here。
性能不是选择是否实现代理主键的主要考虑因素。
我们发现理想的主键有几个理想的属性
没有“规则”表示选择作为主键的候选键必须具有所有这些属性,但由于各种原因,这些属性是可取的。
甚至没有一条“规则”表明所有表都需要有一个主键。但我们发现他们这样做是可取的。
使用代理键和自然键构建了成功的软件系统。
在性能方面,可以证明并没有那么多差异。但请考虑这一点:如果实体表的主键是由几个“大”列组成的复合键,则必须在具有该实体表的外键引用的任何表中重复这些相同的大列,并且在某些存储引擎(InnoDB)中,每个索引都会重复这些内容。
但表现并不是决定因素。 (任何暗示性能应该是选择候选键作为主键的决定因素的人都没有真正考虑过它。)
就“更容易使用”而言,许多开发人员发现使用单个列作为主键与由两个,三个或更多列组成的复合键更容易。
一些选择自然键作为主键的开发人员后来因选择候选键而被烧毁。不是因为它是一个自然的关键,而是因为在开发过程中,“新”的要求被“发现”了,结果发现他们选择作为主键的候选键并不总是唯一的,或者它不是免于被改变,或者它不是真正的匿名。
有许多软件项目使用自然键成功,复合键作为PRIMARY KEY。就像使用代理键作为PRIMARY KEY一样成功。