数据库主键风格

主键类型

所有数据库表必须具有一个主键列。 主键唯一地标识表中的一行,因此它受到以下约束的约束:

  • 独特
  • 非空
  • 不可变的

选择主键时,我们必须考虑以下方面:

  • 主键可用于通过外键关系连接其他表
  • 主键通常具有关联的默认索引,因此数据类型越紧凑,索引将占用的空间越少
  • 一个简单的键比一个复合键的性能更好
  • 即使在高度并发的环境中,主键分配也必须确保唯一性

选择主键生成器策略时,选项为:

  1. 自然键,使用保证单个行唯一性的列组合
  2. 替代键,独立于当前行数据生成

自然键

自然钥匙的唯一性受外部因素(例如,人的唯一标识符,社会保险号,车辆识别号)的影响。

自然键很方便,因为它们具有与外界等效的功能,并且不需要任何额外的数据库处理。 因此,即使在将实际行插入数据库之前,我们也可以知道主键,从而简化了批量插入操作。

如果自然键是单个数字值,则性能可与替代键的性能相媲美。

对于复合键,我们必须意识到可能的性能损失:

  • 复合键联接比单键联接慢
  • 复合键索引比单键索引需要更多空间

对于索引和连接,非数字键的效率低于数字键(整数,bigint)。 CHAR(17)自然密钥(例如,车辆识别号)占用17个字节,而不是4个字节(32位整数)或8个字节(64位bigint)。

最初的模式设计唯一性假设可能不会永远成立。 假设我们使用了一个特定的国家/地区公民数字代码来标识所有应用程序用户。 如果现在我们需要支持其他没有此类公民数字代码或现有条目相互冲突的国家,那么我们可以得出结论,架构的发展可能受到阻碍。

如果自然键唯一性约束发生变化,将很难同时更新主键(如果我们仍然设法删除了主键约束)和所有关联的外键关系。

代理键

代理键是独立于当前行数据而生成的,因此其他列约束可以根据应用程序业务需求自由发展。

数据库系统可以管理代理密钥的生成,并且密钥通常是数字类型(例如,整数或bigint),每当需要新密钥时就递增。

如果我们想控制代理密钥的生成,我们可以使用128位GUIDUUID 。 由于不再需要额外的数据库密钥生成处理,因此简化了批处理并可以提高插入性能。 即使未广泛采用此策略,在设计数据库模型时也值得考虑

当数据库标识符生成责任落在数据库系统上时,有几种策略可以自动增加代理键:

数据库引擎 自动递增策略
甲骨文 序列
微软SQL 身份 顺序
PostgreSQL的 序列串行类型
的MySQL 自动递增
DB2 身份 顺序
数据库 身份 顺序

设计方面

翻译自: https://www.javacodegeeks.com/2014/06/database-primary-key-flavors.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值