数据库设计三范式

数据库设计三范式

数据库设计范式的概念

数据库表的设计依据,如何进行表的设计。

数据库设计范式共有三个

  • 第一范式:要求任何一张表必须有主主键,每一个字段原子性不可再分。
  • 第二范式:建立在第一范式的基础之上,要求所有的非主键字段完全依赖主键,不要产生部分依赖。
  • 第三范式:建立在第二范式的基础之上,要求所有的非主键字段直接依赖主键,不要产生传递依赖。
    (声明:三范式很重要,所有一定要熟记在心!)

设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费

第一范式:最核心,最重要的范式,所有表的设计都需要满足。必须有主键,并且每一个字段都是原子性不可再分。
第二范式:建立在第一范式的基础之上,要求所有的非主键字段必须完全依赖主键,不要产生部分依赖。
一对一,外键唯一!!!!!!
例如
下面这张表描述了学生和老师的关系(一个学生可能有多个老师,一个老师可能有多个学生,典型的多对多关系):

学生编号 学生姓名 教师编号 教师姓名
1001 张三 001 王老师
1002 李四 002 张老师
1003 王五 001 王老师
1001 张三 002 张老师

以上表不满足第一范式,无主键,

学生编号 教师编号 学生姓名 教师姓名
1001 001 张三 王老师
1002 002 李四 张老师
1003 001 王五 王老师
1001 002 张三 张老师
  • 以上表经过修改之后,将学生编号和教师编号联合做主键,复合主键,则满足第一范式,但还是不满足第二范式,“张三”依赖于1001,王老师依赖于001。显然产生了部分依赖。

产生部分依赖的缺点:数据冗余,造成空间浪费。(张三重复了,王老师重复了)

为了让以上的表满足第二范式,需要这样设计:

使用三张表来表示多对多的关系!!!!
学生表(学生编号为主键)

学生编号 学生姓名
1001 张三
1002 李四
1003 王五

教师表(教师编号为主键)

教师编号 教师姓名
001 王老师
002 张老师

学生教师关系表

id(主键) 学生编号(外键) 教师编号(外键)
1 1001 001
2 1002 002
3 1003 001
4 1001 002

背口诀:
多对多的设计:
多对多,三张表,关系表两个外键!!!!!!

第三范式:
第三范式建立在第二范式的基础之上,要求所有的非主键字段必须直接依赖主键,不要产生传递依赖。

学生编号(主键) 学生姓名 班级编号 班级名称
1001 张三 01 一年级一班
1002 李四 02 一年级二班
1003 王五 03 一年级三班
1004 赵六 03 一年级三班

以上表满足第一范式,有主键。也满足第二范式,因为主键不是复合主键,没有产生部分依赖,主键是单一主键。不满足第三范式,第三范式要求不产生传递依赖,一年级一班依赖01,01依赖1001,产生了传递依赖,不符合第三范式的要求,产生了数据的冗余。
设计一对多关系表:
班级表(一):

班级编号(主键) 班级姓名
01 一年级一班
02 一年级二班
03 一年级三班

学生表(多):

学生编号(主键) 学生姓名 班级编号(外键)
1001 张三 01
1002 李四 02
1003 王五 03
1004 赵六 03

背口诀:
一对多,两张表,多额表家外键!!!!!!!!!
总结:

数据库设计三范式是理论上的。 最终的目的都是为了满足客户的需求,有的时候回拿数据冗余换执行速度。 因为在SQL当中,表和表之间连接次数越多,效率越低。 有的时候可能会存在数据冗余,但是为了减少表的连接次数,这样做也是合理的,并且对于开发人员来说,SQL语句的编写难度也会降低。

你可能感兴趣的:(MySQL,mysql)