1.一对一的关系:学生和身份证是一一对应的
可以在任意一方添加 “唯一” 外键指向另一方主键
2.一对多的关系:一个部门有多个员工,一个员工有一个部门
在 n 对应的一方建立外键指向 1 的一方的主键
3.多对多的关系:一个学生可以选多个课程,一个课程可以被多个学生选择
通过另外建立第三张表,把具有多对多关系的两张表的主键作为其外键,分别指向上述两张表
据百度原文:目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
目的:规范化目的是使结构更合理,消除存储异常,使数据冗余尽量小。便于插入、删除和更新。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
目前,我们只要满足前三个范式就可以满足大部分生产环境使用的数据库设计。以下,对前三个范式进行阐述:
反例:如下图所示,具有可以分割的数据项,不符合第一范式
正例:每一列不可拆分,但是有很多如下图冗余
存在问题:
1.存在非常严重的数据冗余:如上图
2.数据添加存在问题:如只添加上述绿框数据,不合法,限制了插入灵活性。如,新开计算机系,还未开始招生,那么无法添加到上述数据表中。
3.数据删除存在问题:张无忌同学毕业了,删除数据,会将系的数据一起删除。如,删除张无忌相关信息,经济系所有信息都将被删除。
前置概念:
1. 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
例如:学号-->姓名。 (学号,课程名称) --> 分数
2. 完全函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
例如:(学号,课程名称) --> 分数
3. 部分函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
例如:(学号,课程名称) -- > 姓名
4. 传递函数依赖:A-->B, B -- >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
例如:学号-->系名,系名-->系主任
5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
例如:该表中码为:(学号,课程名称)
* 主属性:码属性组中的所有属性
* 非主属性:除过码属性组的属性
根据上述概念,完成第二范式的步骤主要步骤分为两步:1)寻找表中的 “码”;2)拆分数据库,并删除冗余数据
为了解决第一范式(1NF)中的问题,我们根据第二范式中消除部分依赖的原则,
1)寻找一个可以确定其他任何属性的属性或者属性组------码,如上例为(学号+课程)。
2)把完全依赖,如(学号+课程--->分数),拆分出来单独做一个表,如下图选课表。
3)剩下的项为 “姓名/系名/系主任”,通过观察,学号可以唯一确定三个属性任何一个,剩下的字段添加学号作为“码”,并且可以删除冗余项,生成另一张如下图的学生表。
4)观察,如下两表都没有了部分依赖,满足了第二范式(2NF)的要求。
存在问题:
1.存在非常严重的数据冗余。(解决冗余问题)
2.数据添加存在问题:如只添加上述绿框数据,不合法,限制了插入灵活性。如,新开计算机系,还未开始招生,那么无法添加到上述数据表中。
3.数据删除存在问题:张无忌同学毕业了,删除数据,会将系的数据一起删除。如,删除张无忌相关信息,经济系所有信息都将被删除。。
根据上述概念,完成第三范式的步骤主要步骤分为两步:1)寻找表中的 “传递依赖”;2)拆分数据库,并消除传递依赖
1)找到传递依赖:如下图,学号可以确定系名,系名确定系主任
2)把传递依赖的最后一项拆分跟上一个依赖项组成一张表,并删除冗余,上图为系主任,产生如下三张表。
存在问题:
1.存在非常严重的数据冗余(解决)
2.数据添加存在问题:如只添加上述绿框数据,不合法,限制了插入灵活性。如,新开计算机系,还未开始招生,那么无法添加到上述数据表中。(解决)
3.数据删除存在问题:张无忌同学毕业了,删除数据,会将系的数据一起删除。如,删除张无忌相关信息,经济系所有信息都将被删除。(解决)