阅读 179

闲来无事了解下数据库 - 关系数据库

总览

1. 关系数据库概述

关系数据库的产生历史

1970 E.F.Codd提出关系模型, 奠定了理论基础

20世纪70年代末, System R, 关系方法理论研究和软件系统的研制取得了重大突破

1981年, SQL/DS, INGRES, 出现了比较成熟的关系数据库管理技术

20世纪80年代后, Oracle, Informin, MS SQL Server, 关系模型成为主流数据模型

2. 关系数据库模型

关系数据模型的组成要素

数据模型的要素包括: 数据结构, 数据操作, 数据约束

关系数据模型的组成要素: 关系数据结构, 关系操作集合, 关系完整性约束

关系数据结构, 也就是我们所常用的表格

关系数据结构

表 (Table)

表: 也称为关系, 是一个二维的数据结构, 由表名, , 若干行数据组成

关系 (Relation)

关系: 一个关系逻辑上对应一张二维表, 可以每个关系取一个名称进行标识

表 = 关系, 关系 = 表, 我们在说表的时候, 也是在说关系, 我们在说关系的时候, 就是在说表

关系的三种类型

基本关系(基本表, 基表): 实际存在的表, 它是实际存储数据的逻辑表示

查询表: 存放查询结果的表

视图表: 由基表或其它视图表导出的表, 是虚表, 不对应实际存储数据, 相当于我们对查询出来的数据表, 又进行了深一层的加工

列 (Column)

也称为字段(Field)属性(Attribute)

所以表的列名, 也就是字段名, 也是属性名

要求: 表名必须唯一, 一张表里字段名必须唯一, 不同表可以出现相同的字段名

属性 (Attribute)

表中的一列即为一个属性, 给每一个属性起一个名称即属性名

属性的个数称为关系的元或度, 像我们这张表, 它是一个5元关系, 或者说5度关系

行 (Row)

行, 也称为元组(Tuple), 或记录(Record)

一行数据, 就是一个元组, 也是一条记录

分量 (Component)

每一行中的一个属性值, 称为分量

我们下面要用到的关系

s_no - 学号, c_no - 课程号, grade - 成绩

码或键 (Key)

一个属性或者多个属性的值, 能用来唯一标识一行记录, 则这些属性称为该关系的码或键

e.g. "漫威超级英雄"关系中, 我们知道编号1的就是星爵, 我们也知道中文名"美国队长", 也可以知道它对应着哪条数据, 所以它们都是"漫威超级英雄"这个关系中的码或键

超码或超键 (Super Key)

在码中去除某个属性, 它仍然是这个关系的码, 称这样的码或键为该关系的超码或超键

e.g. "漫威超级英雄"关系中, 编号和姓名可以唯一确定一行数据, 我们去掉姓名, 用编号也可以唯一确定一条记录, 所以编号和姓名组成的码就是这个关系的超码或超键

最大超码或超键

关系中的所有属性的集合, 就是这个关系的最大起码或超键

候选码或候选键

在码中不能从中移除任何一个属性, 移除任何一个属性都不能唯一确定一条数据, 那么这个码就是这个关系中的候选码或候选键

e.g. 我们要确定某个学生的具体五六课程的成绩, 我们只确定学号, 就不能确定该学生的哪门课的成绩. 我们只确定课程号, 就不能确定是哪个学生的成绩. 所以 (学号, 课程号)就组成了这个关系的候选码或候选键

最小超码或超键

候选码或候选键是这个关系中最小超码或超键

主码或主键 (Primary Key)

若干个候选码或候选键中中指定一个用来唯一标识关系的元组, 则这个候选码或候选键就为该关系的主码或主键. 在"学生成绩表"中, 可以用(学号)作为该表的主键

全码或全键 (All Key)

一个关系模式的有属性集合是这个关系的主码或主键, 这个的主码或主键称为全码或全键

主属性或非主属性 (Nonprimary Attribute)

包含在任何一个候选码中的属性称为主属性或码属性

不包含在任何一个候选码中的属性称为非主属性或非码属性

比如学号就是主属性, 其它就是非主属性

外码或外键 (Foreign Key)

