[TOC]
graph LR
A[数据库]-->B[CH2:概念模型_ER]
B-->C[基本]
B-->D[扩展]
A-->E[CH3:关系数据模型]
E-->F[数据模型]
E-->G[基本概念]
E-->H[集合关系运算]
E-->I[完整性约束]
A-->J[CH4:E-R到关系模型的转换]
J-->K[基本 E-R 模型的转换]
J-->L[扩展的 E-R 模型的转换]
A-->M[CH5:SQL]
ER模型
- 实体
- 属性(实体的属性)
- 域(属性的取值范围)
- 候选码(唯一标识实体的属性或最小属性组)必须选一个做主码
基本E-R模型
扩展E-R模型
- 参加约束
- 实体参与联系的最小最大次数
- 全参与约束:实体集的每一个元素都参加联系
- 弱实体
- 强实体和弱实体必须一对多
- 弱实体必须全参与
- 类层次ISA(泛化)
- 聚合
- 联系描述的是实体与实体之间的关联
- 如果联系参与联系
- 把联系看作联系和实体的组合
- 联系和实体的组合当作一个实体就叫做聚合
关系数据模型
数据模型
数据模型三要素:
- 数据结构
- 所研究对象类型的集合
- 数据操作
- 检索、更新
- 数据约束条件
- 完整性规则的集合
关系数据库发展
模型划分
- 网状、层次发展模型
- 关系数据库
- 面向对象数据模型为特征
产品划分
- 对关系模型的支持
- 运行环境
- RDBMS系统构成
- 对应用的支持
基本概念
- 基本概念
- 域(类型相同元素集合)
- 笛卡儿积( × )
- 元组:一组元素
- 分量:元组中的一个值
- 基数:元素个数
- 关系: D1XD2X…Dn的子集叫做在域D1, D2, …, Dn上的关系
- 表示为R(D1, D2, …, Dn)
- 关系的目或度:n
- 单元关系: n=1
- 二元关系: n=2
- 关系是一个二维表(子集)
- 候选码:能够唯一标识一个元组的最小属性组
- 主码:指定一个候选码作为主码
- 主属性:候选码中的属性
- 非码属性:不包含在任何候选码中的属性
- 关系的性质
- 不同的列可以出自同一个域
- 关系模式:关系的描述
- 形式化表示:R(U, D, dom, F),简记为R(U)或R (A1, A2, …, An)
- 关系模式是型,关系是值
集合关系运算
集合运算
- 并∪
- 交∩
- 差 -
- 广义笛卡尔积:两个分别为n和m目的关系R和S的广义笛卡尔积是一个n+m列的元组的集合。若R有k1个元组,S有k2个元组,则广义笛卡尔积有k1×k2个元组
专门的关系运算
- 选择运算:在关系R中选择满足给定条件的元组,记作:σF(R)={ t | t∈R F (t)=真 }
- 投影运算:是从关系R中选出若干属性列组成新的关系,记作: πA(R)={ t[A] | tR}
- 连接运算:是从两个关系的笛卡尔积中选取属性间满足一定条件的元组,称为连接
- 连接 = 选择运算 + 迪卡尔积运算
- 当A、B为相同的属性组时,为自然连接
- 象集
- 除:
给定关系R(X, Y)和S(Y,Z),其中X,Y,Z为属性组。R中的Y和S中的Y可以有不同的名字,但必须取自同一个域。
R与S除得到一个新关系P(X),P是R中满足下列条件的元组在X属性列上的投影
元组在X分量值x的象集Yx==包含==S在Y上投影的集合
参照柳婼的解释
换名操作
ρ(R(F), E)
- E:关系表达式
- F拔是E中重复的元素名字被重命名
- R:新关系
小结
5种基本关系运算
- ∩ 连接 ÷ 这三个可由其他五个表示
- 自然连接是可结合的
- 关系运算的结果是关系
完整性约束
- 实体完整性:主码中的属性不可取空值
- 参照完整性:
- 外码:设F是关系R的一个或一组属性,如果F与关系S的主码Ks相对应,则称F为关系R的外码(外键)
- 参照关系R(F,..,...),被参照关系S。
- F的取值必须为:
- 或者取空值
- 或者等于S中某个元组的主码值
- 参照完整性的特点:
- 在被参照关系中关键字的值在参照关系中不一定出现
- 但在参照关系中出现的关键字值在被参照关系中必须要出现
- 值得注意的是外键可能来自于同一关系,也就是被参照关系就是参照关系
E-R模型到关系模型的转换
基本 E-R 模型的转换
- 实体集到关系的转换 --关系表
- 属性 --关系表中的属性
- 主关键词 --关系表中的主关键字
- 属性域 --关系表中的属性的域
- 联系到关系的转换
-
多对多
- 每个参加联系的实体集的主关键字属性,作为外键存在
- 所有外键构成该实体集的主关键字
- 联系集本身的属性 -- 一般属性
-
一对多
- 将一对多联系转换为一个独立的关系表【缺点1】多一个表【缺点2】连接麻烦
- 将联系和多的那个实体集转换为一个关系表【缺点】浪费空间
一对一关系怎么转换?
-
扩展的 E-R 模型的转换
- 具有参加约束的联系集的转换
- 弱实体集
- 一个弱实体集总是参与一个二元一对多联系
- 所以用上面的方法二。浪费空间的缺点不再存在
- 类层次
-
三个实体集转换成三个关系表
- 超类删除时子类也要同时被删除
- 在子类的关系表中不需要父类的非主属性(体现继承性)
- 【特点】
- 当查询涉及到父类的属性和其它一些细节属性时需要连接操作
- 当查询仅涉及到父类的属性时则在父类关系上进行即可
- 另一个优点是可以存储非子类的实体
-
三个实体集转换成两个关系表
- 仅生成两个关系:他们都包含超类Employees的属性,除了主关键字约束以外,不需要定义任何约束
- overlap约束只能用通用约束机制来实现
- 【特点】
- 主要缺点是无法存储非子类的实体
- 优点是仅涉及子类的查询仅在一个关系上进行即可,不需要额外的连接操作
- 但涉及到所有子类的查询则需要在两个关系上进行;
-
关系数据库标准语言SQL
概述
SQL语言的组成部分
- 数据定义语言(DDL : Data Definition Language)
- 负责数据结构定义与数据库对象定义的语言
- CREATE
- ALTER
- DROP
- 操作的对象包括关系表、视图、索引等。
- 数据操纵语言(DML : Data Manipulation Language)
- SELECT
- INSERT
- UPDATE
- DELETE。
- 它们分别用于查询、添加、修改和删除表中的行
- 数据控制语言(DCL : Data Control Language)
- 在SQL语言中,是一种可对数据访问权进行控制的指令,
- 由 GRANT 和 REVOKE 两个指令组成。
- 事务处理语言(TPL: Transaction Processing Language )
- 它的语句能确保被DML语句影响的表的所有行及时得以更新。包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
数据库三级模式
- SQL语言也支持关系数据库三级模式体系结构
- 内模式:存储文件(逻辑结构)
- 模式:基本表
- 外模式:视图+一些基本表
数据定义基本功能
模式定义
- SQL提供了三级模式结构的定义功能,相关的定义语句如下:
操作对象 | 创建 | 删除 | 修改 |
---|---|---|---|
模式(命名空间) | CREATE SCHEMA | DROP SCHEMA | |
关系表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX |
- 创建模式基本语句
- CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
- CREATE SCHEMA <模式名>AUTHORIZATION<用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
- DROP SCHEMA <模式名> <==CASCADE|RESTRICT==>
基本表定义
- SQL基本建表语句
- CREATE TABLE表名
- (<列名1> 数据类型 [列级约束],
- [<列名2> 数据类型 [列级约束],]
- ……,
- [表级约束])。
- 约束举例
- primary key
- foreign key
- references
Foreign Key (Cpno) REFERENCES Courses (Cno)
数据类型
char(n) :固定长度为n的字符串
varchar(n): 可变长度为n的字符串
smallint: 短整数
int: 长整数
numeric(p,s) :定点数。由p位数字组成,包括s 位小数
float(n): 精度至少为n位数字的浮点数
real:取决于机器精度的浮点数
double precision:取决于机器精度的双精度浮点数
date: 日期,格式为年、月、日,YYYY-MM-DD
time: 时间,格式为时、分、秒, HH:MM:SS
- 修改表
-
添加列|完整性约束:
- ALTER TABLE <表名>** ADD** <列名> <数据类型> [完整性约束]
- 修改表:在学生表中添加字段Sclass,字符类型,长度20
- Alter table Students add Sclass char(20)
- 增加课程名称必须取唯一值的约束条件
- Alter table Courses add unique (Cname)
- ALTER TABLE <表名>** ADD** <列名> <数据类型> [完整性约束]
-
删除列|完整性约束:
- ALTER TABLE <表名> DROP <列名> <数据类型> [完整性约束]
-
修改列:
- ALTER TABLE <表名>ALTER COLUMN<列名> <数据类型>
- 将年龄的数字类型由字符型改为整型
- Alter table Students alter column Sage int
- ALTER TABLE <表名>ALTER COLUMN<列名> <数据类型>
-
- 删除表
- Drop table <表名> [restrict|cascsde]
- Restrict: 表删除有限制条件,不能被其他表的约束所引用,不能有视图、触发器、存储过程或函数
- Cascade:把一个基本表的定义连同表上的所有记录、索引以及由此基本表导出的所有视图都删除,并释放相应的存储空间
SQL查询语句基本结构
- SQL查询语句的基本结构
- ==SELECT== [DISTINCT] <目标列> [,<目标列>]
- ==FROM== <基本表 (视图)> [,<基本表 (视图)>]
- [==WHERE== <条件表达式>]
- [==Group by== <列名1> [==having== <分组表达式>] ]
- [==Order By== <列名2>[ ==asc | desc== ]];
SQL单关系查询
属性查询
- 指定列顺序无关
- 用*表示所有属性
- 列可以包含运算符
- 用户可以指定别名
元组查询
- 使用==distinct==关键字消除重复行(SQL语句中select默认不消除重复)
- 查询满足条件的元组:
WHERE子句常用查询条件 | 谓词 |
---|---|
比较 | =, >, <, >=, <=, !=, <>, !>, !< not + 上述比较运算符(例如not=) |
确定范围 | between and, not between and |
确定集合 | in, not in |
字符匹配 | like, not like |
空值 | is null,is not null |
多重条件 | and, or |
- 字符匹配查询
- 通配符
- %:任意长度的字符串。
- 例如:a%b == acb, addgb,ab…
- _:任意单个字符
- 例如:a_b == acb, adb…
- 通配符
SQL多关系查询
集合操作
- 参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同
- 集合操作主要有: 并union、交intersect和差except
- 在union, intersect, except中缺省情况下:消除重复元组
- 在后加上all,保留重复元组
多关系连接操作
-
等值连接
- 比较运算符
- between ... and ...
- 自然连接
- 在等值连接中把目标列中的重复属性列去掉
自身连接
-
外连接
- 在一般连接中,只有满足条件的元组才可以作为结果输出,外连接则不同(左、右外连接),把舍弃的元组保留在结果关系中,而在其他属性上填空值。
- 左外连接
- From子句的写法:Students LEFT OUTER JOIN Employee
- 右
- From子句的写法:Students RIGHT OUTER JOIN Employee
- 全
- From子句的写法:Students FULL OUTER JOIN Employee
- 左外连接
- 在一般连接中,只有满足条件的元组才可以作为结果输出,外连接则不同(左、右外连接),把舍弃的元组保留在结果关系中,而在其他属性上填空值。
-
复合条件连接
- and , or
SQL嵌套查询
子查询不可以使用order by,只有最终结果可以
- 不相关子查询求解方法由里向外(in, 比较符)
- 相关子查询求解方法由外向里([not] exists)子查询需要用到父查询的列
- SQL中没有全称量词,但是 All x(P) = !( ョx (!P) )
SQL分组聚集查询
SQL数据操纵功能
SQL视图
SQL索引
SQL的完整性实现
数据库安全
查询处理与查询优化
查询处理
查询优化
- 写出查询树(笛卡儿积、投影、选择)
- 选择下移
- 投影下移(有特殊情况需要加条件)
- 笛卡儿积变自然连接
并发控制
并发和并行
并发的问题:
- 丢失修改
- 不可重复读
- 脏读
并发控制的主要方法:
- 基于封锁机制的并发控制
- 基于时标的并发控制
封锁
- 基本锁:
- 排它锁(X锁eXclusive)写锁
- 共享锁(S锁Share)读锁
- 锁升级--可能导致死锁问题(读锁升写锁)
- 封锁粒度选择
- 数据库、关系、元组三级
- 封锁粒度越大
- 并发度越小
- 系统开销越小
- 多粒度封锁
- 封锁协议
- 修改前加X锁
- 不保证可重复读
- 读脏数据
- 1级情况下。读前加S锁
- 不读脏数据
- 不可重复读
- 1级情况下。读前加S锁直到事物结束释放
- 三个问题均满足
- 修改前加X锁
封锁-饥饿、活锁和死锁
- 死锁产生
- 调度的随机性
- 两个事物相互需要资源
- 死锁预防
- 思想:破坏产生死锁条件
- 常用方法:
- 一次封锁法
- 容易活锁(永远等待)
- 顺序封锁法
- 不可行
- 基于时标的方法
- 等待-死亡
- 受伤-等待
- 一次封锁法
- 基于时标的方法
- 死锁的检测/诊断与恢复
- 检测
- 超时法
- 事物等待图法
- 有回路-死锁
- 恢复
- rollback
- 检测
可串行化调度
- 历程等价的判别方法
- 每一对冲突操作不变
- 确保并发事务执行可串行化的方法:2PL,时间戳
- 两阶段封锁协议(2PL)
- 使用数据先申请
- 释放第一个封锁后事务不再申请和获得其他封锁
- 加锁阶段
- 处理
- 释放阶段
- 并发执行所有事务遵循两段协议是正确的
- 可以避免丢失修改、不可重复读、避免读脏数据
- 不能避免死锁
- 基于时标
- TS(TimeStamp)
- 时标大的先
- 写后读写申请均不行 -- 回滚
- 读后写不行 == 回滚
- 读后读可以 == 修改ts时间戳
数据恢复
- 正常操作时的事务回滚
- 系统崩溃后的恢复
- 重做
- 反做
- 设置检查点。崩溃后恢复直接从检查点开始做
- 缓冲区管理
- 活动事务修改的块先不写磁盘
- 允许活动事务修改的块写磁盘
- 介质故障的恢复
- 数据转储
关系数据理论
问题的提出
- 问题
- 插入异常
- 删除异常
- 数据冗余
- 更新复杂
- 解决方法:模式分解
- 一个好的关系模式应该具备以下四个条件
- 尽可能少的数据冗余
- 没有插入异常
- 没有删除异常
- 没有更新异常
数据依赖
-
函数依赖:最重要
- 类似于变量之间的单值函数关系。设单值函数Y=F(X),自变量X的值可以决定一个唯一的函数值Y。
-
多值依赖
- 设R是属性集U上的关系模式,X,Y是U的子集,若对于R的任意一个可能的关系r, r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称“X函数确定Y”或“Y函数依赖于X”, 记作X→Y
- 非平凡函数依赖: 若X→Y, 但Y不包含于X, 则称X→Y是非平凡的函数依赖
- 平凡函数依赖: 若X→Y, 但Y包含于X, 则称X→Y是平凡的函数依赖
- 完全函数依赖
- 部分函数依赖
- 函数传递依赖
连接依赖
规范化
一范式(1NF):如果一个关系中的所有属性值均是原子的,则称该关系满足1NF。关系模型中的关系必须满足1NF
二范式(2NF): 若R∈1NF, 且每一个非主属性完全函数依赖于码, 则称R∈2NF (即消除非主属性对码的部分依赖)
-
三范式(3NF): 关系模式R中若不存在这样的码X, 属性组Y以及非主属性组Z (Z Y), 使得XY 、 YZ和Y X 成立,则称R3NF。
(即消除非主属性对码的传递依赖)- 如果关系模式R∈2NF,且每一个非主属性不传递依赖于任一候选关键字,则称R→NF
BCNF(Boyce Codd Normal Form): 关系模式R 1NF, 若XY且Y X时, X必含有码, 则R BCNF
数据依赖的公理系统
关系模式的分解
期末考试:
- [ ] 1. 填空(10')
- [ ] 2. 选择(10')
- [ ] 3. ER->关系模型(8')
- [ ] 4. SQL+关系代数(12')
- [ ] 5. 查询优化(6'-8')
- [ ] 6. 并发(8')
- [ ] 7. 故障恢复(8')
- [ ] 8. 关系理论(6')
我的话
最后说两句。。匆匆整理的东西就这些,SQL实在是多。所以懒得打了,大家应该自己也能看好。谁知道考试居然出了一分的考题考使用Students表创建视图IS_Students(信息学院学生信息的视图)的时候,添加什么语句使当更新IS_Students的时候,自动添加系属性为'IS'。。。刚刚在网上查了半天也没查到。希望有大牛看到的话知道可以告诉我~
最后一章关系数据实在看得我恶心。。而且符号也不好打。。很多直接从ppt上粘的公式显示不了,大家将就着看吧。。