database - 复合主键或单主键

标签 database database-design

是使用单个主键更好,还是使用复合主键(通常,它们是一个主键和外键的组合)。我有以下示例:

复合主键示例:

AMeta

--- AMetaId - 主键
--- AMetaText

BMeta

--- BMetaId - 主键
--- AMetaID - 表 AMeta 的外键
--- BMetaText

一个

--- AId - 主键
--- AMetaId - 表 AMeta 的主键和外键
--- AText

B

--- BId - 主键
--- BMetaId - 表 BMeta 的主键外键
--- AId - 表 A 的主键和外键
--- BText


单个主键示例:

AMeta

--- AMetaId - 主键
--- AMetaText

BMeta

--- BMetaId - 主键
--- AMetaId - 表 AMeta 的外键
--- BMetaText

一个

--- AId - 主键
--- AMetaId - 表 AMeta 的外键
--- AText

B

--- BId - 主键
--- BMetaId - 表 BMeta 的外键
--- AId - 表 A 的外键
--- BText

哪种数据库设计更好?

最佳答案

我通常倾向于几乎完全使用单列主键 - 要么有一个好的自然键可用(很少),要么我向表中添加一个代理 INT IDENTITY 键。

我的主要原因是:

  • 主键必须是唯一的,且始终不为空
  • 默认情况下,主键是 SQL Server 中的集群键,它将稳定(不变)、窄(最多 4 字节)和最好不断增加的条件添加到标准列表中
  • 使用单列主键,我的所有外键也很容易使用单列 - 我不喜欢仅仅为了使连接正常工作而必须连接 3、5 甚至更多列上的两个表,这是如果您有复合主键到底会发生什么

关于database - 复合主键或单主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3877325/

相关文章:

database - 为什么我要使用聚合函数对覆盖查询进行索引扫描?

java - 房间数据库 RawQuery() 不适用于 "IN"和 "NOT IN"子句

database - Neo4j 插件损坏还是 Grails 2.4.4?

sql - MySQL 数据类型 : int versus enum

database - 有什么好的方法可以实现与代码库同步的敏捷数据库过程,尤其是在持续集成方面?

mysql - 将 MySQL 查询数据分配给临时变量? VB网络

mysql - 如何使用MySQL查询真子集?

sql - 数据库设计 : third table that relates to both parent and child tables

php - 我应该根据他们在 symfony2 和 mysql 中的角色制作一个或多个用户表

php - 选择和浏览存储在单独表中的类别和子类别