Mysql:范式

发布时间 2023-05-31 11:23:08作者: 爱编程DE文兄

概念

范式,指的是数据库表和字段设计,要遵循的规范。

范式类型

范式分为:第一范式,第二范式,第三范式,巴斯范式,第四范式,第五范式

越往后范式越高,数据库结构设计冗余度,合理性越好。但是实际大部分开发中,用的最多还是第二范式和第三范式

基本名词

image

超键:可以理解为【候选键】或 【候选键 + 其他字段】或 【非唯一字段 + 非唯一字段】,只要字段组成能构成唯一标识的,就是超键
候选键:具有唯一标识的【最小组成字段】。比如用户表的【用户编码】、【身份证】,成绩表的【学号 + 课程号】都是
主键:主键是从超键中确定下来要当做该行数据的唯一标识的键。比如用户表,可以用【用户编码】或【用户编码 + 年龄】作为主键

第一范式

  1. 字段必须具有原子性。以用户表为例:
    反例:
用户编码 姓名 职业
001 张三 男法师

正例:

用户编码 姓名 职业 性别
001 张三 法师

第二范式

  1. 所有非主键字段,必须完全依赖于主键,不能只依赖主键的一部分。这个可能有点官方,说简单点,一行数据非主键字段,都可以通过主键来找到它。

以成绩表为例子,有(学号,课程号,成绩)。
反例:
以【学号】或者【课程号】作为主键,是找不到学生哪门课程唯一的成绩的

正例:
以【学号 + 课程号】作为主键,是可以找到哪个学生哪门课程的具体成绩

第三范式

  1. 其他非主键字段,必须直接依赖主键,不能依赖其他非主键字段。可能说得有点懵,还是以员工表和部门表举例。

反例:
员工表:(员工编码,员工姓名,部门编码,部门名称)
部门表:(部门编码,部门名称,部门简介)

错在部门名称不应该出现在员工表里

正例:
员工表:(员工编码,员工姓名,部门编码)
部门表:(部门编码,部门名称,部门简介)

注:虽然反例不符合第三范式,但实际开发中为了性能而经常这样做的