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产品名称数量
1101张三P1笔记本2
2102李四P2手机1
3101张三P3平板1

上述表格中,客户名称和产品名称依赖于客户ID和产品ID,而不是订单ID,这违反了2NF。

转换为2NF后:

订单表:

订单ID客户ID产品ID数量
1101P12
2102P21
3101P31

客户表:

客户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时间讲师名称
C1T1上午张三
C2T2下午李四
C1T1下午张三

上述表格中,讲师名称依赖于讲师ID,而讲师ID依赖于课程ID和时间,这违反了BCNF。

转换为BCNF后:

课程表:

课程ID讲师ID时间
C1T1上午
C2T2下午
C1T1下午

讲师表:

讲师ID讲师名称
T1张三
T2李四

这样,每个主属性都完全依赖于候选键,满足了BCNF。