数据库的基本概念
- 实体:
在数据库中往往是一个数据表。 - 属性:
在关系数据库中,属性可以看作是“表的一列”。 - 元组:
表中的一行就是一个元组。 - 分量:
即元组的某个属性值。在一个关系数据库中,属性是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。 - 候选码和主码:
表中可以唯一确定一个元组的某个属性(或者属性组)叫候选码,我们从许多个候选码中挑一个就叫主码。 - 全码:
如果一个码包含了所有的属性,这个码就是全码。 - 主属性:
一个属性只要在任何一个候选码中出现过,这个属性就是主属性。 - 非主属性/非键属性/非码属性:
与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。 - 外码:
一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。
函数依赖
函数依赖的定义
设R(U)是一个属性集U上的一个关系模式,X和Y是U的子集。若对于R(U)的任意两个可能的具体关系r1、r2,若r1[x]等于r2[x]则r1[y]等于r2[y],或者若r1[x] != r2[x]则r1[y] != r2[y],称X决定Y,或者Y函数依赖于X,记作X→Y。即像函数一样,给一个确定的输入(属性集X),有一个确定的输出(属性集Y)。
抽象的“关系模式”和具体存在的“关系”,下文统称“关系”。下面是几种函数依赖的定义:
- 如果X→Y,但Y为X的子集, 则称X→Y是平凡函数依赖。
举例:
关系R(Sno, Cno),依赖关系(Sno, Cno)→Sno,(Sno, Cno)→Cno都是平凡函数依赖。 - 如果X→Y,但Y不为X的子集,则称X→Y是非平凡的函数依赖。
举例:
关系R(Sno, Cno, Grade),依赖关系(Sno, Cno)→Grade是非平凡函数依赖。 - 如果X→Y,存在X的真子集X1,使得X1→Y,则称Y部分依赖于X。也就是Y依赖于部分的X。
举例:
学生表(学号, 姓名, 性别, 班级, 年龄),(学号, 姓名)→性别,学号→性别,所以(学号, 姓名)→性别是部分函数依赖。
如果X→Y,但任何X的真子集X1都不存在X1→Y则称Y完全依赖于X。
举例:
成绩表(学号, 课程号, 成绩),(学号, 课程号)→成绩,学号!→成绩,课程号!→成绩,所以(学号, 课程号)→成绩是完全函数依赖。 - 如果X→Y,Y→Z,X⊄Y,Y!→X,(X∪Y)∩Z=∅,则称Z传递依赖于X。
举例:
关系S(学号, 系名, 系主任),学号→系名,系名→系主任,系名!→学号,所以学号→系主任为传递函数依赖。
函数依赖与属性的关系
设R(U)是属性集U上的关系模式,X、Y是U的子集。
如果X和Y之间是一对一(1:1)关系,如学校和校长,则存在函数依赖X→Y和Y→X。
如果X和Y之间是一对多(1:n)关系,如年龄和姓名,则存在函数依赖Y→X。
如果X和Y之间是多对多(m:n)关系,如学生和课程,则X和Y之间不存在函数依赖。
六种范式
第一范式(1NF)
非码的非平凡 | ↓ 消除非主属性对码的部分函数依赖
第二范式(2NF)
↓ 消除非主属性对码的传递函数依赖
第三范式(3NF)
↓ 消除主属性对码的部分和传递函数依赖
BC范式(BCNF)
↓ 消除非平凡且非函数依赖的多值依赖
第四范式(4NF)
↓消除不是由候选码所蕴含的连接依赖
第五范式(5NF)
第一范式(1NF)
定义: 每个单元格必须是单一值,无重复组或数组,确保数据原子性。
示例:
未规范化表格:
学生ID | 学生姓名 | 课程和成绩 |
---|---|---|
S1 | Alice | 数学:A, 科学:B |
S2 | Bob | 历史:C, 数学:A |
- 主键: 无(未规范化,无明确主键)
- 候选键: 无
- 非键属性: 未规范化,无明确非键
- 外键: 无
- 列依赖关系:
- 学生ID → 学生姓名
- (学生ID, 课程) → 成绩(隐含,需拆分)
规范化后(1NF):
学生ID | 学生姓名 | 课程 | 成绩 |
---|---|---|---|
S1 | Alice | 数学 | A |
S1 | Alice | 科学 | B |
S2 | Bob | 历史 | C |
S2 | Bob | 数学 | A |
- 主键: (学生ID, 课程)
- 候选键: (学生ID, 课程)
- 非键属性: 学生姓名, 成绩
- 外键: 无
- 列依赖关系:
- 学生ID → 学生姓名
- (学生ID, 课程) → 成绩
第二范式(2NF)
定义: 在1NF基础上,消除非主属性对主键的部分函数依赖。
示例:
修改前(1NF):
学生ID | 学生姓名 | 课程 | 成绩 |
---|---|---|---|
S1 | Alice | 数学 | A |
S1 | Alice | 科学 | B |
S2 | Bob | 历史 | C |
S2 | Bob | 数学 | A |
- 主键: (学生ID, 课程)
- 候选键: (学生ID, 课程)
- 非键属性: 学生姓名, 成绩
- 外键: 无
- 列依赖关系:
- 学生ID → 学生姓名
- (学生ID, 课程) → 成绩
学生姓名只依赖学生ID,违反2NF。规范化后:
学生表:
学生ID | 学生姓名 |
---|---|
S1 | Alice |
S2 | Bob |
- 主键: 学生ID
- 候选键: 学生ID
- 非键属性: 学生姓名
- 外键: 无
- 列依赖关系:
- 学生ID → 学生姓名
注册表:
学生ID | 课程 | 成绩 |
---|---|---|
S1 | 数学 | A |
S1 | 科学 | B |
S2 | 历史 | C |
S2 | 数学 | A |
- 主键: (学生ID, 课程)
- 候选键: (学生ID, 课程)
- 非键属性: 成绩
- 外键: 学生ID 引用 学生表
- 列依赖关系:
- (学生ID, 课程) → 成绩
第三范式(3NF)
定义: 在2NF基础上,消除非主属性的传递函数依赖。
示例:
修改前(2NF):
课程代码 | 课程名称 | 部门名称 | 部门负责人 |
---|---|---|---|
C1 | 数学 | 数学系 | 教授X |
C2 | 科学 | 科学系 | 教授Y |
C3 | 历史 | 历史系 | 教授Z |
- 主键: 课程代码
- 候选键: 课程代码
- 非键属性: 课程名称 , 部门名称 , 部门负责人
- 外键: 无
- 列依赖关系:
- 课程代码 → 课程名称
- 课程代码 → 部门名称
- 部门名称 → 部门负责人
部门负责人通过部门名称间接依赖课程代码,违反3NF。规范化后:
部门表:
部门名称 | 部门负责人 |
---|---|
数学系 | 教授X |
科学系 | 教授Y |
历史系 | 教授Z |
- 主键: 部门名称
- 候选键: 部门名称
- 非键属性: 部门负责人
- 外键: 无
- 列依赖关系:
- 部门名称 → 部门负责人
课程表:
课程代码 | 课程名称 | 部门名称 |
---|---|---|
C1 | 数学 | 数学系 |
C2 | 科学 | 科学系 |
C3 | 历史 | 历史系 |
- 主键: 课程代码
- 候选键: 课程代码
- 非键属性: 课程名称, 部门名称
- 外键: 部门名称 引用 部门表
- 列依赖关系:
- 课程代码 → 课程名称
- 课程代码 → 部门名称
巴斯-科德范式(BCNF)
定义: 在3NF基础上,消除主属性对主键的部分函数依赖和传递函数依赖
示例:
修改前(3NF):
学员编号 | 课程代码 | 授课教室 |
---|---|---|
S001 | C101 | R201 |
S002 | C101 | R201 |
S003 | C102 | R202 |
- 主键: (学员编号, 课程代码)
- 候选键: (学员编号, 课程代码)
- 非键属性: 授课教室
- 外键: 无
- 列依赖关系:
- (学员编号, 课程代码) → 授课教室
- 课程代码 → 授课教室
授课教室依赖 课程代码(非主键),违反BCNF。规范化后:
课程表:
学员编号 | 课程代码 |
---|---|
S001 | C101 |
S002 | C101 |
S003 | C102 |
课程教室表:
课程代码 | 授课教室 |
---|---|
C101 | R201 |
C102 | R202 |
第四范式(4NF)
定义: 在BCNF基础上,消除非平凡多值依赖,多值属性独立。
示例:
- 不满足4NF:
学生 课程 社团 S1 数学 棋社 S1 科学 网球 S2 历史 棋社 - 主键: 学生
- 候选键: 学生
- 非键属性: 课程, 社团
- 外键: 无
- 列依赖关系:
- 学生→ 课程
- 学生→ 社团
- 多值依赖。
- 满足4NF:
- 学生-课程表:
学生 课程 S1 数学 S1 科学 S2 历史 - 学生-社团表:
学生 社团 S1 棋社 S1 网球 S2 棋社
- 学生-课程表:
- 解释:课程和社团独立,拆分表消除多值依赖。
第五范式(5NF)
定义: 在4NF基础上,消除非平凡连接依赖,确保无信息丢失。
示例:
- 复杂场景,如供应商-零件-项目关系,需确保分解后可完整重建。
- 示例较复杂,通常涉及三元关系,实际应用少见。
规范化路线
第一范式(1NF)
非码的非平凡 | ↓ 消除非主属性对码的部分函数依赖
第二范式(2NF)
↓ 消除非主属性对码的传递函数依赖
第三范式(3NF)
↓ 消除主属性对码的部分和传递函数依赖
BC范式(BCNF)
↓ 消除非平凡且非函数依赖的多值依赖
第四范式(4NF)
↓消除不是由候选码所蕴含的连接依赖
第五范式(5NF)
实践建议
研究表明,通常3NF即可,5NF较少使用。为效率可保留冗余,权衡性能与规范。
关键引用
- 数据库六种范式详解(1NF/2NF/3NF/BCNF/4NF/5NF)
- Database Normalization Detailed Guide
- SQL Normalization Best Practices
- Functional Dependencies and Normalization