编辑
我刚刚开始在轨道上学习ruby,在敏捷开朗的书中,务实地有一行:
除非每个表都有数字主键,否则Rails实际上不会很好.对列的名称不那么吝啬.
当我学习学说时,我读到的那种线条.
EDIT2
请检查这个链接.我越来越困惑这个事情:—
Composite primary keys versus unique object ID field
从以上链接: –
*主键应该是恒定和无意义的;非代理键通常会失败一个或两个要求,最终
如果密钥不是恒定的,您将有一个可能会变得相当复杂的未来更新问题
如果关键是没有意义的,那么它更有可能改变,即不是恒定的;往上看
拿一个简单的常见例子:一个库存项目表.将项目编号(sku号,条形码,部件代码或其他)作为主键可能很诱人,但是一年后,所有的项目编号都会更改,而且您会留下一个非常混乱的更新 – 数据库问题…
编辑:还有一个比哲学更实际的问题.在许多情况下,您将要找到一个特定的行,然后更新它或再次找到(或两者).使用复合键,有更多的数据可以跟踪WHERE子句中的更多和更多的约束,用于重新查找或更新(或删除).同时有可能其中一个关键细分可能发生变化!使用代理键,总是只保留一个值(代理ID),并且根据定义,它不能改变,这样可以显着简化情况.
解决方法
大多数人使用代理主键作为自动生成int,因为它隔离主键以免需要更改,就像您将PK设为用户名,稍后更改其法定名称.您将必须更新PK和所有FK列以反映新名称.如果您使用代理主键,则只需在一个位置更新用户的名称(因为表中的表不是加入名称).
主键的大小很重要,因为PK被复制到您在表上构建的每个索引中.如果PK很大(像一个字符串),索引中的每个页面的键数就会减少,索引将会占用更多的缓存来存储它. Ints很小
拥有自动递增int PK可以很好地将其作为一个聚簇索引,因为按照这个顺序存储行,并且不需要返回并且不能排除插入新行的行,所以总是添加到表的结尾.