- 1NF 无重复的域,即数据库表的每一列都是不可分割的原子数据项,而不能是集合、数组、记录等非原子数据项 。即为二维表。
- 2NF 消除非主属性对码的部分函数依赖
- 3NF 消除非主属性对码的传递函数依赖
- BCNF 消除主属性对码的部分和传递函数依赖
- 4NF 消除非平凡且非函数依赖的多值依赖
- 5NF 不能存在多个候选码
名词解释
-
候选码 Candidate Key
能唯一确定这一条记录的属性集合,一个关系可能存在多个候选码。
确保所有非主属性跟候选码存在函数关系的最小属性集合,选择候选码时先不处理范式。
例1
属性集U={A, B, C, D, E, G}
,函数依赖集F={A→BC, C→D, E→G}
。 则候选码为AE,因为通过AE根据已有的函数依赖集F即可跟其他属性B、C、D、E构成函数关系。
根据A→BC
,则A→B
,则AE→B
。
根据A→BC
,则A→C
,则AE→C
。
根据A→BC
,C→D
,则A→C
,则A→D
,则AE→D
。
根据AE→AE
,则AE→E
。
如:
U={学号, 专业, 学院, 学院地址, 手机号, 手机号归属地}
F={学号→(专业,学院), 学院→学院地址, 手机号→手机号归属地}
候选码为(学号, 手机号)
例2
属性集U={A, B, C, D, E, G}
,函数依赖集F={A→B, A→C, A→D, A→E}
,则候选码为A。 -
码 Key
能唯一标识一条记录的属性集合。又称键。 -
主码 Primary Key
候选码中选择,一个关系中只有一个主码。又称主关键字、主键。 -
主属性 Primary Attribute
包含在任一个候选码中的属性为主属性。其余为非主属性。 -
部分函数依赖 Partial Functional Dependency
存在(A,B)→C
、B→C
,则C
对(A,B)
部分函数依赖。
例1:
销售表(产品id,地区id,价格,产品名)
,存在关系:(产品id,地区id)→(产品名)
、(产品id)→(产品名)
,因此存在部分函数依赖。
因为码为(产品id,地区id)
,因此存在非主属性部分函数依赖于码,即产品名
只依赖于码的一部分产品id
。例2:
选课关系表(学号, 姓名, 年龄, 课程名称, 成绩, 学分)
,存在关系:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
、(学号) → (姓名, 年龄)
、(课程名称) → (学分)
,因此存在部分函数依赖。 因为码为(学号, 课程名称)
,因此存在非主属性部分函数依赖于码,即(姓名, 年龄)
只依赖于码的一部分学号
、学分
只依赖于码的一部分课程名称
。 -
传递函数 Transitive Functional Dependency
存在A→B
、B→C
,则C
对A
存在传递函数依赖。
例1:
病历表(病历号, 姓名, 性别)
,存在关系:(病历号)→(姓名)
、(姓名)→(性别)
,则性别
对病历号
存在传递函数依赖。
因为码为病历号
,则存在非主属性对码存在传递函数依赖。 -
BCNF
例1:
仓库管理关系表(仓库ID,存储物品ID,管理员ID,数量)
,且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。存在关系:(仓库ID,存储物品ID)→(管理员ID,数量)
、(管理员ID,存储物品ID)→(仓库ID,数量)
,因此(仓库ID,存储物品ID)
和(管理员ID,存储物品ID)
都是候选码,表中的非主属性为数量
,符合3NF。
同时存在关系:(仓库ID)→(管理员ID)
、(管理员ID)→(仓库ID)
,因此存在主属性对码的部分函数依赖,即管理员ID
部分函数依赖于(仓库ID,存储物品ID)
、仓库ID
部分函数依赖于(管理员ID,存储物品ID)
,因此不符合BCNF。 -
多值依赖 Multivalued Dependency
(StudentID, CourseID) →→ RoomNumber
同一个学生可能会在不同的时间、不同的教室上同一门课程的不同部分,即一门课程可能在多个教室进行。 -
平凡的(trivial)函数依赖
如果Y⊆X
,则称X→Y
这个函数依赖是平凡的。 -
关系
R (U, F)
U={ Sno, Sna, Cno, G }
F={ (Sno,Cno)→ G, Sno → Sna }
-
完全函数依赖 Full Functional Dependency
即非部分函数依赖。对于(A,B)→C
,同时不存在A→C
、B→C
,则C
对(A,B)
完全函数依赖。
规范化
规范化过程,是通过投影分解运算,把低一级范式的关系模式“分离”为若干个高一级范式的关系模式。但这种投影分解不是唯一的,要求分解“既保持函数依赖”,又具有“无损连接性”。