MYSQL-设计表
一.范式
数据库的范式是⼀组规则。在设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数 据库,这些不同的规范要求被称为不同的范式。 关系数据库有六种范式:第⼀范式(1NF)、第⼆范式(2NF)、第三范式(3NF)、巴斯-科德 范式(BCNF)、第四范式(4NF)和第五范式(5NF,⼜称完美范式),越⾼的范式数据库冗余越 ⼩。然⽽,普遍认为范式越⾼虽然对数据关系有更好的约束性,但也可能导致数据库IO更繁忙,因此 在实际应⽤中,数据库设计通常只需满⾜第三范式即可。
数据库IO繁忙:表建的越多越繁忙
1.第一范式
定义:数据库表的每⼀列都是不可分割的原⼦数据项,⽽不能是集合,数组,对象等⾮原⼦数据。
就是说,表里的每一个数据都不能继续拆分
反例:比如说制作一张学校信息的表,里面包含学生名,性别,电话号码,班级名称,学院;但是学院能分出来学院地址,电话,名字等,所以此表不为第一范式
所以当我们将学校具体信息填在表内,是否满足第一范式? 答案是肯定的,不过会产生数据冗余
所以我们可得在 关系型数据库中,每⼀列都可以⽤基本数据类型表⽰,就天然满⾜第⼀范式
2.第二范式
定义:在满⾜第⼀范式的基础上,不存在⾮关键字段对任意候选键的部分函数依赖。存在于表中定义了复合主键的情况下
⾮关键字段:相当于非主键
任意候选键:相当于主键
复合主键:一个表只能有一个主键,但是一个主键能定义多个列,定义多个列的就是复合主键
部分函数依赖:只依赖于表中的部分字段生成,和其他字段没有关系
反例:
主键为学号和课程名
如图所示:学分只与课程相关
成绩只与学号和课程相关,
学生信息只与学号相关
也就是说学分不依赖于学号,只依赖课程名
而学生信息不依赖于课程名,只依赖于学号
这即为部分函数依赖
正例:
将有依赖关系的列单独放表,通过id来传递
由于学生信息只与学号相关,所以定义在学生表
学分只与课程名相关,所以定义课程表
成绩与学号和课程id相关,所以用复合主键定义出成绩表
解决部分函数依赖,可以通过为每个复合主键定义单独表,
再对需要多个复合主键的进行建表
不满⾜第⼆范式时可能出现的问题
1.数据冗余
在提取想要得到的信息时,有其余重复信息,其余重复信息称为冗余信息
2.更新异常
更新可能会更新错误,因为要更新很多条数据,比如要将mysql的学分改为50,可能漏掉王五的学分,导致数据不一致,引发数据不安全等问题
3.插入异常
如果需要重新插入一门新的课程,则课程必须要有成绩才能填入,不能提前填入
4.删除数据
如果只想删除毕业学生成绩,会连带吧课程和课程对应的学分删除
3.第三范式
定义:在满⾜第⼆范式的基础上,不存在⾮关键字段,对任⼀候选键的传递依赖
非关键字段:非主键
任一候选键:主键
反例:
如图,当一个表存在两种强相关的关系,这种关系称为传递依赖