前言:数据库系统原理的基本内容。
1. 第一范式1NF
数据项不可分,强调原子性。
如下图不为第一范式:
而下图为第一范式:
公司名称 | 地址 | 商品名称 | 商品数量 | 电话 |
---|---|---|---|---|
刘晨 | 19 |
2. 第二范式2NF
若某关系R属于第一范式,且每一个非主属性完全依赖于任何一个候选码,则关系R属于第二范式。
以下是一个符合第二范式的示例表格:
学生ID (主键) | 学生姓名 | 课程ID (主键) | 课程名称 | 成绩 |
---|---|---|---|---|
1 | 小明 | 101 | 数学 | 85 |
2 | 小红 | 102 | 英语 | 78 |
3 | 小华 | 101 | 数学 | 90 |
在上面的表格中,每个非主属性(例如课程名称和成绩)都完全依赖于整个主键(学生ID和课程ID),不存在部分依赖性。
接下来是一个不符合第二范式的示例表格:
订单号 (主键) | 顾客姓名 | 产品名称 | 产品价格 |
---|---|---|---|
1 | 张三 | 手机 | 3000元 |
2 | 李四 | 手机 | 3000元 |
3 | 王五 | 电视 | 5000元 |
在上面的表格中,产品价格只依赖于产品名称,而不是整个主键(订单号和产品名称)。这样的设计存在部分依赖性,不符合第二范式。为了符合第二范式,可以将产品价格移至另一个表格,确保每个非主属性完全依赖于候选键。
3. 第三范式3NF
一个表在第三范式下,任何非主属性必须完全依赖于主属性,而不能依赖于其它非主属性。
下面是一个符合第三范式的表格示例:
学生ID (Primary Key) | 姓名 | 年龄 | 班级 (Foreign Key) |
---|---|---|---|
1 | 小明 | 18 | 1 |
2 | 小红 | 17 | 2 |
3 | 小华 | 18 | 1 |
在上面的示例中,每个学生的姓名和年龄直接依赖于学生ID,班级信息直接依赖于班级ID,不存在非主属性依赖于其他非主属性的情况,因此符合第三范式。
现在来看一个不符合第三范式的表格示例:
订单号 (Primary Key) | 产品名称 | 客户ID (Foreign Key) | 客户姓名 | 客户地址 |
---|---|---|---|---|
1 | 商品A | 101 | 张三 | 北京市 |
2 | 商品B | 102 | 李四 | 上海市 |
3 | 商品C | 101 | 张三 | 北京市 |
在上面的示例中,客户姓名和客户地址这两个属性依赖于客户ID,而不是直接依赖于订单号。这样就存在了非主属性(客户姓名和客户地址)依赖于其他非主属性(客户ID)的情况,因此不符合第三范式。
4. BC范式BCNF
在BC范式中,一个表中的每个非主属性都必须完全依赖于候选键,而不是依赖于其他主属性。
以下是一个符合BC范式的表格:
订单号 (主键) | 顾客ID (候选键) | 产品ID (候选键) | 产品名称 | 顾客姓名 |
---|---|---|---|---|
1 | 101 | 201 | 手机 | 张三 |
2 | 102 | 202 | 电视 | 李四 |
3 | 103 | 201 | 手机 | 王五 |
在上面的表格中,每个非主属性(例如产品名称和顾客姓名)都完全依赖于整个候选键(顾客ID和产品ID),不存在部分依赖性或传递依赖性。
接下来是一个不符合BC范式的示例表格:
学生ID (主键) | 学生姓名 | 课程ID (候选键) | 课程名称 | 成绩 |
---|---|---|---|---|
1 | 小明 | 101 | 数学 | 85 |
2 | 小红 | 102 | 英语 | 78 |
3 | 小华 | 101 | 数学 | 90 |
在上面的表格中,成绩是一个非主属性,它仅依赖于课程ID,而不是整个候选键(学生ID和课程ID)。这样的设计存在部分依赖性,不符合BC范式。为了符合BC范式,可以将成绩移到另一个表格中,并通过外键与原始表格关联,确保每个非主属性完全依赖于候选键。
5. 第四范式4NF
在第四范式中,一个表中的多值依赖被视为不合规范的,需要进行规范化处理,以确保每个非主属性完全依赖于候选键。
以下是一个符合第四范式的示例表格:
学生ID (主键) | 学生姓名 | 课程ID (主键) | 课程名称 | 成绩 |
---|---|---|---|---|
1 | 小明 | 101 | 数学 | 85 |
1 | 小明 | 102 | 英语 | 78 |
2 | 小红 | 101 | 数学 | 90 |
3 | 小华 | 101 | 数学 | 88 |
在上面的表格中,每个非主属性都完全依赖于整个主键,而且不存在多值依赖。
接下来是一个不符合第四范式的示例表格:
订单号 (主键) | 顾客姓名 | 产品名称 | 产品颜色 |
---|---|---|---|
1 | 张三 | 手机 | 黑色, 白色 |
2 | 李四 | 电视 | 彩色 |
3 | 王五 | 电脑 | 灰色, 白色 |
在上面的表格中,产品颜色是一个多值属性,它依赖于产品名称,而不是整个主键(订单号和产品名称)。这样的设计存在多值依赖,不符合第四范式。为了符合第四范式,可以将产品颜色移至另一个表格,并通过外键与原始表格关联,确保每个非主属性完全依赖于候选键。
6. 第五范式5NF
在第五范式中,一个表中的每个非主属性都必须完全依赖于候选键,而且没有任何连接依赖性或多值依赖性。
以下是一个符合第五范式的示例表格:
顾客ID (主键) | 产品ID (主键) |
---|---|
101 | 201 |
102 | 202 |
103 | 201 |
在上面的表格中,每个非主属性(顾客ID和产品ID)都完全依赖于整个候选键(顾客ID和产品ID),不存在连接依赖性或多值依赖性。
接下来是一个不符合第五范式的示例表格:
订单号 (主键) | 顾客姓名 | 产品名称 | 产品颜色 |
---|---|---|---|
1 | 张三 | 手机 | 黑色, 白色 |
2 | 李四 | 电视 | 彩色 |
3 | 王五 | 电脑 | 灰色, 白色 |
在上面的表格中,产品颜色是一个多值属性,它存在多值依赖性,不符合第五范式。为了符合第五范式,可以将产品颜色移到另一个表格中,并通过外键与原始表格关联,确保每个非主属性完全依赖于候选键,且没有任何连接依赖性或多值依赖性。
7.总结
- 第一范式 (1NF):
- 目标:确保每个单元格中只包含一个值,消除重复的数据。
- 特点:表中的每个字段都是不可再分的原子值。
- 第二范式 (2NF):
- 目标:消除部分函数依赖,确保表中的每个非主属性完全依赖于候选键。
- 特点:所有非主属性都完全依赖于候选键,没有部分函数依赖。
- 第三范式 (3NF):
- 目标:消除传递依赖,确保表中的每个非主属性都不传递依赖于其他非主属性。
- 特点:每个非主属性只依赖于候选键,而不是依赖于其他非主属性。
- 巴斯-科德范式 (BCNF):
- 目标:消除主属性对候选键的部分依赖,确保表中的每个主属性都不部分依赖于候选键。
- 特点:表中的每个主属性都必须是超键,即候选键的超集。
- 第四范式 (4NF):
- 目标:消除多值依赖,确保表中的每个非主属性都不对候选键的任何一部分产生依赖。
- 特点:表中的每个非主属性都不应该对候选键的任何一部分产生依赖。
- 第五范式 (5NF):
- 目标:消除连接依赖性和多值依赖性,确保表中的每个非主属性都完全依赖于候选键。
- 特点:表中的每个非主属性都必须完全依赖于候选键,而且没有任何连接依赖性或多值依赖性。