- 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)完全函数依赖。
规范化
规范化过程,是通过投影分解运算,把低一级范式的关系模式“分离”为若干个高一级范式的关系模式。但这种投影分解不是唯一的,要求分解“既保持函数依赖”,又具有“无损连接性”。