MySQL知识点总结之范式
1.范式概念
数据库设计的范式概念:
设计数据库时,需要遵循的一些规范,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范(即要求越来越高),越高的范式数据库冗余越小。要遵循后边的范式要求,必须先遵循前边的所有范式要求
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
注:BCNF是第三范式的改进版
1.三大范式概念
● 第一范式:
强调列的原子性, 即确保数据库表字段的原子性,数据库表的每一列都是不可分割的原子数据项
● 第二范式:
属性完全依赖于主键. 不能存在仅依赖主关键字一部分的属性;
即在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
● 第三范式:
确保每列都和主键列直接相关, 属性不依赖于其他非主属性.
即在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖),即不能存在”非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键“的情况。
1NF:
比如字段 userInfo: 广东省 10086’ ,依照第一范式必须拆分成 userInfo: 广东省 userTel:10086两个字段。
2NF:
假定选课关系表为student_course(student_no, student_name, age, course_name, grade, credit),主键为(student_no, course_name)。其中学分完全依赖于课程名称,姓名年龄完全依赖学号,不符合第二范式,会导致数据冗余(学生选n门课,姓名年龄有n条记录)、插入异常(插入一门新课,因为没有学号,无法保存新课记录)等问题。
可以拆分成三个表:学生:student(stuent_no, student_name, 年龄);课程:course(course_name, credit);选课关系:student_course_relation(student_no, course_name, grade)。
3NF:
假定学生关系表为Student(student_no, student_name, age, academy_id, academy_telephone),主键为"学号",其中学院id依赖于学号,而学院地点和学院电话依赖于学院id,存在传递依赖,不符合第三范式。
可以把学生关系表分为如下两个表:学生:(student_no, student_name, age, academy_id);学院:(academy_id, academy_telephone)。
2.函数依赖
函数依赖:A–>B,如果B依赖于A,则如果通过A属性(属性组)的值,可以确定唯一B属性的值。
例子(1): 学号–>姓名,即姓名依赖于学号,通过学号可以唯一的确定姓名
例子(2): (学号,课程名称) --> 分数
3.完全函数依赖
完全函数依赖:A–>B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
例如:(学号,课程名称) --> 分数
4.部分函数依赖
部分函数依赖:A–>B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
例如:(学号,课程名称) – > 姓名
5.码、属性、(码)属性组
码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖或者部分依赖,则称这个属性(属性组)为该表的码
例如:1NF中的那个的表中的码为:(学号,课程名称)
通过学号与课程名称可以唯一的确定分数,通过学号与课程名称可以确定唯一的姓名,通过学 号与课程名称可以确定唯一的系名,通过学号与课程名称可以确定唯一的系主任
主属性:码属性组中的所有属性
非主属性:除过码属性组的属性
6.1NF
7.2NF
8.3NF
9.2NF和3NF的区别
2NF依据是非主键列是否完全依赖于主键,还是依赖于主键的一部分。
3NF依据是非主键列是直接依赖于主键,还是直接依赖于非主键。