几句话说清楚数据库的基本范式

第一范式 1NF:属性不能再被拆分。

  • 人(身份证号, 姓名, 性别, 联系方式) 不满足 1NF
  • 因为联系方式包含了电话号码、电子邮箱、微信、QQ 等
  • 人(身份证号, 姓名, 性别, 电话号码) 满足 1NF

第二范式 2NF:不存在非主属性对主键的部分函数依赖关系。

  • R(A, B, C, D, E) 的主键是 (A, B),存在函数依赖关系 { A,B → C, B → D, C → E }
  • R 不满足 2NF,因为存在部分函数依赖 B → D
  • 使用手段把 B → D 干掉,变成 { A,B → C, C → E } 就满足了

你可能注意到 C → E,E 居然和主键没有关系,这是可以存在的吗?!答案是在 2NF 中是允许的,2NF 管不到那么宽,它只在乎与主键有关的函数依赖关系。

第三范式 3NF:不存在非主属性对主键的传递函数依赖关系。

  • 在上述例子中,我们已经得到了 { A,B → C, C → E }
  • 但 { A,B → C, C → E } 是不满足 3NF 的
  • 因为存在 A,B → C → E,即 E 对主键有传递函数依赖
  • 使用手段把 C → E 干掉,变成 { A,B → C } 就满足了

BCNF:非主属性依赖的对象一定是主键,且不能是部分函数依赖

个人感觉 BCNF 不是一二三范式那样一路升级来的,按照定义来讲,其实 BCNF 只需要基于 第一范式。但是,你也可以在第三范式的基础上再满足 BCNF 以此来提高数据库的规范化。

  • 2NF 不关心与主键无关的函数依赖关系
  • 而 BCNF 关心所有的函数依赖关系
  • 它要求所有函数依赖关系的箭头左侧一定是主键
  • { A,B → C, C → E } 满足 2NF 但不满足 BCNF
  • 除非改为 { A,B → C, A,B → E }

因此 BCNF 更像是 2NF 的升级版,它不仅禁止部分函数依赖,而且还要求所有函数依赖都满足这个关系。


如有错误,请指正!

纯纯是大学生为了准备考试罢了!

猜你喜欢

转载自blog.csdn.net/m0_64140451/article/details/131050368