浅谈数据库的范式

wdg - May 6, 2024
  • 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→BCC→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)→CB→C,则C(A,B)部分函数依赖。
    例1:
    销售表(产品id,地区id,价格,产品名),存在关系:(产品id,地区id)→(产品名)(产品id)→(产品名),因此存在部分函数依赖。
    因为码为(产品id,地区id),因此存在非主属性部分函数依赖于码,即产品名只依赖于码的一部分产品id

    例2:
    选课关系表(学号, 姓名, 年龄, 课程名称, 成绩, 学分),存在关系:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)(学号) → (姓名, 年龄)(课程名称) → (学分),因此存在部分函数依赖。 因为码为(学号, 课程名称),因此存在非主属性部分函数依赖于码,即(姓名, 年龄)只依赖于码的一部分学号学分只依赖于码的一部分课程名称

  • 传递函数 Transitive Functional Dependency
    存在A→BB→C,则CA存在传递函数依赖。
    例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→CB→C,则C(A,B)完全函数依赖。

规范化

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