数据库概念
三层模式
系统结构:三级模式,内模式、概念模式、外模式。 内模式:管理如何存储物理数据。 概念模式:根据需求划分为一张张的表。 外模式:对应视图级别,将表进行了一次封装处理。
内模式:存储模式,数据库在物理方面的描述,定义记录类型、索引、文件组织方式(概念模式下的一张表,在内模式中可能存储在不同文件中)。 外模式:用户模式、子模式,用户与数据库系统的接口,用户用到的那部分数据的描述,如视图。 概念模式:模式,是数据库中全部数据的逻辑结构的描述,如库、表。
两层映射关系
外模式和概念模式有映射关系(逻辑独立性),概念模式与内模式也有映射关系(物理独立性),因此在出现变动时,无关层不会影响。
外模式-概念模式映像:表和视图进行映射,表改了只需要改视图,不用动程序。 概念模式-内模式映像:表和物理存储的映射,DBMS自动管理。
数据模型
ER实体联系图(结构化中用的数据模型,面向对象中用类图表示数据模型),体现了数据之间的关系。
E-R模型: ERD数据图
关系模型
目或度:关系模型中属性的个数。
候选键:唯一标识元组,且无冗余(不能有多余)的集合(可以多个属性的组合)。
主键:候选键中任选一个。
主属性与非主属性:组成候选码的属性,就是主属性。
外键:其他表中的主属性。
完整性约束:
- 实体完整性约束:主属性不能取空值。
- 参照完整性:关系与关系间的引用,外键约束。
- 用户自定义约束。
- 触发器 。
关系表类型
基本关系:实际存在的表,实际存储数据的逻辑表示。查询表:查询结果对应的表。 视图表:虚拟表,其内容由查询定义(仅仅保存SQL查询语句)。
- 视图能简化用户操作
- 视图使用对重构数据库提供一定程度的逻辑独立性(表结构改了,只需要调整视图sql,上层应用不用改)
- 视图对数据提供安全保护(可以设定访问权限之类)
关系代数
并集、交集、差集、笛卡尔积
数据库设计
数据库如果设计不合理,往往会成为系统的“瓶颈”。
数据库设计主要分为用户需求分析、概念结构、逻辑结构和物理结构设计四个阶段。
其中,在用户需求分析阶段中,数据库设计人员采用一定的辅助工具对应用对象的功能、性能、限制等要求所进行的科学分析,并形成需求说明文档、数据字典和数据流程图。用户需求分析阶段形成的相关文档用以作为概念结构设计(ERD)的设计依据。
输出:需求分析:数据流图、数据字典、需求说明书。 概念结构设计:ER模型图(与数据库无关) 逻辑结构设计:关系模型(由ER图转换而来,注意转换规则和规范化理论),即表。 物理设计:关注索引,等跟硬件、操作系统的特性。
设计规则和指南:
- 每个基本实体、关联实体和弱实体都被实现成一个独立表(多对多关系必须要单独设计成一个关系模式(表))
- 数据完整性和访问完整性约束
函数依赖:
规范化:
非规范化问题:数据冗余、更新异常(一部分改了,一部分没改到,修改操作一致性问题)、插入异常、删除异常。
// 没有非主属性就不会违反第二、第三范式。
第一范式:属性不可再拆分。
- 姓名:假如姓名这个属性硬要说不满足第一范式,是因为“姓名”还可以拆成“姓”和“名”。
- 第二范式:在第一范式之上,表中的候选键能够确定表中其他属性,就存在部分依赖,不属于第二范式。
- id、名称、名称的英文形式:其中名称就能够确定“名称的英文形式”,那就存在部分依赖,不满足第二范式。
- 如下图,课程号就能够确定课程名了,因此存在部分依赖。
第三范式:在第二范式基础上,不存在传递函数依赖。(一般表现为,其他属性可以从非候选键中推导出来,二非候选键又刚好可以从候选键推出来)
BC范式:解决主属性的依赖问题。
反规范化:数据库设计者希望牺牲部分规范化来提升性能。 优点:连接操作减少,查询的表变少,查询、统计变快,检索变容易。 缺点:数据有冗余,存储空间变大。有数据不一致的问题。插入更新变得困难,增删改的异常也会出现。
实现方式: 增加派生性冗余:通过某些属性能够计算得到的其他属性。 增加冗余:已有学号,增加姓名。 重新组表:为了提高效率。 分割表:把表水平切割,长沙地区的存长沙表,其他地区存其他表。
索引:
提升查询效率,降低增加、删除、修改效率。一般采用B、B+树结构。
树形结构能够提升查找效率。
视图:
虚拟的表,好比已经写好的SQL,可以直接调用(可以转成物化视图)。
物化视图:将SQL语句查询的结果存成表,系统自动维护数据同步。 优点:安全(可以设置权限,只显然若干属性<针对直连数据库的系统,现代系统已经可以控制返回字段显示>)、简化操作(不用写sql)、逻辑独立、不同角度返回数据。
分区分表分库:
提升系统性能。
分区:表数据量很大,从物理文件上划分,下次读取时数据量变小,速度会变快。(数据库底层支持,开发人员不用考虑)范围分区:按表中的字段范围,如记录的id号分区,5000~10000存第二个区。 哈希分区:对key进行哈希运算求余,取余后看落在哪个区,分布会比较均匀。 列表分区:要分的本身是列表,如城市,可以分成上海市、北京。 分表:逻辑上是多张表了,(分区上来看,数据表还是整体)。 分库:多个表打包成一个库,完整数据库分成多个库。
并发控制
// 主要是对事务的处理事务的ACID特性:
解决并发方式:封锁协议,X锁(排他性)、S锁(共享性)。
三级封锁协议:
两阶段加锁协议:2PL,指的是单机事务中的加锁机制,是指所有事务必须分两个阶段对数据项加锁和解锁。事务分为两个阶段,第一阶段是获得封锁,第二阶段是释放封锁。
两阶段提交协议:2PC,主要用于分布式事务中,把分布式事务的提交过程分成表决和执行两个阶段。
分布式数据库
在原来独立的数据库之上,加盖了全局的数据库管理,把所有库统一管理。 // 集中式数据库:Oacle、sqlserver。
特点:在集中式数据库的架构上,增加了全局的概念,通过全局来控制分片,将分片数据存储到局部数据(原集中式)。数据独立性、集中与自治共享的结合控制结构、适当增加数据冗余度、全局的一致性、可串行、可恢复。
透明性: // 表示用户不需要关心数据是怎么分片的 分片透明(水平<南方节点、北方节点>、垂直、混合)、位置透明、局部数据模型透明(表结构,逻辑结构)
分布模式:管数据存在哪里。
- 位置透明性:不管数据库存哪里。
- 分片透明性:不管是否分片(水平、垂直),用户没有感知。
NoSQL
不仅仅是SQL,泛指非关系数据库。