一、表的关系
1.一对一关系(1:1):
概念描述:
例如:一个人只能拥有一张身份证,一张身份证也只能对应一个人。
那么这里的一个人和身份证就是一对一的关系。
多表之间一对一关系如何实现?
两个一对一关系的表,可以在任意一方添加外键,并将外键指向另一方的主键。(实现的提前条件必须使用关键字unique对外键进行唯一约束。一般一对一关系的表,直接合并成一张表,很少用,了解即可)
2.一对多关系(1:n):
概念描述:
例如:一个学生只能属于一个系,但一个系可以有很多的学生。
那么这里的一个系和学生就是1:n关系。
多表之间的一对多关系如何实现?
例如一个系和学生。在学生的表(多的一方)中建立外键,指向系的主键。
3.多对多关系(m:n):
概念描述:
例如:一个学生可以选择多门课程,一门课程可以被多个学生选择。
那么这里的学生和课程就是m:n关系。
多表之间的多对多关系如何实现?
借助中间表来实现。在中间表中至少包含两个字段,并且两个多对多关系的表主键作为外键写入中间表。
二、范式
第一范式
在表中,所有的列都是不可再分的原子项。(了解即可,因为表一创建便满足第一范式)
第二范式
在第一范式的基础上,消除部分函数依赖。关于部分函数依赖,又引申出以下几点,具体参照如下图:
函数依赖:A-->B,通过A属性(属性组)就可以确认唯一B属性的值。
例如:学号-->名字,(学号,课程名称)-->分数
(简单翻译:通过学号可以确定名字的唯一值,通过学号,课程名称就可以确定唯一的分数值。这里的学号是属性,学号,课程名称是属性组)
完全函数依赖:: A-->B,如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
例如:(学号,课程名称)-->分数
(简单翻译:参照上图。
学号10010它可以查询出很多科目的分数,课程大学英语也可以查询出很多个同学的成绩分数,所以说单是学号或者是课程名没有办法去确定唯一的分数。想要获得分数的某个值,必须要依赖学号和课程名称这两个属性去确认,这个就叫完全函数依赖
)
部分函数依赖:A-->B,如果A是 一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
例如:(学号,课程名称)-->系名
(简单翻译:只要通过查询某个学生的学号,就可以确定他是哪个系的,完全不需要课程名称这个属性,这就是部分函数依赖)
传递函数依赖:A-->B,B -->C .如果通过A属性(属性组)的值,可以确定唯一B属性的值, 在通过B属性(属性组)的值可以确定唯一C
属性的值,则称c传递函数依赖于A
例如:学号-->系名,系名-->系主任,最终学号-->系主任
码:如果在一张表中,一个属性或属性组, 被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码。
例如:(学号,课程名称)-->分数
学号,课程名称就是表的码。
第三范式:在第二范式的基础上,消除传递依赖
3.第一范式到第三范式的演变范例:
(1)创建一张表,包含以下信息(表一创建就满足第一范式)
(2)满足第二范式(在第一范式的基础上,消除部分函数依赖)
部分函数依赖:学号-->姓名,学号-->系名,系名-->系主任,学号-->系主任(传递依赖)
完全函数依赖:(学号,课程名称)-->分数
消除部分函数依赖:消除姓名,系名,系主任等列,得到下图,满足第二范式。
(3)满足第三范式(在第二范式的基础上,消除传递依赖)
由第二范式的图可知,传递依赖:学号-->系名,系名-->系主任,学号-->系主任
消除传递依赖:将系名、系主任去除。
满足第三范式。