某个属性或多个属性不是这个关系的主码或候选码, 而是另一个关系的主码, 则该属性为这个关系的外码或外键表的外键

班号是学生表的一个属性, 是班级表的主键, 则班号为学生表的外键

参照关系(Referencing Relation)和被参照关系 (Referenced Relation)

参照关系也称为从关系, 被参照关系也被称为主关系, 指以外码相关联的两个关系

以外码为主码的关系称为被参照关系, 外码所在的关系称为参照关系

学生表为参照关系, 班级表为被参照关系

域 (Domain)

表示属性的取值范围

比如, 正常的性别的取值为男或女

数据类型 (Data Type)

表中每个列都有相应的数据类型

e.g. 姓名列就要使用字符型

关系模式 (Relation Schema)

关系模式是型(type), 关系是值(value), 关系模式是对关系的描述

关系模式是静态的, 稳定的

关系是动态的, 随时间不断变化的

关系数据库

关系数据库是以关系模型为数据的逻辑模型, 所有关系的集合构成一个关系数据库

关系数据库对关系的限定/要求

  • 每一个属性都是不可分解的(不允许表中有表
  • 每一个关系仅仅有一种关系模式
  • 每一个关系模式中的属性必须命名, 属性名不同
  • 同一个关系中不允许出现候选码或候选键值完全相同的元组
  • 在关系中元组的顺序(即行序)是无关紧要的, 可以任意交换
  • 在关系中属性的顺序(即列序)是无关紧要的, 可以任意交换

3. 关系操作集合

基本操作: 选择, 投影, 并, 差, 笛卡尔积

特点: 关系操作的特点是集合操作方式, 即操作对象和结果都是集合. 这种操作方式称为一次一集合(set - at - a - time)方式

关系数据语言的分类

代数方式和逻辑方式, 代数方式主要有关系代数, 逻辑方式主要有关系演算

关系代数语言

关系演算语言又可按谓词变元的基本对象是元组变量还是域变量, 分为元组关系演算, 域关系演算

SQL (Structured Query Language, SQL)

特点

集查询, 数据定义语言 (DDL), 数据操纵语言 (DML), 数据控制语言 (DCL)于一体的关系数据语言

关系代数

关系代数是关系操作语言的一种传统表示方式.

关系代数的运算

三大要素: 操作对象, 操作符, 操作结果

传统的集合运算

两个表, R1 和 R2, s_no - 学号, s_name - 姓名, s_sex - 性别, s_room - 宿舍

并 (UNION)

R3 = R1 U R2

前提: 两个关系必须有相同的属性及属性个数, 且相应属性具有相同的值域

R3为R1和R2去掉所有重复元组后的所有元组组成

差 (Difference)

R3 = R1 - R2

前提: 两个关系必须有相同的属性及属性个数, 且相应属性具有相同的值域

属于关系R1, 但是不属于关系R2, 的元组组成

R3 = R1 ∩ R2

前提: 两个关系必须有相同的属性及属性个数, 且相应属性具有相同的值域

R3是由既属于关系R1, 同时又属于关系R2的元组组成

笛卡尔积

R3 = R1 x R2

R1为m元关系, R2为n元关系, 则R3有m + n 个属性, 有m * n个元组

专门的关系运算

选择 (Select)

从指定关系中选取满足给定条件的若干元组组成一个新关系

SQL语句: select 关系名 where 条件

eg. select s1 where sex = '男'

公式: σF(R), 其中F为条件表达式, R为被运算关系名

投影 (Projection)

从指定关系中选取指定的若干属性值组成一个新关系

SQL语句: projection 关系名 (属性1, 属性2, ..., 属性n)

projection s1 (number, name)

公式: πA(R), 其中A为属性序列, R为被运算关系名

连接 (Join)

公式: R(i) θ S(j)

自然连接, 等值连接

等值连接, 是θ为"="的连接操作

SQL语句: join 关系1 and 关系2 where 条件

join s1 and s2 where s1.name = s2.name

从笛卡尔积RxS中选取R的第i列属性值与S的第j列属性值满足θ条件的那些元组组成一个新关系

自然连接结果

等值连接结果

自然连接是构造新关系的有效方法, 投影和选择是分解关系的有效方法

如果两个关系没有公共属性, 那么它们的自然连接就变成为笛卡尔积

除 (Division)

公式: R ÷ S

R为n元关系, S为m元关系, 则运算结果为m-n元关系

扩充的关系运算: 广义的投影, 赋值, 外连接, 半连接, 聚集, 外部并等

  1. 关系R, 包含A, B, C三个属性

关系S, 包含B, C, D三个属性

R - S得到的属性值就是关系R包含而S不包含的属性, A属性

  1. 在关系R中, A属性的值可以取 {a1, a2, a3, a4}

a1对应的象集为 {{b1, c2}, {b2, c1}, {b2, c3}}

a2对应的象集为 {{b3, c7}, {b2, c3}

a3对应的象集为 { {b4, c6} }

a4对应的象集为 { {b6, c6} }

  1. 关系S在B, C上的投影为 { {b1, c2}, {b2, c1}, {b2, c3} }
  2. 只有a1对应的象集包含关系S的投影集
  3. 所以A属性中只有a1

两个关系 R 和 S

两个关系进行除运算的结果为

4. 关系的完整性约束

数据库的数据完整性是指数据库中数据的正确性, 相容性, 一致性

  1. 与现实世界中应用需求的数据的正确性, 相容性和一致性
  2. 数据库内数据之间的正确性, 相容性和一致性

完整性约束的分类

实体完整性约束 (Entity Integrity Constraint)

实体完整性约束是指关系的主属性, 即主码的组成不能为空, 不能为空值 NULL

参照完整性约束 (Referential Integrity Constraint)

定义外码和主码之间的引用规则

教师 (职工号, 姓名, 性别, 职称, 系编号)

系 (系编号, 系名, 办公地点, 办公电话)

教师关系中, 主码为"职工号", "系编号"在教师关系中为外码, 在系关系中为主码

则, 在教师关系中, 系编号的取值, 要么取空值, 要么为系关系中存在的主码值

用户定义完整性约束 (User-defined Integrity Constraint)

域完整性约束, 针对某一应用环境的完整性约束

关系模型完整性约束的检验

检查实体完整性约束

检查参照完整性约束

检查用户定义完整性约束

执行插入操作

执行删除操作

执行更新操作(对插入操作和删除的操作的综合)

5. 关系数据库的规范化理论

关系模式中可能存在的冗余和异常问题

数据冗余: 指同一数据被反复存在的情况

更新异常: 数据冗余造成的, 多个内容更改使操作失误

插入异常

删除异常

数据依赖: 函数依赖和多值依赖

函数依赖与关键字

函数依赖是指关系中属性间的对应关系

设R为任一给定关系, 如果对于R中属性x的每一个值, R中的属性Y只有唯一值与之对应, 则称X函数决定Y或称Y函数依赖于X, 记作X -> Y. 其中X称为决定因素

对于关系R中的属性X和Y, 若X不能函数决定Y, 记作X /→ Y

函数依赖的分类

完全函数依赖

设R为任一给定关系, X, Y为其属性集, 若X->Y, 且对X中的任何真子集X', 都有X' /-> Y, 则称Y完全函数依赖于X

student (s_no, s_name, s_sex, c_no, c_title, t_name, t_ place, grade)

(s_no, c_no) -> (grade)

(s_no) ->/ (grade)

(c_no) ->/ (grade)

学号和课程号就能决定就完全能决定成绩, 而学号或者课程号单独一项不能决定成绩, 这种情况就是完全函数依赖

部分函数依赖

设R为任一给定关系, X, Y为其属性集, 若X -> Y, 且X中存在一个真子集X', 满足X' -> Y, 则称Y部分函数依赖于X

(s_no, s_name) -> (student_sex)

(s_no) -> (s_sex)

学号和姓名可以决定性别, 而学号自己也能决定性别, 这种情况就是部分函数依赖

传递函数依赖

设R为任一给定关系, X, Y, Z为其不同属性子集, 若X -> Y, Y /-> X, Y -> Z, 则有X -> Z, 称Z传递函数依赖于X

books (b_no, b_name, p_name, p_address)

(b_no) -> (p_name)

(p_name) -> (p_address)

(p_name) /-> (b_no)

书号可以决定出版社, 出版社可以决定出版社地址, 但出版社名称不能决定书号, 这各情况是传递函数依赖

关键字的定义

设R为任一给定关系, U为其所含的全部属性的集合, X为U的字集, 若有完全函数依赖X -> U, 则X为R的一个候选关键字

student (s_no, c_no, c_title, t_name, place, grade)

(s_no, course_no) -> (c_title)

(s_no, c_no) -> l_name

(s_no, c_no) -> l_place

(s_no, c_no) -> c_grade

则(s_no, c_no)为候选关键字, 也就是候选码, 也就是主属性

范式与关系规范化过程

什么是范式? (Normal Form, NF)

关系数据库中的关系需要满足一定的要求, 不同程序的要求称为不同的范式

什么是规范化?

一个低一级范式的关系模式通过模式分解 (Schema Decomposition)可以转换为若干个高一级范式的关系模式的集合, 这种过程就叫规范化 (Normalization)

有一张表

第一范式 (1NF)

设R为任一给定关系, 如果R中每个列与行的交点处的取值都是不可再分的基本元素, 则R为第一范式

缺点:

冗余高: 如果有100个同学选修"操作系统"这门课程, 那么授课老师的办公地址就要被反复存储100次

插入操作异常: 学校学校开设了一门新课程, 但是还没有被任何同学选修, 则这门课程的基本信息将无法存储到这个关系中去

删除操作异常: 如果我们删除最后一条信息, 那么C语言这门课程的老师, 办公地址, 也会被删除

目标: 不信重复组的关系, 其中不存在嵌套结构

规范化后的结果

第二范式 (1NF)

设R为任一给定关系, 若R为第一范式, 且其所有非主属性都完全函数依赖于候选关键字, 则R为第二范式

非主属性(grade)完全函数依赖于(s_no, c_no), 现在分解出来形成R1

其它非主属性(c_title, t_name, t_place) 都只函数依赖于 (c_no), 现在分解出来形成R2

现在就满足了第二范式

第二范式的目标: 消除部分函数依赖

规范化后的结果

第三范式 (1NF)

设R为任一给定关系, 若R为2NF, 且其每一个非主属性都不传递函数依赖于候选关键字, 则R为第三范式

而第二范式仍然会出现问题, 如果新来了一位老师, 还没有任何教学工作, 这位老师会因为缺少c_no属性值, 而不能进行插入操作

原因在于: 存在非主属性对主属性的传递函数依赖, c_no -> t_name, t_name -> t_place, t_name /-> c_no.

因此我们再将CT表分解成两个表 课程表和教师表

第三范式的目标: 消除关系中的传递函数依赖

规范化的结果

第三范式的改进式 (BCNF, Boyce-Codd Normal Form)

前提: 每一个学生可选修多门课程, 每一门课程有多个指导老师, 每个老师只能指导一门课程

设R为任一给定关系, X, Y为其属性集, F为其函数依赖集, 若R为3NF, 且其F中所有函数依赖 X -> Y (Y不属于X)中的X必包含候选关键字, 则R为BCNF

然而还是有问题, 一个新课程和指导老师的数据要插入到数据库时, 必须至少有一个学生选修该课程且该指导老师已被分配给他时才能进行.

原因在于主属性之间存在函数依赖 t_name -> c_title, 但是t_name不是候选关键字, 因此需要进一步规范成BCNF 规范化后的结果

简述关系规范化过程

一个低一级范式的关系模式通过模式分解可以转换为若干个高一级范式的关系模式的集合, 这种过程就叫规范化

范式的转换步骤

1NF -> 2NF

找到候选关键字, 看其余的属性是否完全函数依赖候选关键字

是的, 与候选关键字一同抄下来形成一个表格

不是, 抄下来形成第二个表格, 并且将候选关键字里能够唯一决定表格2的属性组抄在第一列

2NF -> 3NF

找到表格中的传递函数依赖关系的三个属性组, 设为x, y, z

将这三个属性拆成两个表格

第一个表格为x, y

第二个表格为y, z

3NF -> BCNF

列出表格中的所有函数依赖关系

每个关系拆出一个表格

扎马步, 扎马步, 扎马步......

关注下面的标签,发现更多相似文章
评论