后续会把图片
重点:数据库的四个基本概念,数据库的常见数据模型
1)数据(Data):描述事务的符号记录
2)数据库(DB):概括地讲,数据库具有永久存储、有组织和可共享的三个基本特点。
严格地讲,数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余、较高的数据独立性和易扩展性,并可为各种用户共享。
3)数据库管理系统(DBMS):位于用户和操作之间的一层数据管理软件。和操作系统一样是计算机的基础软件。
主要功能:
4)数据库系统(DBS):是由数据库、数据库管理系统(及其应用开发工具)、应用程序和数据库管理员(DBA)组成的存储、管理、处理和维护数据的系统。
1)人工管理阶段:数据不保存、不共享,不具有独立性。
2)文件系统阶段:可保存,但共享性差,冗余度大,独立性差。
3)数据库管理系统阶段:数据库系统的出现使得信息系统从以加工数据的程序为中心转向围绕共享的数据为中心的新阶段。特点:
a)实现整体数据的结构化
b)数据的共享性高、冗余度低且易扩充:数据共享可以大大减少数据冗余,节约存储空间。
c)数据的独立性高
d)数据由数据库管理系统统一管理和控制
1)两类数据模型:概念模型、逻辑模型 + 物理模型(人们首相将现实世界抽象为信息世界,然后将信息世界转换为机器世界)
a)概念模型:也称信息模型,它是按用户观点来对数据和信息建模,主要用于数据库设计。
基本概念:
实体:客观存在并且可相互区别的事务 人
属性:实体所具有的某一特性 人的鼻子、嘴巴
码:唯一标识实体的属性 身份证号
实体型:用实体名及其属性集合来抽象和刻画同类实体 含有鼻子和嘴巴的人
实体集:同一类型实体的集合 城市
联系:实体之间的联系通常是指不同实体集之间的联系。实体之间的联系有一对一、一对多和多对多等联系。
概念模型的一种表示方法:实体-联系方法,用** E-R 图(例子如下)**来描述现实世界的概念模型。
*E-R 图分为实体、属性、关系三个核心部分,实体是长方形,属性是椭圆形,关系为菱形。
b)逻辑模型:它是按计算机系统的观点对数据建模,主要用于数据库管理系统的实现。
逻辑模型包括:
物理模型:是对数据最底层的抽象,它描述数据在系统内部的表示方法和存取方法,或在磁盘/磁带上的存储方式和存取方法,是面向计算机系统的。
联系:
*常用的数据模型:层次模型,网状模型,关系模型,面向对象数据模型,对象关系数据模型,半结构化数据模型。
1)层次模型:
a)有且只有一个节点没有双亲节点,这个节点成为根节点
b)根以外的其他节点有且只有一个双亲节点
2)网状模型:
a)允许一个以上的节点无双亲
b)一个节点可以有多于一个双亲
1)模式(Schema)是数据库中全体数据的逻辑结构和特征的描述,它仅仅涉及型的描述,不涉及具体的值。其中一个具体值成为模式的一个实例(Instance)。
模式是相对稳定的,实例是相对变动的。
数据库系统的三级模式结构:
外模式:也称子模式或用户模式,它是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
模式:也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
内模式:也称存储模式,一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式。
2)二级映像
外模式/模式映像:当模式改变时,由数据库管理员对各个外模式/模式映像作相应改变,可以使外模式保持不变,应用程序不必修改。保证了数据与程序的逻辑独立性。
模式/内模式映像:当数据库的存储结构改变时,有数据库管理员对模式/内模式作相应改变,可以使模式保持不变,从而应用程序也不用改变。保证了数据与程序的物理独立性。
数据与程序之间的独立性使得数据的定义和描述可以从应用程序中分离出去,另外,由于数据的存取由数据库管理系统管理,从而简化了应用程序的编制,大大减少了应用程序的维护和修改。
1)硬件平台及数据库:足够大内存,磁盘或磁盘阵列等设备,较高的通道能力以提高数据的传送率。
2)软件:数据库管理系统,支持数据库管理系统运行的操作系统,具有与数据库接口的高级语言及其编译系统,以数据库管理系统为核心的应用开发工具,为特定应用环境开发的数据库应用系统。
3)人员:开发、管理和使用数据库的人员主要包括数据库管理员、系统分析员和数据库系统设计人员、应用程序员和最终用户。
数据库管理员职责:决定数据库中的信息内容和结构、决定数据库的存储结构和存取策略、定义数据库的安全性要求和完整性约束条件、监控数据库的使用和运行、数据库的改进和重组、重构。
1)关系模式:对关系的描述
2)什么是关系?
关系是一张表,一张二维表
3)关系有哪些需要描述?
可以形象地表示为 R ( U , D , D O M , F ) R(U,D,DOM,F) R(U,D,DOM,F)
R R R 关系名
U U U 所有属性名
D D D 属性来自哪些域
D O M DOM DOM 属性和域的映射
F F F 属性间的依赖关系
关系操作
查询的基本操作:选择、投影、并、差、笛卡尔积
分为关系代数语言(重点)、关系演算语言(了解)、SQL 语言。
1)关系代数语言
关系代数语言是一种抽象的查询语言,它用对关系的运算来表达查询。
三大要素:运算对象(关系)、运算符(集合运算符和专门的关系运算符)和运算结果(关系)
a)选择
巩固写法:
σ S d e p t = ′ I S ′ ( S t u d e n t ) \sigma _{Sdept='IS'} (Student) σSdept=′IS′(Student)
σ S a g e < 20 ( S t u d e n t ) \sigma _{Sage<20} (Student) σSage<20(Student)
b)投影
c)连接
c-1)非等值、等值、自然连接:
c-2)外连接:
悬浮元组:两个关系 R 和 S 在做自然连接时,R 中某些元组可能在 S 中不存在公共属性上相等的元组,从而造成 R 中这些元组在操作时被舍弃了,这些被舍弃的元组称为悬浮元组。
外连接:把悬浮元组也保存在结果关系中,而在其他属性上填上空值(NULL)。
左外连接:只保留左关系 R 中的悬浮元组。
右外连接:只保留右关系 S 中的悬浮元组。
4)除运算
保留 R 中满足 S 的,而且 R 中要去掉 S 的列。
1)实体完整性
主码唯一且非空
2)参照完整性
外码要么为空,要么对应另一表的主码
3)用户定义完整性
写表要完整,比如学号多少,姓名、班级、专业之类,一定要都写好。
SQL 是 Structed Query Language 的缩写,意思是结构化查询语言,是一种在数据库管理系统中查询或对数据库内数据进行更改的语言。
a)数据定义语言 DDL(Data Definition Language)
SQL 数据定义语言主要用来定义逻辑结构,包括定义基表、视图和索引。
删除表、定义表、修改表
b)数据查询语言 DQL(Data Query Language)
SQL 数据查询语言主要用来对数据库中的各种数据对象进行查询。
c)数据操纵语言 DML(Data Manipulation Language)
SQL 数据操纵语言,用于改变数据库中的数据,包括插入、删除、修改。
d)数据控制语言 DCL(Data Control Language)
SQL 数据控制语言,对表和视图的授权,完整性规则的描述以及事务开始和结束等控制语句。
2)SQL 语言的特点
a)综合统一
独立完成数据库生命周期中的全部活动,包括定义关系模式、录入数据、建立数据库、查询、更新、维护、数据库重构、数据库安全。
b)高度非过程化
用户只需提出“做什么”,而不必指明"怎么做”。
c)面向集合的操作方式
SQL 采用集合操作方式。
d)以同一种语法结构提供两种使用方式
SQL 既是自含式语言,又是嵌入式语言。SQL 语句能够嵌入到高级语言程序中。
e)语言简洁,易学易用
SQL 语言语法简单,接近英语口语,因此容易学习,也容易使用。
2)模式的定义与删除
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>;
CREATE SCHEMA "S-T" AUTHORIZATION Panzhicheng;
b)模式定义 + 视图
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句> | <视图定义子句> | <授权定义子句>];
CREATE SCHEMA "S-T" AUTHORIZATION Panzhicheng
CREATE TABLE User(id INT PRIMARY KEY,
age INT,
name CHAR(20));
c)模式删除
DROP SCHEMA <模式名> <CASCADE | RESTRICT>;
删除模式,其中 CASCADE
和 RESTRICT
,必须二选一。
CASCADE
级联:删除模式的同时也会把该模式的所有数据库对象删除。
RESTRICT
限制:如果该模式下有下属对象,比如表视图,就拒绝这个删除语句的执行。
3)表的定义、删除和修改
a)定义
-- 关键字可忽略大小写
create table User(name varchar(20) primary key,
age int,
sex char(1) not null);
b)删除
DROP TABLE <表名> <CASCADE | RESTRICT>;
CASCADE
如果表有外码,视图,触发器,也会强行删除。
RESTRICT
反之
c)修改
ALTER TABLE <表名>
[ADD [COLUMN] <新列名> <数据类型> [完整性约束]]
[ADD <表级完整性约束>];
ALTER TABLE Student
ADD S_entrance DATE;
-- 将年龄的数据类型改为整数类型
ALTER TABLE Student
ALTER COLUMN Sage INT;
4)索引的建立、修改和删除
数据量比较大的时候,查询耗时大,建立索引可以有效减少时间消耗。
索引可以建立在一列或多列上。
a)建立
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名> (<列名>) -- 这里的情况比较复杂,列举一个简单的
CREATE UNIQUE INDEX Stusno
ON Student(Sno);
UNIQUE
唯一索引
CLUSTER
聚簇索引:物理顺序与索引的逻辑顺序相同,比如买书。
b)修改
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
c)删除
DROP INDEX <索引名>;
5)数据字典
数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。关系数据库管理系统在执行SQL 的数据定义语句时,实际上就是在更新数据字典表中的相应信息。在进行查询优化和查询处理时,数据字典中的信息是其重要依据。
一般格式为:
SELECT [ALL | DISTINCT] <目标表达式> [, <目标表达式>...] ...
FROM <表名或视图名> [, <表名或视图名>..] --或者再写个子查询
[WHERE <条件表达式>]
[GROUP BY <列名 1> [HAVING <条件表达式>]]
[ORDER BY <列名 2> [ASC | DESC]];
3)嵌套查询
4)集合查询
5)基于派生表的查询
1)插入数据
INSERT INTO <表名> [(<属性列 1> [, <属性列 2> ...])]
VALUES (<常量 1> [, <常量 2>...])
2)修改数据
3)删除数据
1)定义视图
2)查询视图
3)更新视图
4)视图的作用
重点:安全控制
定义:数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。
1)数据库安全性控制
a)用户身份鉴别
b)存取控制
c)自主存取控制方法(重点)
字面意思就是我们用户可以自定和分配其他用户的操作权限。
主要通过 grant
、revoke
来进行控制
由两个元素构成:数据库对象 和 操作权限
我们定义用户的存取权限 称为授权
2)主要存取权限
Reference 权限代表是否允许创建外键
3)授权 GRANT
GRANT <权限> ON <表名>[列名] TO <用户> [WITH GRANT OPTION];
-- 我们只列了一个常用的(这样比较清晰),当然,权限可以有多个
4)回收权限 REVOKE
RVOKE <权限> ON <表名> FROM <用户> CASCADE;
5)数据库角色
角色是指一类人,比如说 CEO、总监、普通职员,可以给一类人授权
a)角色创建
CREATE ROLE <角色名>;
CREATE ROLE CEO;
b)角色授权
GRANT <权限> ON <表名>[列名] TO <角色> [WITH GRANT OPTION];
GRANT SELECT ON Employee TO CEO ;
c)把角色授权给其他用户或角色
GRANT <角色> TO <其他角色或用户> [WITH ADMIN OPTION];
GRANT CEO TO Panzhicheng WITH ADMIN OPTION;
如果加上 WITH ADMIN OPTION,意味着,这个用户还可以吧这权限授予给其他角色或者用户。
d)角色权限收回
REVOKE <权限> ON <表名> FROM <角色>;
REVOKE SELECT ON Employee FROM CEO;
为不同的用户定义不同的视图,把不需要的数据给隐藏起来,这样用户就不会误操作。
-- 1. 创建视图
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERE Sdept = ‘IS’;
-- 2. 授权角色
GRANT SELECT ON CS_Student TO Panzhicheng;
GRANT ALL_PRIVILEGES ON CS_Student TO Panzhicheng;
记录到审计日志,然后看日志,里面是否有非法行为。
1)对 修改 SC 数据的操作进行审计
AUDIT UPDATE ON SC;
2)取消 对 SC 表的一切审计
NOAUDIT UPDATE ON SC;
通过一些加密算法,把明文变成密文,这样别人就无法查看。
数据库的完整性(integrity)是指数据的正确性(correctness)和相容性(compat- ability)。
a)正确性
符合现实世界的描述
b)相容性
同一个对象在不同表里面是符合逻辑,比如我的地址、年龄,在不同的表里应该一致
维护完整性需要:
三大完整性:
主码唯一,且非空
CREATE TABLE Course (id NOT NULL PRIMARY KEY,
name VARCHAR(255));
外码要么没有,要么只有一个
CREATE TABLE Course (id NOT NULL,
name VARCHAR(255),
teacher_id INT,
PRIMARY KEY(id),
FOREIGN KEY(ID) REFERENCES Course_description(Course_id));
1)非空 NOT NULL
2)列值唯一 UNIQUE
3)满足某一个条件表达式 CHECK
CREATE TABLE SC (Sno CHAR(9) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2) CHECK (Ssex IN ('男', '女'));
在 SQL 中可以使用数据定义语言中的 CREATE ASSERTION
语句,通过声明性断言(declarative assertions)来指定更具一般性的约束。可以定义涉及多个表或聚集操作的比较复杂的完整性约束。断言创建以后,任何对断言中所涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。
1)创建断言
CREATE ASSERTION <断言名> <CHECK子句>;
2)删除断言
DROP ASSERTION <断言名>;
触发器也叫做 事件 -> 条件 -> 动作 规则。
当对一个表增删改的时候,对触发器里面的条件进行检查,如果成立就会执行触发器里的动作,否则不执行里面的动作。
目标:
- 了解依赖、候选码的概念
- 掌握如何求最小候选码
- 掌握数据库三大范式和 BCNF 的概念
- 掌握如何求最小函数依赖集
- 掌握如何求模式分解
关系模式存在的问题:
更新异常;
插入异常;
删除异常。
范式:范式越高,数据库冗余越小
1)平凡函数依赖和非平凡函数依赖
X → Y X \rightarrow Y X→Y,但 Y ⊆ X Y \subseteq X Y⊆X,则称 X → Y X \rightarrow Y X→Y 是平凡函数依赖
非平凡则是 不包含,我们默认讨论非平凡的函数依赖。
举个例子,给定关系:学生ID,学生姓名,所修课程ID,课程名称,成绩
a)完全函数依赖
(学生ID,所修课程ID)→ 成绩
成绩既不能单独依赖于学生ID,也不能单独依赖于所修课程ID,因此成绩完全函数依赖于关键字。
成绩 完全依赖于 (学生ID,所修课程ID)
b)部分函数依赖和传递函数依赖
有了完全依赖的概念,理解后面两个不难
1)候选码:可以推出所有属性(注意是完全依赖,这个和只要达成部分依赖的超码相区别)
2)如何选出候选码?
题目: R ( U , F ) , U ( A , B , C , D , E , G ) , F = { A B → C , C D → E , E → A , A → G } R(U,F), U(A,B,C,D,E,G),F=\left \{ AB\rightarrow C, CD \rightarrow E,E \rightarrow A, A \rightarrow G \right \} R(U,F),U(A,B,C,D,E,G),F={AB→C,CD→E,E→A,A→G},求候选码?
解:
(1)首先按照前 4 条规则,得到
一定是候选码: B、D
一定不不是候选码: G
可能是候选码: A、C、E
(2)按照第 5 条规则求闭包,得到
BD 推不出东西,所以要把每一个可能的值放进去求闭包
(BDA)+ 可以推出 CEAG,即(BDA)+=ABCDEG
(BDC)+=ABCDEG
(BDE)+=ABCDEG
所以,候选码最终是 {(BDA),(BDC),(BDE)}。
3)超码:能表示出所有属性的集合,比如(BDA),(BDC),(BDE),(BDCA),(BDEA)等
候选码是最小的超码
主码:从候选码里任意挑出一个,作为主码
主属性:包含在所有候选码中的属性,比如 ABCDE
非主属性:不包含在所有候选码中的属性,比如 G
最简单的情况,单个属性是码;最极端的情况,整个属性组是码,称为全码。
在后面的章节中主码或候选码都简称为码。
2)2NF:不包含非主属性对码的部分函数依赖,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表
3)3NF:不包含非主属性对码的传递函数依赖,确保数据表中的每一列数据都和主码直接相关,而不能间接相关
4)BCNF:消除每一个属性对候选码的传递依赖,BCNF 是修正的 3NF
换言之,对于关系模式 R,如果每一个函数依赖的决定因素都包含键,则 R 属于 BCNF 范式。
现在举例,现有关系模式:通讯(城市名,街道名,邮政编码)
函数依赖关系集为:
F={(城市名,街道名)-> 邮政编码,邮政编码 -> 城市名}
也就是一个城市名和一个街道名,对应一个邮政编码;一个邮政编码对应一个城市名。
此时,候选键(城市名,街道名)非主属性邮政编码完全依赖于候选键,且无传递依赖,属于3NF。
那么它是否属于BCNF呢?我们按照下面的定义来看一下,
换言之,对于关系模式 R,如果每一个函数依赖的决定因素都包含键,则 R 属于 BCNF 范式。
对于决定因素(城市名,街道名),它包含键(城市名,街道名),其实它本身就是键了,没问题;
对于决定因素邮政编码,它不包含键(城市名,街道名)
所以它不属于 BCNF。在关系模式 R 中,如果每一个决定因素都包含码,则 R 属于 BCNF。
1)Armstrong 公理系统
2)求最小函数依赖
什么是依赖?
依赖是指关系中一个或一组属性可以决定其他属性
如何求最小函数依赖?
a)拆右边多个元素的 比如 A->BC 拆为 A->B 和 A->C
b)除去当前元素,求它的闭包,把集合里面所有元素都弄完
c)左边最小化(通过遮住元素来看能不能推出其他元素) 比如 BCD,遮住 B 看能推出 CD 吗,遮住 C 能推出 BD 吗,遮住 D 看能推出 BC 吗
例题 对于关系 ABCDEFG,已知
若K为R关系的属性或属性组合,若U函数依赖于K,则K为R的候选码
理解:其实就是比较广义,比如我们只要ID就能确定一个元组,但是(ID,姓名)也是候选码,显得没有必要。
基本步骤:
嵌入式SQL
将SQL嵌入程序设计语言中
查询处理 和 查询优化
查询优化可分为
优化器产出执行计划
CodeGen 代码生成器生成代码
实现查询操作的算法
全表扫描
对于小表,这种方法很好,但是对于大表不好
索引(或散列)的扫描方法
通过索引先找到满足条件的元组主码或元组指针,然后通过
查询优化器可以从数据字典中获取许多统计信息,根据这些信息作出正确的估算,选择高校的执行计划。
总体目标就是让查询代价最小化
事务是用户定义的一个数据库操作序列,要么全做,要么全部做。
日志文件是用来记录事务对数据库更新操作的文件。日志文件主要有以下两种格式:
日志文件的作用:
事务是并发控制的基本单位,保证事务ACID特性是事务处理的重要任务。
事务的ACID可能遭到破坏的原因是多个事务对数据库的并发操作造成的。
为了保证事务的隔离性和一致性,DBMS需要读并发操作进行正确调度。
并发操作带来的数据不一致性主要包括:
产生三类数据不一致性的主要原因是并发操作破坏了事务的隔离性。
基本的锁有两类:
1.一级封锁协议
T在修改数据R之前必须对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。
修改时,必须加X锁,直到结束
2.二级封锁协议
在一级的基础上,增加T在读取数据R之前必须对其加S锁,读完后释放S锁。二级封锁协议除了防止丢失修改外,还可以进一步防止读脏数据。
读时,必须加S锁,用完就释放
3.三级封锁协议
三级是在一级的基础上增加T在读取数据R之前必须加S锁,直到事务结束才释放,进一步防止了不可重复读。
读时,必须加S锁,直到结束
a)活锁:T2一直没拿到锁
解决方法可以是采用先来先服务策略
b)死锁:如图(b)所示,发生了冲突。
解决方法主要分为预防死锁和…
可能我们能想到,一段代码写入 csv 文件,再去读这些 csv 文件。
但是有人就想到用一种数据模型,去管理这些数据,使得基于这些数据的操作更加简单。
结构化数据,更加通用。
历史:一开始有个 R 原型系统,他没发明语言,就是逻辑上提出了一个 SE 什么的,结构化英语查询语言,后来就演化为 SQL 了。SQL 有很多标准,但是大部分系统至少支持 SQL-92。
SQL 让我们只需要关系我们需要什么,剩下的交给数据库去做,就是这样的高级语言。
SQL 是基于关系代数的。
例子:我们给定一个需求,A 和 B 连接再选取是一种思路,去写了一段 SQL。但是如果 B 表有 10 亿行,连接的代价一定是巨大的,我们会有一个代数上的优化过程,比如先从 B 表选择满足条件的记录,这个 filter 执行很快,可能就选出了 3 行,用这 3 行去和 A 表 连接,输出结果。这就是基本关系代数执行顺序改变之后的查询优化。
DML:数据操纵。
DDL:定义。
DCL:Control。
聚合:AVG、MIN、MAX、SUM 之类的函数。
没有完美的 Hash 函数
现在用的一些哈希函数
我们关心哈希函数速度有多快,碰撞率什么情况?