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。