跳到主要内容

第三范式

第三范式要求什么?​

  • 形式化表述: 对 R 中的任意非平凡函数依赖 A1A2⋯An→B1B2⋯BmA_1A_2\cdots A_n \rightarrow B_1B_2\cdots B_m, 满足下列之一:
    • 属性组 AA 是 R 的超键;
    • 属性组 BB 是某个键的子集;
  • 通俗表述: 关系表必须有一个主键, 且其他列直接依赖于主键, 而不是经其他非主属性传导;
  • 等价说法: 消除非主属性对键的传递依赖;

违反第三范式的例子长什么样?​

Movies(title, year, length, studioName, studioAddr)

主键: (title, year)
依赖: (title, year) -> studioName
studioName -> studioAddr
  • 推导: 由传递规则得到 (title, year) -> studioAddr, 且左边不是超键, studioAddr 也不是键的子集;
  • 后果: 同一制片公司的地址在每部影片下重复;
  • 修法: 把 studioName, studioAddr 拆成单独的关系表;

第三范式与 BCNF 有什么区别?​

  • 3NF: 允许"右边是键的子集"这一例外, 因此能保持函数依赖;
  • BCNF: 取消该例外, 要求每个非平凡依赖的左边都是超键, 见 BCNF;
  • 关系: BCNF 严格强于 3NF, 见 范式概览;

(source: 020-关系数据库设计理论.md §函数范式/§第三范式 (3NF))