数据库速通笔记
考前一天总算肝出来了(),感觉还是蛮有意思的。
数据库的基本概念
-
描述事物的符号记录称为数据
数据和语义是不可分的。
-
数据库是长期储存在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
-
数据库管理系统能够科学地组织和存储数据,高效的获取和维护数据。一般有以下几个特点
-
数据定义功能
提供数据定义语言,用户可以使用它对数据库中的数据对象的组成和结构进行定义。
-
数据组织、存储和管理
数据管理系统
要分类组织、存储和管理各种数据。确定具体存储数据的形式,如何实现数据之间的联系。提供多种存取方法(索引查找、hash查找、顺序查找等)以提高存取效率。 -
数据操纵功能
数据库管理系统
还提供数据操纵语言,用户可以使用它操纵数据,实现对数据库的基本操作,如查询、插入、删除和修改等。 -
数据库的事务管理和运行管理
数据库在建立、运用和维护时由
数据库管理系统
统一管理和控制以保证事务的正确运行,保证数据的安全性、完整性、并发正确性以及发生故障后的系统恢复。 -
数据库的建立和维护功能
包括数据库初始数据的输入、转换功能,数据库的转储、恢复功能,数据库的重组织功能和性能监视、分析功能等。通常由一些实用程序或管理工具完成。
-
其他功能
包括和其他软件系统的通信功能,一个
数据库管理系统
和另一个数据库管理系统
或文件系统的数据转换功能,异构数据库之间的互相访问和互相操作功能。
-
-
数据库系统是由数据库、
数据库管理系统
(及其应用开发工具)、应用程序和数据库管理员组成的存储、管理、处理和维护数据的系统。
其层次结构如下表示
1 | 应用程序--->应用开发工具--->数据库管理系统--->操作系统--->硬件 |
从文件系统
到数据库系统
标志着数据管理系统
的飞跃。
数据模型
数据模型是对现实世界数据特征的抽象。数据模型
是数据库系统
的核心和基础。分为两大类,概念模型 和 逻辑模型物理模型,属于不同的层次。
数据模型的组成要素
数据模型通常由数据结构、数据操作和数据的完整性约束条件三部分组成
-
数据结构描述数据库的组成对象以及对象之间的联系
-
数据操作是指对数据库中各种对象的实例允许执行的操作的集合,包括操作及有关的操作规则。
-
数据的完整性约束条件是一组完整性规则。
1 | 认识抽象 |
概念模型
按用户的观点对数据和信息建模,主要用于数据库设计。
基本概念
-
客观存在并可相互区别的事物称为实体
-
实体
所具有的某一特性称为属性 -
唯一标识
实体
的属性
集称为码 -
用实体名及其属性名集合来抽象和刻画同类实体,称为实体型
-
同一类型实体的集合称为实体集
-
实体之间的联系通常是指不同实体集之间的联系
实体之间的联系有一对一、一对多和多对多等多种类型
实体-联系方法 Entity-Relationship approach
E-R方法也称为E-R模型
逻辑模型和
逻辑模型有层次模型、网状模型、关系模型、面向对象数据模型、对象关系模型、半结构化数据数据模型。主要介绍前三种模型。
层次模型
层次模型是一颗树,每一个点定义了一个表结构。每一个表结构里的事例能够查找到点的孩子的一些实例,能满足一对多且每一个关系对应一个父关系的需要。
网状模型
网状模型是一个图,每一个点定义了一个表结构。每一个表结构里的事例均可能找到多个父亲和孩子实例,能满足多对多的需要。
关系模型
关系模型的数据结构
- 关系:一张表
- 元组:表中的一行
- 属性:表中的一列
- 属性组:表中的数列
- 码/键(key):表中的某个属性组能惟一确定学生
- 域:一组具有相同数据类型的值的集合
- 分量:元组的一个属性值
关系模型的数据操纵与完整性约束
操作对象和操作结果都是关系
物理模型
物理模型是对数据最底层的抽象,描述数据在系统内部的物理表示方式和存取方法。
首先将现实世界抽象为信息世界,然后将信息世界转换为机器世界。
数据库系统的结构
数据库系统的三级模式结构
1 | - 数据库 |
模式
模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
外模式
外模式也称子模式或用户模式,它是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
内模式
内模式也称存储模式,一个数据库只有一个内模式。它是数据库物理结构和存储方式的描述,是数据在数据库内部的组织方式。
数据库的二级映像功能和数据独立性
这两层映像分别保证了数据库系统中的数据能具有较高的逻辑独立性和物理独立性。
数据的逻辑独立性使数据的定义和描述可以从应用程序中分离出去,由于数据的存取由数据库管理系统管理,从而简化了应用程序的编制,大大减少了应用程序的维护和修改。
外模式/模式映像
当模式改变时,由数据库管理员对各个外模式/模式的映像作相应改变,可以使外模式保持不变。应用程序是依据数据的外模式编写的,从而应用程序无需修改,保证了数据和程序的逻辑独立性,简称数据的逻辑独立性。
模式/外模式映像
当数据库的存储结构改变时,由数据库管理员对模式/内模式映像作出相应改变,可以是模式保持不变,从而应用程序也不必改变。保证了数据与程序的无力独立性,简称数据的物理独立性。
关系数据库
关系数据结构及形式化定义
域是一组具有相同数据类型的集合。
域的笛卡尔积组成元组的集合。
域上的关系是的子集。n决定是几元关系,
表示为。
若关系中的某一属性组能唯一标识一个元组,而其子集不能,则称该属性组为候选码。
若关系有多个候选码
,则选定一个为主码。
候选码
的每个属性称为主属性,不包含在任何候选码
中的属性称为非主属性或非码属性。
无论什么情况,一个关系都存在候选码
,最坏情况向候选码
就是所有属性,称为全码。
关系模型
关系被应用于关系数据模型时需要满足
-
关系必须有限
-
通过在关系每一个列附加一个属性名的方法取消关系属性的有序性
关系被应用于表模型时有三种类型:基本关系(基本表)、查询表和视图表。
基本关系有以下6条性质
- 列是同质的
- 不同的列可以出自同一个域
- 列的顺序无所谓
- 行的顺序无所谓
- 任意两个元组的
候选码
不能取相同的值 - 分量必须不可再分
关系模式
关系模式描述了关系
是属性名集合
为中属性所来自的域
为属性向域的映像集合。
关系操作
关系操作是定义在元组集合上的运算。
1 | - 查询 |
关系数据语言
1 | 关系数据语言 |
关系完整性
关系模型中有三类完整性约束:实体完整性、参照完整性和用户定义的完整性。
其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,称作是关系的两个不变性。
实体完整性
实体完整性规则:若属性是基本关系的主属性,则不能取空值。
参照完整性
设是基本关系的一个或一组属性,但不是关系的码,是基本关系的``。如果和相对应,则称是的外码,并称基本关系为参照关系,基本关系为被参照关系或目标关系。
(即关系的某个属性组能跟其他关系的``建立双射)
参照完整性规则:若属性(或属性组)是基本关系的外码,他与基本关系的``相对应(可以等于),则对于中的每个元组在上的值必须:
- 或者全为空
- 或者等于中某个元组的值
(即双射建立在外码非空时的全等关系上)
关系代数
沿袭自传统的集合运算:并,差,交,笛卡尔积
专门的关系运算
-
选择,其中是谓词
-
投影,其中是中的属性组或者属性
-
连接,其中和分别为和上列数相等且可比的属性组,是比较运算符
-
自然连接是两关系相同属性组成的属性组应用相等运算符得到的关系。
被舍弃的元组称为悬浮元组
如果把悬浮元组也保存在结果关系中,而在其他属性上填空值,那么这种连接称为外连接,如果只保留左边关系中的悬浮元组就叫做左外连接,同理只保留右边关系叫做右外连接,记作。 -
除运算 ,其中关系和关系,可以有不同的属性名,但必须属于相同的域集,为在中的象集,
也即
SQL
SQL中同样支持关系数据库三级模式结构
1 | ----外部应用程序-- |
下表列出了常用的基本命令
SQL功能 | 动词 |
---|---|
数据查询 | SELECT |
数据定义 | CREATE,DROP,ALTER |
数据语句 | INSERT,UPDATE,DELETE |
数据控制 | GRANT,REVOKE |
下文中将用巴科斯范式描述SQL语言
数据定义
下表列出了数据定义语句
操作对象 | 操作方式 | ||
---|---|---|---|
创建(CREATE) | 删除(DROP) | 修改(ALTER) | |
模式(SCHEMA) | CREATE SCHEMA | DROP SCHEMA | 不存在 |
表(TABLE) | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图(VIEW) | CREATE VIEW | DROP VIEW | 不存在 |
索引(INDEX) | CREATE INDEX | DROP INDEX | ALTER INDEX |
模式
1 | CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句> | <视图定义子句> | <授权定义子句>] |
创建模式相当于创建了一个命名空间。
模式与表
可以通过"<模式名>.<表名>"
充当<表名>
显式指定一个表,如果不给出则查找搜索路径。
搜索路径是一个模式列表,依次尝试每个模式中代入运行。
1 | SHOW seach_path; |
表
1 | CREATE TABLE <表名>(<列名> <数据类型> [列级完整性约束条件] |
其中数据类型如下表
数据类型 | 含义 |
---|---|
CHAR(n) | char[n] |
VARCHAR(n) | 最大长度为n的变长字符串 |
CLOB | 字符串大对象 |
BLOB | 二进制大对象 |
SMALLINT | i16 |
INT | i32 |
BIGINT | i64 |
NUMERIC(p,d),DECIMAL(p,d),DEC(p,d) | p位数字小数点后d位定点数 |
REAL | float |
DOUBLE PRECISION | double |
FLOAT(n) | 位数大于n的浮点数 |
BOOLEAN | bool |
DATE | 日期,YYYY-MM-DD |
TIME | 时间,HH:MM:SS |
TIMESTAMP | 时间戳 |
INTERVAL | 时间间隔 |
1 | ALTER TALBE <表名> |
1 | DROP TABLE <表名> [CASCADE|RESTRICT] ; |
索引
1 | CREATE [UNIQUE] [CLUSTER] INDEX <索引名> |
<次序>
可选DESC
或ASC
1 | ALTER INDEX <旧索引名> RENAME TO <新索引名> |
1 | DROP INDEX <索引名> |
数据查询
单个表查询
1 | SELECT [ALL|DISDINCT] <目标列表达式>[,<目标列表达式>]... |
<条件表达式>
是接收一个元组的谓词,可以使用所有比较符、NOT
、BETWEEN AND
、IN
、LIKE
(字符串匹配)、IS NULL
。
IN
接受一个SELECT
子句,这个SELECT
子句被称为子查询,如果子查询的WHERE
不依赖父查询,则称不相关子查询
。反之则是相关子查询
,整个查询子句称为相关嵌套查询。
<目标列表达式>
以及条件表达式
中除了使用属性名外,也可以使用聚焦函数对每个组(如果有的话)进行属性的计算之后筛选。有以下聚焦函数
1 | COUNT(*) 计数 |
其中ORDER BY
只能在最外层使用。
多个表查询
上述<表名或视图名>
也可以为多个表,按照命名空间查询规则查询条件表达式中属性的来源。
1 | <表名/视图名 1>[连接修饰][,<表名/视图名 2>[连接修饰]] |
默认从笛卡尔积上查询。连接修饰可以单纯是[名字]
表示别名(自身笛卡尔积);也可以LEFT OUTER JOIN SC ON(<条件表达式>)
左连接等表示连接的谓词。
查询的组合
查询的结果是一个集合,也可以进行集合的操作:并UNION
、交INTERSECT
和差EXCEPT
。
查询的一般形式
1 | SELECT [ALL|DISTINCT] <目标列表达式> [别名] [,<目标列表达式 [别名]>]... |
1 | <目标列表达式> :* | |
数据更新
插入常量
1 | INSERT |
插入查询结果
1 | INSERT |
修改元组
1 | UPDATE <表名> |
删除数据
1 | DELETE |
定义视图(外模式)
1 | CREATE VIEW <视图名> [(<列名> [,<列名>]...)] |
WITH CHECK OPTION
表示修改视图时是否要保证满足视图中子查询的条件。
视图的可更新话题过于深奥,简单的视图是可以更新的。
关系数据理论
依赖
数据重复一直是关系模式中很大的问题,对此引入了数据依赖。
数据依赖:一个关系内部属性和属性之间的一种约束关系,这种约束关系是通过属性间值的相等与否体现出来的数据间相关联系。
对于这么一个表中存在以下问题
Sno | Sname | Cname |
---|---|---|
0 | 小张 | 数据结构 |
1 | 小红 | 数据结构 |
1 | 小红 | 高等数学 |
2 | 小明 | 数据结构 |
… | … | … |
- 数据冗余
没有引用这个概念,相同数据(小红名字)以值相同来标记,浪费了空间。
- 更新异常
因为没有引用,导致如果要进行更换课程名这种层次比较高的操作,需要更新非常大的数据。
- 插入异常
如果一个课刚开办,没有学生,则无法存入数据库。
- 删除异常
如果一个课程的学生全部毕业了,则删除完成后课程信息也丢失了。
规范化
数据依赖主要分为函数依赖和多值依赖。
函数依赖
一个平凡的思想在关系模式中尝试找到一个函数从属性组映射到一个属性,表示为->,那么就可以通过数据结构高速维护这个关系。
如果,但,则称是非平凡的函数依赖。
如果,但,则称是平凡的函数依赖。
如果,则称为这个函数依赖的决定属性组,也被称为决定因素。
如果,,则记作
若不函数依赖,则记作
在中,如果,并且对于的任何一个真子集,都有,则称对完全函数依赖,记作。
如果,但不完全函数依赖,则称对部分函数依赖。
如果则称对传递函数依赖。
设为中的属性或属性集合,若,则称为的候选码
。
如果,则称为超码,候选码
是特殊的超码。
如果候选码
多于一个,则选定其中一个为主码
。
包含在任何一个候选码
中的属性为主属性,不包含在任何候选码
的属性称为非主属性
或非码属性。最简单的情况,单个属性是码;最极端的情况,整个属性组是码,称为全码。``和候选码
都可以称为码。
对于码,
范式
类似X型文法。
一个低一级(编号低)的范式的关系模式通过模式分解可以转换为若干个高一级范式的关系模式的集合,这个过程被称为规范化。
以下条件依次加强。
1NF
每一个分量不可再分。
2NF
每一个非主属性
完全函数依赖于任何一个候选码
。
多加了其他关系进去,如果A->B,(A,C)->D把ABCD混进一个关系模式中就会不满足2NF
3NF
设关系模式,若中不存在码,属性组及非主属性
使得成立,,则称。
不存在传递依赖,如果A->B,B->C把ABC混进一个关系模式中就会不满足3NF,但满足2NF
多值依赖
关系模式中多值依赖成立,当且仅当,给定的一对值,有一组的值,这组值仅仅决定于值而与值无关。
如,而,则称为平凡的多值依赖。即
即
- 对称性:则
- 传递性:则
- 函数依赖是多值依赖的特殊情况:则
4NF
关系模式,若对于中每个非平凡多值依赖,都含有码,则称。
数据库设计
需求分析->概念结构设计阶段->逻辑结构设计阶段->物理结构设计阶段
概念结构设计
E-R模型
E-R模型/图分为三种节点(实体,属性,联系)
实体用长方形表示,属性用椭圆表示,联系用棱形表示。
实体即对象,属性即成员变量,联系即实体之间的动词,联系也可以有属性。
实体之间的联系有三种情况
- 一对一(1:1)
- 一对多(1:n)
- 多对多(m:n)
线程和进程?
其中的n/m/1在联系和实体之间连线上标注。
扩展的E-R模型
ISA(is a)联系
实体之间的继承关系可以用三角形连接实体,上面表示父实体,标注继承信息。
如果不存在同时是
基数约束
基数约束是对实体间一对一、一对多和多对多联系的细化。
约束用一个数对min…max表示。
Part-of联系
如果一个实体存在的话必须依赖另一个实体存在。则称为弱实体型,否则称为强实体型。
弱实体型用双边框的长方形表示,这个依赖关系用双边框的棱形表示。
逻辑结构设计
-
一个1:1的联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
-
一个1:n的联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。
-
一个m:n联系转换为一个关系模式。
-
三个或三个以上的实体间的一个多元联系可以转换为一个关系模式。
-
具有相同码的关系模式可以合并。
事务处理
事务是用户定义的一个数据库操作序列,事务具有原子性。
扩展阅读:C++事务性内存
事务具有ACID特性
-
原子性(Atomicity)
-
一致性(Consistency)
事务的执行成功不会破坏数据库的一致性状态。
-
隔离性(Isolation)
并发的事务之间不能干扰,其结果和不并发的结果一致。
-
持续性(Durability)
如果事务成功,则这个事务的成功不会在之后变成失败。