数据库设计——表的关系与范式

一、表的关系

1.一对一关系(1:1):

概念描述:

例如:一个人只能拥有一张身份证,一张身份证也只能对应一个人。

那么这里的一个人和身份证就是一对一的关系。

多表之间一对一关系如何实现?

两个一对一关系的表,可以在任意一方添加外键,并将外键指向另一方的主键。(实现的提前条件必须使用关键字unique对外键进行唯一约束。一般一对一关系的表,直接合并成一张表,很少用,了解即可)

2.一对多关系(1:n):

概念描述:

例如:一个学生只能属于一个系,但一个系可以有很多的学生。

那么这里的一个系和学生就是1:n关系。

多表之间的一对多关系如何实现?

例如一个系和学生。在学生的表(多的一方)中建立外键,指向系的主键。

数据库设计——表的关系与范式_第1张图片

3.多对多关系(m:n):

 概念描述:

例如:一个学生可以选择多门课程,一门课程可以被多个学生选择。

那么这里的学生和课程就是m:n关系。

多表之间的多对多关系如何实现?

借助中间表来实现。在中间表中至少包含两个字段,并且两个多对多关系的表主键作为外键写入中间表。

数据库设计——表的关系与范式_第2张图片

 二、范式

第一范式

在表中,所有的列都是不可再分的原子项。(了解即可,因为表一创建便满足第一范式)

第二范式

在第一范式的基础上,消除部分函数依赖。关于部分函数依赖,又引申出以下几点,具体参照如下图:

数据库设计——表的关系与范式_第3张图片

函数依赖: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)创建一张表,包含以下信息(表一创建就满足第一范式)

数据库设计——表的关系与范式_第4张图片

(2)满足第二范式(在第一范式的基础上,消除部分函数依赖)

部分函数依赖:学号-->姓名,学号-->系名,系名-->系主任,学号-->系主任(传递依赖)

完全函数依赖:(学号,课程名称)-->分数

消除部分函数依赖:消除姓名,系名,系主任等列,得到下图,满足第二范式。

 数据库设计——表的关系与范式_第5张图片

 (3)满足第三范式(在第二范式的基础上,消除传递依赖)

由第二范式的图可知,传递依赖:学号-->系名,系名-->系主任,学号-->系主任

消除传递依赖:将系名、系主任去除。

数据库设计——表的关系与范式_第6张图片

满足第三范式。 

你可能感兴趣的:(数据库,sql)