建表规范
-- Normal Format, NF
- 每个表保存一个实体信息
- 每个具有一个ID字段作为主键
- ID主键 + 原子表
-- 1NF, 第一范式
字段不能再分,就满足第一范式。
-- 2NF, 第二范式
满足第一范式的前提下,不能出现部分依赖。
消除复合主键就可以避免部分依赖。增加单列关键字。
-- 3NF, 第三范式
满足第二范式的前提下,不能出现传递依赖。
某个字段依赖于主键,而有其他字段依赖于该字段。这就是传递依赖。
将一个实体信息的数据放在一个表内实现。
示例
1.第一范式 (1NF)
假设我们有一个学生表,包含学生 ID、姓名、地址、电话号码。
学生ID | 姓名 | 地址 | 电话号码 |
---|---|---|---|
1 | 张三 | 北京 | 123456 |
2 | 李四 | 上海 | 654321 |
这个表已经满足第一范式,因为每个字段都是不可再分的原子性值。
2.第二范式 (2NF)
假设我们有一个学生课程表,包含学生 ID、课程 ID、成绩。
学生ID | 课程ID | 成绩 |
---|---|---|
1 | 101 | 90 |
1 | 102 | 85 |
2 | 101 | 92 |
2 | 103 | 88 |
这个表满足第一范式,但存在部分依赖问题。因为学生 ID 和课程 ID 联合构成了主键,但成绩只依赖于这个联合主键的一部分 - 课程 ID。
为了满足第二范式,我们需要将这个表拆分为两个表:
学生表:
学生ID | 姓名 |
---|---|
1 | 张三 |
2 | 李四 |
课程成绩表:
学生ID | 课程ID | 成绩 |
---|---|---|
1 | 101 | 90 |
1 | 102 | 85 |
2 | 101 | 92 |
2 | 103 | 88 |
3.第三范式 (3NF)
假设我们有一个学生表,包含学生 ID、姓名、专业 ID、专业名称。
学生ID | 姓名 | 专业ID | 专业名称 |
---|---|---|---|
1 | 张三 | 1 | 计算机 |
2 | 李四 | 2 | 经济学 |
这个表满足第二范式,但存在传递依赖问题。因为专业名称依赖于专业 ID,而专业 ID 又依赖于学生 ID。
为了满足第三范式,我们需要将这个表拆分为两个表:
学生表:
学生ID | 姓名 | 专业ID |
---|---|---|
1 | 张三 | 1 |
2 | 李四 | 2 |
专业表:
专业ID | 专业名称 |
---|---|
1 | 计算机 |
2 | 经济学 |
通过以上示例,我们可以看到,随着范式的提高,表结构越来越细化,但数据冗余度也越来越低,满足了数据库设计的规范性和效率。