软件设计师-第九章(数据库)
数据库的基本概念
- 数据:是数据库中存储的基本对象,是描述事物的符号记录。
- 数据的分类:文本、图形、图像、音频、视频等。
- 数据库DB:是长期存储在计算机内、有组织的、可共享的大量数据的集合。
- 数据的基本特征:数据按一定的数据模型组织、描述和存储。
- 可为各种用户共享;
- 冗余度较小;
- 数据独立性较高;
- 易扩展;
- 数据库系统DBS:
是一个采用了数据库技术,有组织地、动态地存储大量相关数据,方便多用户访问的计算机系统
。由下面四个部分组成:- 数据库:统一管理、长期存储在计算机内的,有组织的相关数据的集合
- 硬件:构成计算机系统包括存储数据所需的外部设备
- 软件:操作系统、数据库管理系统(DBMS)及应用程序
- 人员:系统分析和数据库设计人员、应用程序员、最终用户、数据库管理员DBA
三级模式两级映像
三级模式是数据的三个抽象级别,每个级别关心的重点不同。为了使三级模式之间产生关联,数据库管理系统在三级模式之间提供了二级映像功能。
二级映像是一种规则,它规定了映像双方如何进行转换
。通过二级映像,体现了逻辑和物理两个层面的数据独立性
外模式
:面向应用程序,描述用户的数据试图(View);概念模式(又称为模式、逻辑模式)
:面向数据库的设计人员,描述数据的整体逻辑结构。内模式(又称为物理模式、存储模式)
:面向物理上的数据库,描述数据在磁盘中如何存储;逻辑独立性
:外模式/概念模式映像体现了逻辑独立性。逻辑独立性是指当修改了概念模式,不影响其上一层的外模式。物理独立性
:概念模式/内模式映像体现了物理独立性。物理独立性指修改了内模式,不影响其上层的概念模式和外模式。
数据库设计
- 需求分析:即分析数据存储的要求,产出物有数据流图(功能模型)、数据字典、需求说明书。获得用户对系统的三个要求:信息要求、处理要求、系统要求。
- 概念结构设计:就是设计E-R图,也即实体-练习图。工作步骤包括:选择局部应用、逐一设计分E-R图、E-R图合并。分E-R图进行合并时,他们之间存在的冲突主要有以下3类。
- 属性冲突:同一属性可能会存在于不同的E-R图中。
- 命名冲突:相同意义的属性,在不同的E-R图上有着不同的命名,或是名称相同的属性在不同的E-R图中代表着不用的意义。
- 结构冲突:同一实体在不同的E-R图中有不同的属性,同一对象在某一E-R图中被抽象为实体而在另一E-R图中又被抽象为属性。
- 逻辑结构设计:将E-R图,转换为关系模式。工作步骤包括:确定数据模型、将E-R图转换称为指定的数据模型、确定完整性约束和确定用户试图。
- 物理设计:步骤包括确定数据分布、存储结构和访问方式。
- 数据库实施阶段:根据逻辑设计和物理设计阶段的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。
- 数据库运行和维护阶段:数据库应用系统经过试运行即可投入运行,但该阶段需要不断地对系统进行评价、调整与修改。
数据模型
概念模型(概念结构设计产出的E-R图)是从用户的角度进行建模的
,是现实世界到信息世界的第一抽象,是真正的实体-联系模型。关系模型(逻辑结构设计产出的E-R图)是二维表的形式表示的实体-联系模型
,是将实体-联系模型转换而来的,经过开发人员设计的。
数据模型的三要素:数据结构
(所研究的对象类型的集合)、 数据操作
(对数据库中各种对象的实例允许执行的操作的集合)、数据的约束条件
(一组完整性规则的集合)。
用E-R图来描述概念数据模型,世界是由一组称作实体的基本对象和这些对象之间的联系构成的
。
在E-R模型中,使用椭圆表示属性(一般没有)、长方形表示实体、菱形表示联系,联系的两端要填写类型,示例如下图所示:
- 实体:
客观存在并可相互区别的事物
。可以是具体的人、事、物或抽象概念。如人、汽车、图书、贷款。- 弱实体和强实体:弱实体依赖于强实体的存在而存在。
- 实体集:具有相同类型和共享相同属性的实体的集合,如学生、课程。
- 属性:实体所具有的特性。
- 属性分类:简单属性和符合属性;单值属性和多值属性;NULL属性;派生属性(可以通过其他属性运算出来,比如年龄可以根据出生日期)。
- 域:属性的取值范围称为该属性的域。
- 码(key):唯一标识实体的属性集。
- 联系:
现实世界中事物内部以及事物之间的联系,在E-R图中反映为实体内部的联系和实体之间的联系
。- 一对一(1:1)
- 一对多(1:N)
- 多对多(M:N)
E-R模型转换为关系模型:E-R图是全局的设计概念,不适合进行计算机处理,为了适应关系数据库的处理,必须将E-R图转为关系模型
。
E-R图是由实体、属性和联系三要素组成,而关系模型只有一个结构,所以我们使用以下方式进行转换:每个实体都对应一个关系模型,实体名对应关系模型中的名称,实体属性对应关系模型的属性,实体标识符(联系)对应关系模型的码
。
大数据
特点:大量化(Volume)、多样化(Variety)、价值密度低(Value)、快速化(Velocity).
大数据和传统数据的比较如下表格:
比较维度 | 传统数据 | 大数据数据 |
---|---|---|
数据量 | GB或TB级 | PB级或以上 |
数据分析需求 | 现有数据的分析与检测 | 深度分析(关联分析、回归分析) |
硬件平台 | 高端服务器 | 集群平台 |
要处理大数据,一般使用集成平台,称为大数据处理系统,其特征为:
高度可扩展性、高性能、高度容错、支持异构环境、较短的分析延迟、易用且开放的接口、较低成本、向下兼容性。
关系代数
- 并:结果是两张表中所有记录数合并,相同的记录只显示一次。
- 交:结果是两张表中相同的记录。
- 差:S1-S2,结果是S1表中有而S2表中没有的那些记录。
- 笛卡尔积:S1 X S2,产生的结果包括S1和S2的所有属性列,并且S1中每条记录一次和S2中所有记录组合成一条记录,最终属性列为S1+S2属性列,记录数为S1*S2记录数。
- 投影(Π):实际是按条件选择某关系模式中的某列,列也可以用数字标识。
- 选择(σ):实际是按条件选择某关系模式中的某条记录。
- 自然连接:显示全部的属性列,但是相同属性列只显示一次,显示两个关系模式中属性相同且值相同的记录。
设有关机R、S如下左图所示,自然连接结果如下右图所示:
SQL语言
SQL(Structured Query Language):是关系数据库管理系统的标准查询语言
,用于存储数据以及查询、更新和管理关系数据库
SQL的主要功能包括:
数据定义语言(DDL)
:用于定义数据库对象,如表、视图、索引等。包括CREATE、ALTER、DROP等语句。数据操作语言(DML)
:用于对数据库中表的数据进行增删改操作。包括INSERT、UPDATE、DELETE等语句。数据查询语言(DQL)
:用于查询数据库中表的数据。包括SELECT语句及其子句。事务控制语句(TCL)
:用于管理数据库事务。包括COMMIT、ROLLBACK、SAVEPOINT等语句。数据控制语言(DCL)
:用于管理数据库的访问权限。包括GRANT、REVOKE等语句。
函数依赖
函数依赖
:给定一个X,能唯一确定一个Y,就称X决定(确定)Y,或者说Y依赖于X。
- 例如:Y = X * X,此时X能确定Y的值,但是Y无法确定X的值,比如X = 2, Y = 4,但是Y = 4 无法确定X = 2;
函数依赖又可扩展以下两种规则:
部分函数依赖
:A可决定C,(A,B)也可决定C,既然A都可以决定C了,那么要不要B其实都无所谓了,所以这种就称为部分函数依赖。传递函数依赖
:当A和B不相同时,A可决定B,B可决定C,则A可决定C,是传递函数依赖;若A和B相同,则不存在传递了,A就可以直接决定C。
函数依赖公理系统
函数依赖的公理系统(Armstrong:阿姆斯特朗公理)是指一组用于推导和证明函数依赖的规则和公理集合。设关系模式R(U,F),其中U为属性集,F是U上的一组函数依赖,那么有以下推理规则。
自反律
:对于任意属性集合X和Y,有 Y ⊆ X ⊆ U,则X->Y被F逻辑蕴含。- 也就是说如果属性集Y属于X,则X可以决定Y,有可以说属性集X可以决定他的属性子集。
增广律
:对于任意属性集合X、Y和Z,如果X->Y,那么XZ->YZ- 如果X->Y在F这个函数依赖积集合中,另一属性(组)Z是属性集U中的元素,那么从F中可以推导出XZ函数决定YZ。
传递律
:对于任意属性集合X、Y和Z,如果X->Y,Y->Z,那么X->Z
根据上述3条推理规则又可推出下述3条推理规则:
合并律
:对于任意属性集合X、Y和Z,如果X->Y,Y->Z,那么X->YZ分解率
:对于任意属性集合X、Y和Z,如果X->YZ,则X->Y,X->Z合成律
:对于任意属性集合X、Y和Z,如果X->Y,Y->Z,那么XZ->YZ
健与约束
超键(码)
:能够唯一标识一条记录的属性或属性集。换句话说,超健中的属性组合可以保证每个元组在关系中都是唯一的。
举例:假设我们有一个学生表,包含以下属性:学号、姓名、性别、出生日期,那么,以下属性集合都是超键:
{学号}、{学号,出生日期}、{学号,性别,出生日期},因为这些属性组合都可以唯一标识每个学生。候选键
:超健中不包含任何冗余属性的超键。换句话说,候选键中的每个属性都是必须的,用于唯一标识元组。
举例:在上面的例子中,{学号}是候选键,因为它是唯一标识学生的最小属性集合。如果我们设置姓名不能重复的话,那么{姓名}也是一个候选键,但是{姓名,性别,出生日期}这个组合就不是了,因为性别和出生日期冗余了,可以由姓名得到。主属性
:包含在任一候选码中的属性称为主属性。换句话说,主属性是候选码所有属性的并集
举例:在上面的例子中,如果姓名不能重复,那么主属性就是学号和姓名。主键
:从候选键中选取的一个属性或属性集合,作为表中元组的唯一标识符。
举例:在上面的例子中,我们可以选择{学号}作为主键。
外键:是指一个表中的属性,它引用另一个表中的主键。外键用于建立表之间的关系。
实体完整性约束:即主键约束,主键值不能为空,也不能重复。
参照完整性约束:即外键约束,外键必须是其他表中以及存在的主键的值,或者为空
。
用户自定义完整性约束:自定义表达式约束
,如设定年龄属性的值必须在0到180之间。
范式
例:用一个单一的关系模式学生来描述学校的教务系统:学生(学号,学生姓名,系号,系主任姓名,课程号,成绩)
依赖关系(学号->学生姓名,学号->所在系,所在系->系主任姓名,(学号,课程号)->成绩)
第一范式1NF:要求数据库表中的所有字段都是不可分割的原子值
。通俗地说,第一范式就是表中不允许有小表的存在。第二范式2NF:在1NF的基础上,要求数据表中的每个非主属性完全依赖于某一个候选键
。
通俗的说,就是表中不能存在联合主键,按照定义,上面的学生表就不满足2NF,因为学号不能完全确定成绩(每个学生可以选多门课)
解决方案:将学生表分解成:- 学生(学号,学生姓名,系编号,系名,系主任)
- 选课(选课id,学号,课程号,成绩)。
每张表均属于2NF。
第三范式:在2NF的基础上,要求数据表中的每个非主属性不依赖于其它非主属性
。也就是说,数据表中的每一列都和主键直接相关,而不依赖于其它列,即不能存在传递依赖
继续上面的实例,学生关系模式就不属于3NF,因为学生无法直接决定系主任和系名,式由学号->系编号,再由系编号->系主任,系编号->系名,因此存在非主属性对主属性的传递依赖。
解决方案:将学生表进一步分解为:- 学生(学号,学生姓名,系编号)
- 系(系编号,系名,系主任)
- 选课(选课id,学号,课程号,成绩)
- 每张表都属于3NF.
BC范式(BCNF)
:规范化数据库设计的一种方法,它对关系型数据库中的表进行分解,其符合第三范式(3NF),同时尽量避免数据冗余和不一致性,提高数据的可靠性和完整性。
假设仓库管理关系表(仓库ID,存储物品ID,管理员ID,数量),且有一个管理员只能再一个仓库工作;一个仓库可以存储多种物品。此关系模式已经属于3NF,那么这个关系模式是否存在问题呢?我们来看以下集中操作:- 删除异常:当仓库被清空后,所有”存储物品ID”和”数量”信息被删除的同时,”仓库ID”和”管理员ID”信息也被删除了。
- 插入异常:当仓库没有存储任何物品时,无法给仓库分配管理员。
- 更新异常:如果仓库换了管理员,则表中所有行的管理员ID都要修改。
解决方案:把仓库管理关系表分解为两个关系表: - 仓库管理:(仓库ID,管理员ID);
- 仓库:(仓库ID,存储物品ID,数量);
- 这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。
模式分解
模式分解:是关系数据库规范化设计中的一个重要概念。它指的是通过对关系模式进行拆分,来消除模式中的混合组合依赖,达到将模式分解为更小的模式的过程。一般分为以下两种:
是否保持函数依赖分解
:对于关系模式R,有依赖集F,若对R进行分解,分解出来的多个关系模式,保持原来的依赖集不变,则为保持函数依赖的分解。另外,注意要消除掉冗余依赖(如传递依赖)有损无损分解
:分解后的关系模式能够还原出原关系模式,就是无损分解,不能还原就是有损
判断方式
- 是否是保持函数依赖:设原关系模式R( A, B, C),依赖集F( A->B , B->C , A-C ),将其分解为两个关系模式 R1(A , B) 和 R2( B, C),此时R1中保持依赖A->B ,R2保持依赖B->C,
说明分解后的R1和R2是保持函数依赖分解,因为A->C这个函数依赖实际是一个冗余依赖,可以由前两个传递得到,因此不需要管。 - 是否是有损条件无损条件:如果R的分解为P={R1,R2},F为R所满足的函数依赖集合,分解P具有无损连接性的充分必要条件是 R1∩R2 -> (R1 - R2)或者 R1∩R2 -> (R2 -R1)
例:
给定关系模式 R(U,F) 其中:
属性集 U = {A, B, C, D, E, H}
函数依赖集 F = {A->B, B->DH, A->H, C->E}
候选码
计算出单属性闭包
A+ = {A, B, D, H} (通过A->B 和 B->DH)
B+ = {B, D, H} (通过B->DH)
C+ = {C, E} (通过C->E)
D+ = {D}
E+ = {E}
H+ = {H}
结论:单属性闭包中,没有X+ = U,因此单属性不是候选码。
计算两属性组合闭包
{A, C}+
初始闭包:{A, C}
通过A->B, 加入B:{A, B, C}
通过B->DH, 加入D,H:{A, B, C, D, H}
通过C->E,加入E:{A, B, C, D, E, H} = U
因此{A, C}+ = U, {A, C}是候选码
类似的,可以验证其他两属性组合的闭包,发现只有{A, C}满足X+ = U
主属性
- 主属性:属于候选码的属性
- 在候选码{A, C}中,A 和 C是主属性
主键
- 主键:从候选码中选择一个作为主键
- 可以选择{A, C}作为主键
超键
- 超键:能够唯一标识关系中每一组属性的属性集(可能包含冗余属性)
- 任何包含候选码的属性集都是超键。
- {A, C}是超键
- {A, B, C}是超键
- {A, C, D}是超键
- {A, B, C, D, E, H}是超键
传递依赖
- 检查A->B 和 B->DH:
- A->B 和 B->DH存在
- 检查B↛A是否成立
- 计算B+ = {B, D, H}, 不包含A, 因此 B↛A
- 因此,A->DH是一个传递依赖。
- 检查其他函数依赖:
- A->H:直接依赖,不是传递依赖
- C->E:直接依赖,不是传递依赖
- 传递依赖:A->DH
- 检查A->B 和 B->DH:
冗余函数依赖
- 检查A->H:
- 移除A->H,新的函数依赖集F={A->B, B->DH, C->E}
- 计算A+在F下:
- 初始闭包:{A}
- 通过A->B, 加入B:{A, B}
- 通过B->DH, 加入D,H:{A, B, D, H}
- 检查H ⊆ A+ : H ⊆ {A, B, D, H}
- 因此, A->H是冗余的
- 冗余函数依赖:A->H
- 检查A->H:
例:给定关系模式R(A1, A2, A3, A4)
R上的函数依赖集F={A1A3->A2, A2->A3}。
若将R分解成P={(A1,A2), (A1,A3)},那么该分解是否包含函数依赖和有无损连接。
- 判断是否为无损连接分解
- 分解p = {R1(A1,A2), R2(A1,A3)}
- 检查R1 ∩ R2-> (R1 - R2) 或 R1 ∩ R2-> (R2 - R1):
- R1 ∩ R2 = {A1}
是R1和R2的共同属性
- R1 - R2 = {A2}
是R1中独有属性
- R2 - R1 = {A3}
是R2中独有属性
- R1 ∩ R2 = {A1}
- 检查{A1} -> {A2} 或 {A1} -> {A3}:
- 在函数依赖集F中, 没有A1 -> A2 或 A1 -> A2.
- 因此,分解p不是无损连接分解。
- 判断是否保持函数依赖
- 检查分解后的子模式是否保持原始函数依赖集F:
- R1(A1,A2): 可以保持A2 -> A3 吗? 不能,因为A3不在R1中。
- R2(A1,A3): 可以保持A1A3 -> A2 吗? 不能,因为A2不在R2中。
- 因此,分解p不能保持函数依赖。
分解p是有损连接分解,且不保持函数依赖。
- 检查分解后的子模式是否保持原始函数依赖集F:
如果分解成 {R1(A1,A2),R2(A2,A3)}呢
- 判断是否为无损连接分解
- 分解p = {R1(A1,A2), R2(A2,A3)}
- 检查R1 ∩ R2-> (R1 - R2) 或 R1 ∩ R2-> (R2 - R1):
- R1 ∩ R2 = {A2}
是R1和R2的共同属性
- R1 - R2 = {A1}
是R1中独有属性
- R2 - R1 = {A3}
是R2中独有属性
- R1 ∩ R2 = {A2}
- 检查{A2} -> {A1} 或 {A2} -> {A3}:
- 根据函数依赖集F = {A1A3 -> A2, A2 -> A3}:
- {A2} -> {A3} 成立。
- {A2} -> {A1} 不成立。
- 由于R1 ∩ R2-> (R2 - R1)成立,分解p是无损连接分解。
- 判断是否保持函数依赖
- 检查分解后的子模式是否保持原始函数依赖集F:
- R1(A1,A2):
- 可以保持A2 -> A3 吗? 不能,因为A3不在R1中。
- 可以保持A1A3 -> A2 吗? 不能,因为A3不在R1中。
- R2(A2,A3):
- 可以保持A2 -> A3 吗?可以。
- 可以保持A1A3 -> A2 吗? 不能,因为A1不在R2中。
- R1(A1,A2):
- 分解p只能保持部分函数依赖(A2 -> A3),但无法保持所有函数依赖(A1A3 -> A2)。
分解p是无损连接分解,且不保持函数依赖。
- 检查分解后的子模式是否保持原始函数依赖集F: