关系型数据库的基本概念

最简单的关系型数据库

image-20200307231951900

组成:字段(属性)、关系模式、记录(元组)

要求

  1. 列与行是无序的

  2. 同一列的类型相同

  3. 元组不能完全相同

  4. 一个属性值必须是原子值

KEY

主KEY(必需)*

唯一标识符

候选KEY

其他标识符

外KEY

一个表的候选KEY是其他表主KEY

数据库的组成

一般由多张表组成

之间相互有联系

关系中的数据约束

实体完整性约束

即主KEY不为空

参照完全性约束

即外KEY不能为NULL(类似于指向空指针)

用户定义的完整性约束

即属性值必须在规定范围内

关系代数(对表的元素进行运算)

交并差 不叙

笛卡尔积

离散中学过了A={a,b,c} B={a,b} AxB={<a,a>,<a,b>,<b,a>,<b,b>,<c,a>,<c,b>}

组成新的序列

在这里,理解起来也类似,只是A和B的元素变成了行

image-20200308001544371

投影

就是筛选

image-20200308001650244

选择

image-20200308001719326

除法

image-20200308015647564

可以看成是乘法逆运算

但是如果不符合的就被丢掉了

image-20200308112043306

连接

image-20200308112223431

就是做笛卡尔积时再进行筛选

多个条件使用∧∨

∧是且∨是或,这个不必多说

自然连接

不提供条件,但是要有列名相同的列,同时还会进行合并

image-20200308114232351

数据库设计

实体(Entity)-联系(Relationship)模型(E-R模型)

一对一、一对多和多对多

image-20200308121800353

属性->关系图的列

每一个联系和属性都要有一个表

设计原则

一对一的在一张表中

一对多:”多“方表增加一列,存放”一“方表的主键

多对多:增加一张表,变成两个”一对多“的表

例如学生和老师,一个学生有多个老师,一个老师有多个学生

那么学生信息一张表,老师信息一张表,新增了一张(老师,学生)的表

关系型数据库设计规范化

满足不同级别要求的的规范就是范式,最低要求第一范式(1NF),进一步(2NF),第三范式(3NF)

第一范式

如果每个列都是不可分解的,称第一范式,这是最基本的要求。

函数依赖

表中一列或者几列的组合决定其他列,例如学号决定姓名,学号和学科决定成绩等等

主属性/非主属性(和KEY不一样)

如果表中某列是属于某个候选键中的属性,称主属性,否则称非主属性

这里有一点难以理解,从网上cp了一段

先说候选键,候选键就是可以区别一个元组(即表中的一行数据)的属性或属性的集合,比如学生表student(id,name,age,sex,deptno),其中的id是可以唯一标识一个元组的,所以id是可以作为候选键的,既然id都可以做候选键了,那么id和name这两个属性的组合可不可以唯一区别一个元组呢?显然是可以的,此时的id可以成为键,id和name的组合也可以成为键,但是id和name的组合不能称之为候选键,因为即使去掉name属性,剩下的id属性也完全可以唯一标识一个元组,就是说,候选键中的所有属性都是必须的,缺少了任何一个属性,就不能唯一标识一个元组了,给候选键下一个精确的定义就是:可以唯一标识一个元组的最少的属性集合。而键是没有最少属性这个要求的。另外,一个表的候选键可能有多个,从这些个候选键中选择一个做为主键,至于选择哪一个候选键,这个是无所谓的,只要是从候选键中选的就行。

至于主属性,刚才提到了,一个表可以有多个候选键,那么对于某个属性来说,如果这个属性存在于所有的候选键中,它就称之为主属性。

非主属性 不包含在任一候选键中的属性称为非主属性。

还不懂?举一个例子来说明一下各个键的含义–(超键、候选键、主键、外键)

学号 身份证 姓名 性别 身高 宿舍号
100 410 张三 155 A201
101 411 李四 155 B202
宿舍号 楼号
201 A
202 A
201 B
202 B
203 B

那么这里

超键:(学号)、(身份证)、(学号、身份证)、(学号、姓名)、(学号、宿舍号)

  • 可以唯一标识元组的属性集

候选键(候选关键字,候选码,最小超键):(学号)、(身份证)

  • 不能有多余属性的超键,且缺少任一属性不能表示元组,例如在(学号|学科|成绩)的表中(学号、学科)就是候选键,缺少了学号或者学科都不能确定该元组。

主键:(学号)

  • 候选键中选出来一个键就行,例如这里可以二选一(学号)或者(身份证),同时主键必须要唯一,比如名字就不可以,然后主键不能有空,尽可能简短等性质。

外键:这里(宿舍号)就是外键,在另一个表中作为主键存在

Other:

​ 主属性:身份证,学号

  • 候选键中的任一属性都是主属性

​ 非主属性:姓名、性别、身高、宿舍号

  • 即候选键以外的为非主属性

第二范式

在1NF的条件下,且当候选键是多列的组合时,每个非主属性都决定于候选键所有属性的组合,而没有仅决定于候选键中一部分属性的情况(称没有部分依赖),称第二范式

  • 只有唯一候选键(由于只有一个候选键,也可以说唯一主键)的,符合第二范式

比如上面那个例子,学号和身份证号都是可以查到一个学生的所有信息的,那么就不符合第二范式,但是例如成绩表

班级 姓名 成绩
A 1 93

那么非主属性-成绩依赖于主键-(班级、序号)的组合,这样是符合第二范式的。

第三范式

在2NF的条件下,且每个非主属性都不传递依赖于候选键,称第三范式。

即,非主属性中不能一个决定另一个

学号 办理时间 办理区域 学院院长

例如该表,(学号)是主键,那么可以得知班级和学院,由非主属性-学院可以知道另一个非主属性-学院院长,这就是传递依赖。

我们更改为

学号 班级 学院
学院 学院院长

那么就符合第三范式了

BCNF范式(扩充3NF)

每个属性都不传递依赖于候选键,则为BCNF范式(扩充的第三范式)

满足和不满足各举一例

image-20200309200224627

image-20200309200256707