数据库中表的设计规范
表的结构
列:由多个字段构成,每个字段存储单一数据项,列的先后顺序对表没有影响
行:记录,一个表中不能存在完全相同的两行,行的顺序对表没有影响
主键:primary key 表中的一列或多列组合起来唯一的标识表中的一条记录
主键的选取:
- 业务(逻辑)主键:选择使用业务中有实际意义的一个字段做主键,比如身份证号码,手机号...
- 代理主键:使用一个无意义的数值: 自增长的数值, UUID(通用唯一识别码)
外键:foreign key 用于连接另外一张表,(通常)是连接表中的主键或唯一键
外键约束:数据的一致性
关系范式:一套约束、确保多个表结构的设计符合关系模型
- 1NF:每一列都是不可再分的原子数据项,即表中的每个字段都是不可分割的基本数据项,不能包含多个值。
当数据为1对多时,可以提取为另外一个表,嵌入原表中
不符合1NF:
用户表
user_id | user_name | phone_numbers
1 | Alice | 1234567890, 0987654321
符合1NF:
用户表
user_id | user_name
1 | Alice用户电话表
user_id | phone_number
1 | 1234567890
1 | 0987654321
- 2NF:主键依赖,非主键字段必须完全依赖于主键字段,不能部分依赖于主键。否则要提取出另外的表
不符合2NF:
订单表
order_id | product_id | product_name | quantity
1 | 101 | Product A | 2
1 | 102 | Product B | 3在这个表中,product_name 只依赖于 product_id,而不是整个主键 (order_id, product_id)
符合2NF:
订单表
order_id | product_id | quantity
1 | 101 | 2
1 | 102 | 3产品表
product_id | product_name
101 | Product A
102 | Product B
- 3NF:表中的非主键字段不能存在传递依赖关系,即非主键字段之间不能存在依赖关系。当非键之间有依赖时,可以提取为另外的表
不符合3NF:
学生表
student_id | student_name | department_name | department_head
1 | Alice | Computer Sci | Dr. Smith
符合3NF:
学生表
student_id | student_name | department_id
1 | Alice | 1部门表
department_id | department_name | department_head
1 | Computer Sci | Dr. Smith
意义
- 减少冗余(一些数据只存一次,而非存储多次)
- 保证数据完整性、一致性
- 简化数据维护
- 提高查询效率(当不符合范式时效率更高,则会由反范式的操作)