数据库 - PrimaryKey (主键)

创建时间:
2016-03-03 11:34
最近更新:
2018-10-05 21:38

逻辑主键与业务主键

  1. 对逻辑主键、业务主键和复合主键的思考
  2. Hibernate 中几种常用的主键生成策略
  3. 业务主键 versus 逻辑主键,到底哪个好

方案一: 单主键+复合唯一索引 versus 方案二: 复合主键

Brief

  • 复合主键 指 表的主键由一个以上的字段组成。
  • 别名: 单主键、单列主键、复合主键、联合主键、组合主键。
  • 如果 单列主键 就能唯一标识每条记录,那么可以用 单列主键。例如 学生表 中 学号 是唯一的 不会有重复,即可用作 单列主键。
  • 如果 需要几个字段合起来才能确定数据的唯一性,这时用 复合主键。例如 如班级表 中 需要 年级和班号 才能确定这个班级在学校的唯一性,这时就用 复合主键,例如 2013级1班。

Best Practice

  1. 二者查询效率区别不大 (前提是索引相同,运用得当)。
  2. 二者写性能上有区别,复合主键 要使用更多的 block 去创建索引 因而写操作性能有损失。
  3. 复合主键 被引用为外键时,数据库 与 代码 都会变复杂。如果未引用,只是 "末端" 表,用 复合主键 也无所谓。
  4. 引用 该主键 的子表,方案一 只需 1 列,方案二 需要所有列。方案一 更简单。子表是否需要冗余字段,完全可以根据实际的查询需要来选择,如果经常要在 组成复合主键的那些字段 上做查询,可以考虑子表增加这些冗余字段。
  5. 如果业务中有很多 where UserId=? and UserType=?,那么 联合主键 比较合适,同时也要注意索引的顺序匹配问题。

方案一 适用场景

  • 在一个表中 UserId 和 UserType 两个字段唯一确定一条记录。
  • 角色-用户关联表,只有 RoleId, UserId 两个字段,也应该增加一个逻辑主键字段。