3.4 数据库范式
数据库范式是一系列用于规范化数据库结构的规则,旨在减少数据冗余,提高数据一致性。下面通过具体示例来讲解各个范式。
3.4.1 第一范式(1NF)
第一范式要求表中的每一列都应包含不可分割的原子值。
示例:
假设有一个学生表,记录了学生的课程信息,未满足1NF的表如下:
学生ID | 姓名 | 课程 |
---|---|---|
1 | 张三 | 数学, 英语 |
2 | 李四 | 物理, 化学, 生物 |
上述表格中,课程字段包含了多个值,这违反了1NF。
转换为1NF后:
学生ID | 姓名 | 课程 |
---|---|---|
1 | 张三 | 数学 |
1 | 张三 | 英语 |
2 | 李四 | 物理 |
2 | 李四 | 化学 |
2 | 李四 | 生物 |
这样,每个字段都是不可分割的原子值,满足了1NF。
3.4.2 第二范式(2NF)
第二范式要求表必须满足1NF,并且表中的每个非主属性完全依赖于主键。
示例:
假设有一个订单表,记录了订单信息,未满足2NF的表如下:
订单ID | 客户ID | 客户名称 | 产品ID | 产品名称 | 数量 |
---|---|---|---|---|---|
1 | 101 | 张三 | P1 | 笔记本 | 2 |
2 | 102 | 李四 | P2 | 手机 | 1 |
3 | 101 | 张三 | P3 | 平板 | 1 |
上述表格中,客户名称和产品名称依赖于客户ID和产品ID,而不是订单ID,这违反了2NF。
转换为2NF后:
订单表:
订单ID | 客户ID | 产品ID | 数量 |
---|---|---|---|
1 | 101 | P1 | 2 |
2 | 102 | P2 | 1 |
3 | 101 | P3 | 1 |
客户表:
客户ID | 客户名称 |
---|---|
101 | 张三 |
102 | 李四 |
产品表:
产品ID | 产品名称 |
---|---|
P1 | 笔记本 |
P2 | 手机 |
P3 | 平板 |
这样,每个非主属性都完全依赖于主键,满足了2NF。
3.4.3 第三范式(3NF)
第三范式要求表必须满足2NF,并且每个非主属性不传递依赖于主键。
示例:
假设有一个员工表,记录了员工的信息,未满足3NF的表如下:
员工ID | 姓名 | 部门ID | 部门名称 |
---|---|---|---|
1 | 张三 | D1 | 财务部 |
2 | 李四 | D2 | 人事部 |
3 | 王五 | D1 | 财务部 |
上述表格中,部门名称依赖于部门ID,而部门ID依赖于员工ID,这违反了3NF。
转换为3NF后:
员工表:
员工ID | 姓名 | 部门ID |
---|---|---|
1 | 张三 | D1 |
2 | 李四 | D2 |
3 | 王五 | D1 |
部门表:
部门ID | 部门名称 |
---|---|
D1 | 财务部 |
D2 | 人事部 |
这样,每个非主属性都不传递依赖于主键,满足了3NF。
3.4.4 BC范式(BCNF)
BC范式是3NF的加强版,要求每个主属性完全依赖于候选键。
示例:
假设有一个课程表,记录了课程的讲师和时间,未满足BCNF的表如下:
课程ID | 讲师ID | 时间 | 讲师名称 |
---|---|---|---|
C1 | T1 | 上午 | 张三 |
C2 | T2 | 下午 | 李四 |
C1 | T1 | 下午 | 张三 |
上述表格中,讲师名称依赖于讲师ID,而讲师ID依赖于课程ID和时间,这违反了BCNF。
转换为BCNF后:
课程表:
课程ID | 讲师ID | 时间 |
---|---|---|
C1 | T1 | 上午 |
C2 | T2 | 下午 |
C1 | T1 | 下午 |
讲师表:
讲师ID | 讲师名称 |
---|---|
T1 | 张三 |
T2 | 李四 |
这样,每个主属性都完全依赖于候选键,满足了BCNF。