数据库范式

数据库范式是用于数据库设计的规则,目的是使数据库结构更加合理化,避免数据冗余和数据更新异常。常见的数据库范式有 6 种,分别是:

1NF(第一范式):每一列都是不可分割的基本数据项。
2NF(第二范式):在 1NF 的基础上,任何非主属性必须完全依赖于候选键。也就是说非主属性不能依赖于非候选键。
3NF(第三范式):在 2NF 的基础上,任何非主属性不依赖于其它非主属性。
BCNF(布尔范式):在 3NF 的基础上,任何非主属性不依赖于候选键以外的其它属性。
4NF(第四范式):在 BCNF 的基础上,任何多值依赖必须是候选键的函数依赖。
5NF(第五范式):在 4NF 的基础上,任何连接依赖必须是候选键的函数依赖。

候选键: 是能唯一标识数据记录的属性组合(表中的每个属性或属性集合是否可以唯一标识每条记录)。一个表可以有多个候选键。
候选键的作用是,当表中本来的主键在某些情况下不能使用或需要变更时,可以从候选键中选择一个新的主键,保证数据库结构的完整性。

  1. 确定表中的所有属性,列出每个属性的集合;
  2. 从中找出所有能唯一标识每个数据记录的属性组合;
  3. 该属性组合就是候选键。

非候选键:是指不能唯一标识表中每条记录的数据项。它不是构成候选键的属性集合。细分的话,非候选键具体分为 2 类。(非主属性/主属性)非候选键。非候选键需要与其他属性组合,才可以共同构成候选键,以唯一标识记录。

主属性:构成候选键的属性。主属性指可以标识实体中的一个数据记录的属性。也是一个集合的概念。它可以是单个属性,也可以是多个属性的组合。例如学号是一个主属性,{姓名,班级}是一个由两个属性组成的主属性。

主键:是从多个候选键中选取的一个,用于唯一标识表中的每条记录。一个表只能有一个主键。

以学生表为例(假设不存在同一个班级姓名相同的情况):

学号 姓名 班级 性别 手机号

学号、{姓名,班级},和手机号可以能唯一标识出一条记录,都属于候选键。

姓名、班级、性别不能唯一标识表中每条记录的数据项,属于非候选键。

学号、{姓名,班级},和手机号能唯一标识出一条记录,都属于主属性。,姓名和班级字段属于主属性的一部分。在某些语境下如果强调了拆开了来看,所以拆开后的姓名、班级也都称为主属性。

字段 是否是候选键 是否是主属性
学号 Y Y
姓名 N Y
班级 N Y
性别 N N
手机号 Y Y
{姓名、班级} Y Y

候选键一定是主属性以及它的组合。但是主属性不一定是候选键。