这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天。
1. 关系型数据库基础
数据库是保存有组织的数据的容器(通常是一个或者一组文件)。 表是某种特定类型数据的结构化清单。 模式是关于数据库和表的布局及特性的信息。 列是表中的一个字段。所有的表都是由一个或多个列组成的。 数据类型:所容许的数据的类型。每个表的每一列都有相应的数据类型。 行是表中的一个记录。 主键是一个或者一组列,它能够唯一地区分表中的每一行。(任意两行不能具有相同的主键值;每一行都要有一个主键值。)
SQL 的优点:
- 几乎所有重要的 DBMS 都支持 SQL;
- SQL 简单易学;
- SQL 是强有力的语言,灵活使用可以进行非常复杂和高级的数据库操作。
MySQL 的优点:
- 开源免费
- 性能好,执行非常快
- 可信赖
- 简单,安装和使用都很容易
数据完整性
- 实体完整性:实体完整性在MySQL中的实现是通过主键约束和候选键约束实现的。
- 参照完整性:外键
- 约束完整性:列的约束
1.1. 函数依赖与数据库范式
候选码:若关系中的某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码。 主码:若一个关系中有多个候选码,则选定其中一个为主码。 主属性:所有候选码的属性称为主属性。 非主属性:不包含在任何候选码中的属性称为非主属性。
函数依赖:对于两个集合 A, B,如果一个已经确定值的 A 可以唯一的确定 B 的值,则称 A 函数决定 B,B 函数依赖 A。记作 A -> B。
部分函数依赖:如果 A -> B, X -> B 且 ,则称 B 部分函数依赖于 A。
传递函数依赖:如果 A -> X, X -> B 且 X !-> A,则称 B 传递函数依赖于 A。
数据库六大范式:
- 第一范式:每个列都不可以再拆分。
- 第二范式:在第一范式的基础上,非主属性必须完全依赖于候选码(消除非主属性对主属性的部分依赖)
- 第三范式:在第二范式的基础上,任何非主属性不依赖于其它非主属性(消除非主属性对主属性的传递依赖)
- BC 范式:在第三范式的基础上,任何主属性不能对候选码子集依赖(消除主属性对于候选码的部分与传递函数依赖)
- 第四范式:在BC范式的基础上,限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。
- 第五范式:在第四范式的基础上,表必须可以分解为较小的表,除非那些表在逻辑上拥有与原始表相同的主键。
学生表(学号,姓名,年龄,班主任,班主任办公室)
满足 2NF,不满足 3NF: 学号 -> 班主任 -> 班主任办公室
修改:
学生表(学号,姓名,年龄,班主任)
班主任表 (班主任,班主任办公室)
| 学号 | 姓名 | 年龄 | 班主任 | 班主任办公室 |
|---|---|---|---|---|
| 1 | 学生1 | 19 | 班主任1 | 办公室1 |
| 2 | 学生2 | 19 | 班主任1 | 办公室1 |
| 3 | 学生3 | 19 | 班主任1 | 办公室1 |
| 4 | 学生4 | 19 | 班主任2 | 办公室2 |
| 5 | 学生5 | 19 | 班主任2 | 办公室2 |
| 6 | 学生6 | 19 | 班主任3 | 办公室3 |
不符合范式的关系,会产生很多异常,主要有以下四种异常:
- 冗余数据:班主任信息冗余。
- 修改异常:修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。
- 删除异常:删除一个信息,那么也会丢失其它信息。例如删除了学生6,则对应的班主任3的信息也没有了。 插入异常:例如想要插入一个办公室的信息,如果它还没有班主任入住就无法插入。