数据库的设计范式都包括哪些

  1. 1NF(第一范式)
  2. 2NF(第二范式)
  3. 3NF(第三范式)、
  4. BCNF(巴斯 - 科德范式)
  5. 4NF(第四范式)
  6. 5NF(第五范式,又叫做完美范式)。

数据库的范式设计越高阶,冗余度就越低,同时高阶的范式一定符合低阶范式的要求,比如满足 2NF 的一定满足 1NF,满足 3NF 的一定满足 2NF,依次类推。

数据表中的那些键

  1. 超键:能唯一标识元组的属性集叫做超键。
  2. 候选键:如果超键不包括多余的属性,那么这个超键就是候选键。
  3. 主键:用户可以从候选键中选择一个作为主键。
  4. 外键:如果数据表 R1 中的某属性集不是 R1 的主键,而是另一个数据表 R2 的主键,那么这个属性集就是数据表 R1 的外键。
  5. 主属性:包含在任一候选键中的属性称为主属性。
  6. 非主属性:与主属性相对,指的是不包含在任何一个候选键中的属性。

通常,我们也将候选键称之为“码”,把主键也称为“主码”。因为键可能是由多个属性组成的,针对单个属性,我们还可以用主属性和非主属性来进行区分。

从 1NF 到 3NF

  • 1NF 指的是数据库表中的任何属性都是原子性的,不可再分
  • 2NF 指的数据表里的非主属性都要和这个数据表的候选键有完全依赖关系
    • 所谓完全依赖不同于部分依赖,也就是不能仅依赖候选键的一部分属性,而必须依赖全部属性。
  • 3NF 在满足 2NF 的同时,对任何非主属性都不传递依赖于候选键
    • 也就是说不能存在非主属性 A 依赖于非主属性 B,非主属性 B 依赖于候选键的情况。

对于非主属性来说,非完全依赖候选键将产生:

  1. 数据冗余
  2. 插入异常
  3. 删除异常
  4. 更新异常

增删改都异常, 数据还冗余.

总结

有一点需要注意的是,这些范式只是提出了设计的标准,实际上设计数据表时,未必要符合这些原则。一方面是因为这些范式本身存在一些问题,可能会带来插入,更新,删除等的异常情况(这些会在下一讲举例说明),另一方面,它们也可能降低会查询的效率。这是为什么呢?因为范式等级越高,设计出来的数据表就越多,进行数据查询的时候就可能需要关联多张表,从而影响查询效率。

image.png