跳至主要內容

范式设计

张威大约 3 分钟mysqlmysql基础

范式设计

范式设计好处

  1. 主要是为了减少数据冗余
  2. 如果冗余太多,那么数据插入、删除、更新的时候,要对多条记录的同样的数据进行更新删除,可能会产生问题

第一范式(1NF)

满足第一范式才被称为关系型数据库。每一列保持原子特性,不能再分割。

则设计成一对多的实体关系。例如地址字段,可以再细分为省,市,区等不可再分割(即原子特性)的字段

第二范式(2NF)

主要针对联合主键,

则设计成一对多的实体关系。

例如:选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),(学号,课程名称)是联合主键,但是学分字段只和课程名称有关,和学号无关,相当于只依赖联合主键的其中一个字段,不符合第二范式。

表1
学号 姓名 年龄 成绩 课程id
表2
课程id 课程名称 学分
image-20240407090807653
image-20240407090807653

第三范式(3NF)

属性不依赖于其它非主属性

示例:学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),学号是主键,但是学院电话只依赖于所在学院,并不依赖于主键学号,因此该设计不符合第三范式,应该把学院专门设计成一张表,学生表和学院表,两个是一对多的关系。

image-20240407084815669
image-20240407084815669

BC范式(BCNF)

每个表只有一个候选键(除了主键,其他键是可以重复存储的)

候选键:在一个数据库中每行的值都不相同,则可称为候选键

示例:在上面第三范式的noNF表,中可以看出,每一个员工的email都是唯一的(不可能两个人用同一个email),则此表不符合BC范式,拆成一对一

image-20240407085829027
image-20240407085829027

第四范式(4NF)

消除表中的多值依赖

也就是说可以减少维护数据一致性的工作。比上图的noNF表中的skill技能这个字段,有的人是“java,mysql”,有的人描述的是“Java,MySQL”,这样数据就不一致了,解决办法就是将多值属性放入一个新表,所以满足第四范式的关系图如下:

image-20240407090151306
image-20240407090151306
image-20240407090705269
image-20240407090705269

不满足的范式的表怎么办

视情况拆分成一对一、一对多、多对多的关系