第一部分 基本知识与关系模型
- 数据库管理系统功能
- 数据库定义:DDL,定义表的信息
- 数据库操纵:DML,对数据进行修改等操作
- 数据库控制:DCL,定义不同操作和操作者的约束
- 数据库维护
- DDL、DML、DCL构成SQL(结构化的数据库语言)
- DBMS的功能:编译与执行控制、查询优化实现、存储与索引、通信控制、事务管理、故障恢复、安全性控制、完整性控制、数据字典管理、应用程序接口、数据库数据装载、重组、数据库性能分析等等。
- 三级模式两层映像
- 外部模式(用户模式):用户看到的数据的结构化描述
- 概念模式(逻辑模式):数据之间的内在联系
- 内部模式(物理模式):数据的存储路径、存储方式、索引方式等
- E-C 映像:便于用户观察和使用
- C-I 映像:便于计算机进行存储和处理
- 两个独立性:
- 逻辑数据独立性:概念模式变化,只需改变E-C映像
- 物理数据独立性:内部模式变化,只需改变C-I映像
- 候选键/候选码:关系中能够唯一标识一个元组的属性组。
- 主键/主码:DBMS通过主码作为主要线索管理元组,多个候选码时选定一个作为主码。
- 全码:所有属性构成这个关系的候选码
- 外码/外键:一个关系R中的属性组不是R的候选码而是与另一个关系S的候选码相对应,这个属性组是R的外码或外键。
- 实体完整性:关系的主码属性值不能为空值。
- 参照完整性:如果关系R1的某个元组t1参照了关系R2的某个元组t2,则t2必须存在。
- 并相容性:关系R和S存在相容性当且仅当R和S的属性数目相同且对于任意i关系R的第i个属性域和S的第i个属性域相同。
- 关系代数的基本运算:并、差、笛卡尔积(( imes))、选择((sigma))、投影((prod))
- ( heta)连接运算无需删除属性,而自然连接和外连接需要去掉重复的属性列。
- 外连接:两个关系R和S进行连接时,如果关系R(S)中的元组在S(R)中找不到相匹配的元组,则为了避免该元组信息丢失,从而将该元组与S(R)中假定存在的全为空值的元组形成连接,放置在结果关系中。
- 关系元组运算符的优先次序:括号、( heta)、(exists)、(forall)、(
eg)、(land)、(lor)
- 元组运算中使用<>表示不等于
- 元组演算是以元组为变量,以元组为基本处理单位,先找到元组然后再找到元组分量,进行谓词判断;域演算是以域变量为基本处理单位,先有域变量,然后再判断由这些域变量组成的远足是否存在或是否满足谓词判断。
- QBE操作框架:
- QBE操作种类:Print(P.)、Delete(D.)、Update(U.)、Insert(I.)
- QBE查询:
- 简单条件:( heta)参量
- QBE上不同属性的与条件可以写在同一行中
- 示例元素与投影:条件( heta)参量中的参量也可以是域变量,用任何一个值带有下划线表示,被称为示例元素。示例元素下划线上面的值不起作用,被当作域变量名称来对待,只用于占位或是连接条件。当不是显示所有内容时,可在条件区对应要显示的列下面书写显示输出命令。
- 用示例元素实现与和或运算:当写或运算时,可以采用多行书写并在打印命令之后使用不同的示例元素来表征;与运算的情况下,在相互存在与关系的行使用相同的示例元素,
- 括号的条件表示:将(
eg)、(land)、(lor)运算符写在操作区时,是对整行条件而言,相当于该行条件放在括号中。
- 用示例元素实现多个表的连接:当检索涉及多个表时,可利用同一连接条件使用相同的示例元素,来实现多个表的连接。
- 关系代数是一种集合运算,是安全的;关系演算不一定是安全的。不产生无限关系和无穷验证的运算被称为是安全的。
- 满足下面条件的元组演算表达式{t| (psi)(t)}称为安全表达式
- 只要t满足(psi)、t的每个分量就是DOM((psi))的一个成员
- 对于(psi)中形如((exists)u)((omega)(u))的子表达式,若u满足(omega),则u的每个分量都是DOM((psi))中的一个成员。
- 对于(psi)中形如((forall)u)((omega)(u))的子表达式,若u不满足(omega),则u的每个分量都是DOM((psi))中的一个成员。
第二部分 数据库语言-SQL
- SQL语言中定义的标准数据类型(部分)
- numeric(p, q)固定精度数字,小数点左边p位,右边p-q位
- date:日期
- time:时间
- SQL的结果排序问题:order by 列名 [asc|desc]
- SQL中多表连接时,如果两个表的属性名相同,则需采用表名.属性名方式来限定该属性属于哪一个表。
- 使用( heta) some/ ( heta) all来进行查询,如果表达式的值至少与子查询结果的某一个值相比较满足( heta)关系,则( heta) some的查询结果为真;如果表达式的值与子查询结果的所有值相比较都满足( heta)关系,则表达式( heta) all的结果为真。
- not in 等价于 <> all
- 结果计算:Select-From-Where语句中,Select子句后面不仅可以是列名,而且可以是一些计算表达式或聚集函数,表名在投影的同时直接进行一些运算
select 列名|expr|agfunc(列名) [[, 列名|expr|agfunc(列名)]...] from 表名1[, 表名2] [where 条件];
- expr可以是常量、列名或由常量、列名、特殊函数及算术运算符构成的算术运算式。agfunc是一些聚集函数,例如COUNT、SUM、AVG、MAX、MIN
- 使用Group by进行分组查询,通过Having进行分组过滤。
- SQL实现关系代数操作,其中带ALL的保留着重复的元组
- 并 Union (ALL)
- 交 Intersect (ALL)
- 差 Except (ALL)
- SQL的高级语法引入内连接与外连接:
select 列名 [[,列名]...]
from 表名1 [NATURAL]
[INNER | {LEFT | RIGHT | FULL} [OUTER]] JOIN 表名2
{ON 连接条件 | Using (Colname, {, Colname ...}) }
[Where 检索条件]...;
- 数据库完整性是指DBMS应保证的DB的一种特性--在任何情况下的正确性、有效性和一致性
- 完整性约束
- 域完整性约束条件:施加于某一列上,对给定列上所要更新的某一候选值是否可以接受进行约束条件判断。
- 关系完整性约束条件:施加于Table上,对给定表上所要更新的某一候选远足是否可以接受进行约束条件判断,或是对一个关系中的若干元组和另一个关系中的若干元组间的联系是否可以接受进行约束条件判断
- 结构约束:来自模型的约束
- 内容约束:来自用户的约束
- 静态约束:要求数据库在任一时候均应满足的约束
- 动态约束:要求数据库从一状态变为另一状态应满足的约束
- 实现约束的方法:
- Col_constr列约束:只能应用在单一列上,其后面的约束如UNIQUEPRIMARY KEYsearch_cond只能是单一列唯一、单一列为主键和单一列相关
- table_constr约束:对多列或元组的值进行约束。
- check中的条件可以是Select-From-Where内任何Where后的语句,包含子查询
- 断言:表达了希望数据库总能满足的条件,当创建了一个断言之后,系统将检测其有效性,并在每一次更新中测试更新是否违反该断言。
create assertion <assertion-name> check <predicate>
- 触发器:实现动态约束以及多个元组之间的完整性约束。Trigger是一种过程完整性约束,是一段程序,该程序可以在特定的时刻被自动触发执行,比如在一次更新操作之前执行,或在更新操作之后执行。当某一事件发生时AFTER|BEFORE,对该事件产生的结果(或是每一元组,或是整个操作的所有元组),检查条件search_condition,如果满足条件就执行后面的程序段。条件或程序段中引用的变量可用corr_name_def来限定
- 对corr_name_def的定义如下:
- 数据库安全性:免受非法、非授权用户的使用、泄漏、更改或破坏。
- 数据的安全级别;绝密Top Secret、机密 Secret、可信Confidental、无分类Unclassified
- 数据库系统DBS的安全级别:物理控制、网络控制、操作系统控制、DBMS控制
- DBMS的安全机制
- 自主安全性机制:存取控制,通过权限在用户之间的传递,使用户自主管理数据库安全性,通过存储矩阵和SQL视图实现
- 强制安全性机制:通过对用户和数据进行强制分类,使得不同类别用户能够访问不同类别的数据
- 推断控制机制
- 数据加密存储机制
- 当一个用户的权利被收回时,通过其传播给其他用户的权利也将被收回;如果一个用户从多个用户处获得了授权,则当其中某一个用户收回授权时,该用户可能仍保有权利。
- 强制安全性机制规则:
- 用户S,不能读取数据对象O,除非Level(S) >= Level(O)
- 用户S,不能写数据对象O,除非Level(S) <= Level(O)
- SQL语句在执行过程中,必须有提交和撤销语句才能确认其操作结果
- 事务的特性:ACID
- 原子性:保证事务的一组更新是原子不可分的
- 一致性:保证事务的操作状态是正确的
- 隔离性:保证并发执行的多个事务之间不受影响
- 持久性:保证已提交事务的影响是持久的,被撤销事务的影响是可恢复的
注:考嵌入式自求多福
第三部分 数据建模与数据库设计
- E-R模型中,通过关键字/码来唯一区分每一实例的属性或属性组合
- E-R模型中,联系指一个实体的实例和其他实体实例之间所可能发生的联系。
- 完全参与联系:即该端实例至少有一个参与到联系中,最小基数为1(1..m)
- 部分参与联系:即该端实例可以不参与联系,最小基数为0(0..m)
- chen方法:
- Chen方法中,在直线上标记有文字来表示联系的角色。
- Crow foot's 方法:
- IDEF1x方法中,实体表示一个现实和抽象事物的集合,这些食物必须具有相同的属性和特征。这个集合的一个元素就是该实体的一个实例。分为独立实体/强实体和从属实体/弱实体。
- 独立实体:一个实体的实例都被唯一的标识而不决定于它与其他实体的联系。独立实体的主关键字中没有外键。
- 从属实体:一个实体的实例的唯一标识需要依赖于该实体与其他实体的联系。其中,从属实体需要从其他实体继承属性作为关键字的一部分。主关键字中包含了外来属性的实体称为从属实体。
- 外来关键字:其他实体的关键字
- 标定联系:子实体的实例都是由它与父实体的联系而确定。父实体的主关键字是子实体主关键字的一部分。
- 非标定联系:子实体的实例能够唯一标识而无需依赖与其实体的联系。父实体的主关键字不是子实体的主关键字。
- 非确定联系:实体之间的多对多联系,非确定联系必须分解为若干个一对多的联系来表达。
- 相交实体/相关实体:
- 确定联系通过属性继承实现两实体之间的联系;非确定联系通过引入相交实体实现两实体的联系。
- 分类联系:一个实体实例是有一个一般实体实例和多个分类实体实例构成的。一个一般实体是若干具体实体(分类实体)的类,分类实体与一般实体具有相同的主关键字,不同分类实体除具有一般实体特征外,各自还可能具有不同的属性特征。
- 完全分类联系与非完全分类联系:
- 一圆圈带两横线:完全分类联系
- 一圆圈带一横线:非完全分类联系
- 点评IDEFX1模型:
- 通过图理解需求
- 检查每个实体能否用重叠量词形容
- 检查实体的关键字能否唯一确定每个实例
- 检查实体之间联系绘制及命名的正确性
- 检查属性继承的正确性
- 数据库设计的4个过程
- 需求分析:收集需求和理解需求
- 概念数据库设计:建立概念模型
- 逻辑数据库设计:建立逻辑模型,关系模式,包括用户模式和全局模式
- 物理数据库设计:建立物理模型,建立表,包括物理数据组织等,依赖于具体的DBMS
- 函数依赖:设R(U)是属性集合U={(A_1),(A_2),...,(A_n)}上的一个关系模式,X、Y是U上的两个子集,若对于R(U)的任意一个可能的关系r,r中不可能有两个元组满足在X中的属性相等而在Y中的属性值不等,则称“X函数决定Y”或“Y函数依赖于X”,记作(X
ightarrow Y)。
- 函数依赖的特性:
- 对(X
ightarrow Y),但是(Y
otsubset X),则称(X
ightarrow Y)为非平凡的函数依赖。
- 若(X
ightarrow Y),则任意两个元组,若X上值相等,则Y上值必然相等,则称X为决定因素。
- 若(X
ightarrow Y),(Y
ightarrow X),则记作(X leftrightarrow Y)。
- 若Y不函数依赖于X,则记作(X
ot
ightarrow Y)。
- (X
ightarrow Y)有基于模式R的,则要求对任意的关系r成立;有基于具体关系r的,则要求对某一关系r成立。
- 如一关系r的某属性集X,r中根本没有X上相等的两个元组存在,则称(X
ightarrow Y)恒成立。
- 部分或完全函数依赖:
- 传递函数依赖:
- 候选键:其中可以选择任一候选键作为R的主键;包含在任一候选键中的属性称为主属性,其他属性称为非主属性;若K是R的一个候选键(K subset S),则称S为R的一个超键
- 外来键:若R(U)中的属性或属性组合X并非R的候选键,但X却是另一关系的候选键,则称X为R的外来键,简称外键。
- 逻辑蕴含:
- 闭包:被F逻辑蕴含的所有函数依赖集合称为F的闭包,记作(F^+)。若(F^+ = F),则说F是一个全函数依赖族(函数依赖完备集)。
- Armstrong公理:设R(U)是属性集合U={(A_1),(A_2),...,(A_n)}上的一个关系模式,F为R(U)的一组函数依赖,记为R(U, F),则有如下规则成立:
- 根据引理可得:
- 属性(集)闭包:
- 覆盖:
- 属性闭包的计算算法:
- 函数依赖集的性质:每个函数依赖集F可被一个其右端至多有一个属性的函数依赖之集G覆盖。
- 最小覆盖:
- 第一范式(1NF):若关系模式R(U)中关系的每个分量都是不可分的数据项(值、原子),则称R(U)属于第一范式,记为:R(U) (in) 1NF。1NF要求关系中不能有复合属性、多值属性及其组合。转换的方法是将复合属性处理为简单属性;将多值属性与关键字单独组成一个新的关系。
- 第二范式(2NF):若(R(U) in 1NF)且U中的每一非主属性完全函数依赖于候选键,则称R(U)属于第二范式,记作:(R(U) in 2NF)。第二范式消除了非主属性对候选键的部分依赖。
- 第三范式(3NF):第三范式消除了非主属性对候选键的传递依赖。
- Boyce-Codd范式(BCNF):若关系满足BCNF,则一定满足第三范式,反之未然。
- 将关系模式分解成3NF:将每一个函数依赖单独组成一个关系。
- 将关系模式分解成BCNF:将左侧不含候选键的函数依赖单独组成一个关系,将包含候选键的组成一个关系。
- 多值依赖:
- 多值依赖的特性:
- 直观地,对于X给定值,Y有一组值与之对应(0或n个)且这组Y值不以任何方式与U-X-Y中属性值相联系,有(X
ightarrow
ightarrow Y)。
- 若交换t,s的Y值而得到的新元组仍然在r中,则(X
ightarrow
ightarrow Y)。
- X,Y不必不相交,u、v可以和t、s相同。
- 函数依赖是多值依赖的特例。
- 令Z = U-X-Y,有(X
ightarrow
ightarrow Z),若(Z = phi),则必有(X
ightarrow
ightarrow Y)。
- 对Armstrong公理的补充:
- 引理,从Armstrong公理可得:
- 第四范式(4NF):第四范式消除了非主属性对候选键以外属性的多值依赖,如果有多值依赖,则一定依赖于候选键。
- 若(R in 4NF),则必有(R in BCNF)。
- 若R上仅存在函数依赖,则若有(R in BCNF)即有(R in 4NF),反之也成立。
- 弱第四范式(W4NF):
- 模式分解:
- 模式分解引理1:
- 无损连接分解:
- 无损连接性检验算法:
- 定理:设F是关系模式R上的一个函数依赖集合,(
ho = {R_1, R_2})是R的一个分解,则:当且仅当(R_1 igcap R_2
ightarrow R_2 - R_1)属于(F^+)时,(
ho)是关于F无损连接的。
- 设关系模式R具有函数依赖集F,(
ho = {R_1,....,R_k})是R的一个分解,且是关于F无损连接的分解,则有:
- 保持依赖分解:对于关系模式R(U, F),U是属性全集,F是函数依赖集合,(
ho = {R_1,...,R_k}是R的一个分解,如在)pi_{R_i}(F)(中的所有依赖只并集(i = 1...k)逻辑蕴含F的每一个依赖,则称分解)
ho(保持依赖集F。其中)pi_{R_i}(F)(是F在)R_i(上的投影,即F中的任意投影)X
ightarrow Y(,如果X、Y均包含于)R_i(,则有)X
ightarrow Y in pi_{R_i}(F)(。其中)R_i(指)R_i$的属性集。其中保持依赖的分解可能不是无损连接的,无损连接的分解可能不是保持依赖的。
- 保持依赖性检验算法:
- 无损连接分解成BCNF的算法:
- 保持依赖分解成3NF的算法:
- 即保持依赖,又无损连接的分解:设(sigma)是按照前述算法构造的R的一个第三范式分解,X是R的候选键,则有:( au = sigma igcup {X})将是R的一个分解,且该分解中所有的关系范式是第三范式的,且( au)有保持依赖和无损连接性。其中( au)并不一定具有定理性质的最小可能关系模式的集合。我们可以一次去掉一个关系模式,只要所要求的性质仍具备,直至求得上述最小集合。
- 无损连接分解成4NF:
- 连接依赖:
- 第五范式(5NF):当且仅当关系模式R的每个连接依赖均按其候选键进行连接运算时(均由R的候选键所隐含),则称R是第五范式的,记为(R in 5NF)。需要注意的是:
- 第五范式消除了不按候选键连接的连接依赖,但其语义背景抽象。
- (5NF subseteq 4NF)。第五范式也称投影连接范式,即PJNF。
- 虽然总能把一个关系无损分解成多个5NF的关系,但由于目前尚不清楚如何找到关系的所有JD,故不清楚如何确定5NF关系。
- 关系模式设计需要折中
- 遵循关系范式原则,则需要将一个关系模式,拆解成两个或多个小的模式;而查询时,需要将这两个或多个小的模式联结成一个模式。
- 遵循关系范式原则避免了冗余、插入异常、删除异常等问题,但是由于联结运算的低效率,使得查询速度很慢。
- 通常建议关系模式符合BCNF
第四部分 数据库管理系统实现技术