考研复试 数据库原理知识点整理(自用版)
知识点整理
数据与语义不可分
数据库:长期储存在计算机内,有组织可共享的大量数据的集合
- 为了抽取有用信息,转换为有用信息
数据库管理系统:数据管理软件,高效运用和管理数据 - 数据定义(DDL)
- 数据组织,存储和管理
- 数据操纵语言(DML)
- 数据的事务管理和运行管理
- 数据库的建立和维护功能
数据库系统:- 数据库
- 数据库管理系统
- 应用程序
- 数据库管理员
数据管理:对数据进行分类,组织,编码,存储,检索,维护
- 数据结构化
- 整体结构化,数据记录可以变长
- 数据共享性高,冗余度低且易扩充
- 面向整个系统,被多个用户共享,减少数据冗余,节省空间,避免数据之间的不一致性,使系统易于扩充
- 数据独立性高
- 物理独立性
- 用户的应用程序与数据库中数据的物理存储是相互独立的,当数据的物理存储改变了,应用程序不用改变
- 逻辑独立性
- 用户的应用程序与数据库的逻辑结构是相互独立的,数据的结构改变了,应用程序不用改变
- 物理独立性
- 数据由数据库管理系统统一管理和控制
数据模型
- 概念模型
- 根据数据和信息建模 简单理解就是画E-R图
- 实体
- 属性
- 码(键)
- 实体型
- 实体集
- 联系 实体内部和实体之间的联系
- 逻辑模型和物理模型
- 逻辑模型是根据计算机系统观点建模,用于数据库管理系统实现
- 物理模型:数据在系统(磁盘)的表示方法和存储方法
- 组成要素:
- 数据结构-描述系统的静态特性(类型,内容,性质)
- 数据操作-描述系统的动态特性()
- 完整性约束(给定的数据模型中数据及其联系所具有的制约和依存规则)
常用数据模型:
- 层次结构(树状)
- 网状模型
- 关系模型
- 关系:一个关系对应一个表
- 元组:表中一行即为一个元组
- 属性:表中的一列即为一个属性
- 主码(主键) 可以唯一确定一个元组的属性
- 域:一组具有相同数据类型的值的集合(属性的取值范围来自某个域)
- 性别的域(男,女) 系名的域(学院所有系的名字)
- 分量: 元组中的一个属性值
- 关系模式(对关系的描述)
- 每个分量都是不可分的(即表中不能嵌套表)
数据库系统结构
- 模式和实例(类比类和对象)
- 模式:数据逻辑结构的描述
- 外模式: 数据库用户使用的局部数据的逻辑结构和征特的描述, 带有访问权限的模式
- 内模式: 物理结构 和存储方式模式(记录在数据库内部的表示方式)
- 二级映像:
- 外模式->模式 在模式改变时,管理员修改外模式->模式的映像 使得外模式不用修改也就是应用程序不用修改
- 模式->内模式
- 保证了应用程序的稳定性
关系数据结构
- 关系是一张二维表
- 候选码:一组属性的值能唯一的标识一个元组,而其子集不能
- 类型
- 基本表 实际存在的表
- 查询表 查询结果对应的表
- 视图表 基本表或者其他视图表导出的表
- 关系模式:
- 关系的描述成为关系模式 R(U, D, DOM, F)
- R 关系名, U为组成该关系的属性名集合, D为U中属性所来自的域
- DOM为书勋贵向域的映像集合,F为属性间数据的依赖关系集合
- 关系的描述成为关系模式 R(U, D, DOM, F)
- 关系操作
- 增 选择,投影,连接,除,并,差,交, 笛卡尔积
- 删改查
- 关系的完整性
- 实体完整性:若属性A是基本关系R的主属性,则A不能取空值
- 参照完整性:设F为R的一组或一个属性,但不是R的码, K为S的主码.若F与K相对应,则称F是R的外码, 并称基本关系R为参照关系, S为被参照关系
- 用户定义的完整性:用户自定义的一些规则
- 关系代数
- 传统集合运算:并差交笛卡尔积
- 关系运算
- 选择
- 投影 选择几个属性组成新的表
- 连接
- 等值连接 选取属性值相同的元组连接
- 非等值连接 根据条件连接
- 自然连接: 等值连接+去掉重复的那个属性
- 除: 找出象集-> 找到象级包含除数集合的属性,即为相应的商 P56
题外
SQL和NOSQL
NOSQL主要指那些非关系型的,分布式的数据库, 主要代表MongoDB, Redis, CouchDB
其是以键值来存储,且结构不稳定,每个元组都可以有不一样的字段,这种就不会局限于固定的结构, 可以减少一些时间和空间的开销.
分类:
- 面向高性能并发读写的key-value数据库
- 面向海量数据访问的面向文档数据库
- 面向可拓展的分布式数据库
缺点: NOSQL约束少, 所以也不能像sql那样提供where字段属性查询, 因此适合存储较为简单的数据
对比:
- 存储上:SQL以数据库表的形式存储,并且拥有外部关系,可是设置外键关联外部表格,而NOSQL中采用key-value的形式存储
- 事务:SQL中如果多张表需要同批次更新,即如果其中一张表更新失败的话,其他表也不会更新,这种场景通过事务来控制,可以所有命令完成完毕之后再统一提交事务.而NOSQL中没有事务概念,每一个数据集都是原子级
- 数据表和数据集:关系型是表格的,存储在数据表的行和列中,彼此关联.而非关系型是一大块存储在一起的
- 在SQL中需要预定义模式,而非关系中数据可以随时添加,不需要预定义
SQL
- 数据查询
- 数据操纵
- 数据定义
- 模式定义: 创建
create shema shemaName authorization userName删除drop shema shemaName <cascade(强制删除)/restrict(如果模式下面有表了就不执行这条语句)> - 基本表的定义删除修改
create table tableName ( columnName dataType 完整性约束条件, . . . ) - 修改表
alter table tableName [add column newColumnName typedata | add 表级完整性约束条件 | drop column columnName | drop constriaint 完整性约束名 | alter column columnName dataType] - 删除表
drop table tableName [restrict | cascade] - 单表查询
- select xx, xx from xxxx
- select distinct xxx(取消投影后 xxx属性出现的重复值)
- like '要匹配串' 其中匹配串中 %表示任意长度,_表示任意单个字符 刘%表示以刘开头的任意长度字符 刘_ 表示刘x
- 运算符
- order by 排序 desc 降序 asc 升序
- 聚集函数:count(*) 统计元组个数|count [distinct | all] columnName 去重或不去重然后统计列中的值| sum [distinct | all] columnName 一列值的总和 | avg [distinct | all] columnName 平均值 | min [distinct | all] columnName 最小值| max [distinct | all] columnName 最大值
- group by 将查询结果按某一列或多列的值分组,值相等的为一组
select cno, count(sno) from sc group by cno该语句对查询结果cno的值进行分组, 所有具有相同cno值的元组为一组,然后对每一组用count进行计算个数select sno from sc group by sno having count(*) > 3分组之后还需筛选 则可以使用having指定筛选条件
- 连接查询 where 后面满足条件的项目查询出来(还可以通过起别名连接自身)
- 嵌套查询
- IN select xxx xxx where xx in (select xxxxx)
- where xxx [> | >= |< |<=| = |!=(<>) ] [ANY | ALL] (子查询语句)
- exists (子查询语句) 存在满足(子查询条件)的元组
- 集合查询 UNIN 交集 INTERSECT 并集 except 差集
- 数据更新
- insert into tableName (属性1, 属性2....) values (xxx1, xxx2....); 至少插入一个属性
- 修改数据:update tableName set columnName1 = date1,columnName2 = date2 ... where 条件
- 删除:delete from tableName where 条件
- 视图为基本表(或视图)的导出表,他是一个虚表,只是满足特定条件的一个数据表的映像
- 模式定义: 创建
- 数据控制
数据库安全性:保护数据库以防止不合法使用所造成的数据泄漏,更改或破坏
- 不安全的因素:
- 非授权用户对数据库的恶意存取和破坏(黑客盗取用户名和用户口令,所以要进行身份验证)
- 数据库中重要或敏感的数据被泄漏
- 安全环境的脆弱性
- 数据库安全性控制
- 用户身份鉴别
- 静态口令鉴别
- 动态口令鉴别
- 生物特征鉴别
- 智能卡鉴别
- 存取控制
- 定义用户权限
- 合法权限检查
- 自主存取控制(C2级) 用户对于不同的数据库对象有不同的存取权限,不同的用户对同一个对象也有不同的权限,而且用户还可以将其拥有的权限转授给其他用户
- 强制存取控制(B1级) 每一个数据库对象被标一定的密级,每一个用户也被授予某一个级别的许可证.对于任意对象,只有具有合法许可证的用户才可以存取
- 主体:系统中的活动实体,实际用户or各进程
- 客体:被动实体,被操纵的数据对象
- 规则
- 仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体
- 当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体
- 审计:把用户对数据库的所有操作自动记录下来放入审计日志
- 数据加密 明文->密文
- 存储加密
- 透明存储 内核级加密 对用户透明
- 非透明存储 用多个函数加密 用户主动设置的
- 传输加密
- 安全套接层协议SSL
- 确认通信双方端点的可靠性
- 协商加密算法和密钥
- 可信数据传输
数据库完整性 数据的正确性(符合现实语义,反应当前实际状况的)和相容性(同一对象在不同关系中的数据是符合逻辑的)
- 关系的完整性
- 实体完整性:若属性A是基本关系R的主属性,则A不能取空值
- 参照完整性:设F为R的一组或一个属性,但不是R的码, K为S的主码.若F与K相对应,则称F是R的外码, 并称基本关系R为参照关系, S为被参照关系
- 用户定义的完整性:用户自定义的一些规则
- 列值非空 (NOT NULL)
- 列值唯一 (UNIQUE)
- 检查列值是否满足一个条件表达式(CHECK 短语)
ssex char(2) check(ssex in > ('男', '女'))- 还可以使用check(短语) 设置整个元组需要满足的条件
- 完整性约束命名字句(独立一句完整性约束语句)
constraint <完整性约束条件名> <完整性约束条件>- 断言(可以理解为对整个表的约束)
create assertions aName check (60>=> (select (*)from student)))check到的条件为假时拒绝插入数据, 每次插入都会出发> 断言检查- 触发器 用户定义在关系表上的一类由事件驱动的特殊过程
关系数据理论
- 第一范式:每个分量都是不可分的数据项
- 数据依赖:一个关系内部属性与属性之间的一种约束关系,这种约束关系是通过属性间值得相等与否体现出来得数据间得相关关系
- 函数依赖(FD):某个属性值确定后,关系内的某些其他属性值也唯一的确定,
- 例如:学生学号确定下来之后就可以唯一的确定这个学生的名字学院等
- 函数依赖这种关系称为函数依赖记为 x函数确定Y 或者Y函数依赖于X 表示为X->Y
- 如果X->Y 且对于任何X的真子集都不能函数确定Y 则说明 Y对X 完全函数依赖
- X->Y, Y不能函数确定X Y->Z Z不含于Y 则称Z对X传递函数依赖
- 函数依赖(FD):某个属性值确定后,关系内的某些其他属性值也唯一的确定,
- 范式
- 规范化:一个低一级范式的关系模式通过模式分解可以转换为若干个高一级范式的关系模式的集合
- 2NF:若R属于1NF,且每一个非主属性完全函数依赖于任何一个候选码,则R属于2NF
- 不符合2NF产生的问题
- 插入异常
- 删除异常
- 修改复杂
- 改进方法:利用投影分解,将整个关系分解为若干关系,使得分解的关系符合2NF
- 不符合2NF产生的问题
- 3NF:若R属于3NF则每一个非主属性既不传递依赖于码,也不部分依赖于码
- 问题和改进措施同上
- BCNF:
- 所有非主属性对每一个码都是完全函数依赖
- 所有主属性对每一个不包含它的码也是完全函数依赖
- 没有任何属性完全函数依赖于非码的任何一组属性
- 有的R属于3NF其未必属于BCNF
- 多值依赖
- R是属性值上个一个关系模式,X Y Z 是U的子集, 并且Z=U-X-Y, 关系模式R中多值依赖X->->Y成立 当且仅当对R的任意关系r.给定一对(x,z)值,有一组Y的值,这组值仅仅决定于x值与z值无关
- 对称性:若X->->Y 则 X->->Z
- 传递性: X->->Y, Y->->Z 则x->->Z-Y
- 函数依赖与多值依赖的区别
- 多值依赖的有效性与属性集的返回有关 因为多值依赖的定义中不仅涉及属性组X Y 而且还涉及U中的其他属性Z
- 函数依赖X->Y 则对于Y的任何子集都有X能函数确定,但是X->->Y 不能推出X多值依赖确定Y的子集
- 4NF:如果对于R的每一个非平凡多值依赖X->->Y X都有码,则R属于4NF
- 4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖
- 4NF就是解决BCNF因为多值依赖而数据冗余的问题
数据依赖的公理系统(Armstrong)
- 自反率: X->Y为F所蕴含
- 增广率:X->Y为F所蕴含 Z是U的子集,则XZ->YZ为F所蕴含
- 传递率:X->Y Y->Z 则X->Z
- 三条规则得出新的推理规则
- 合并规则: X->Y X->Z X->YZ
- 伪传递规则:X->Y WY->Z 有XW->Z
- 分解规则:X->Y Z是Y的子集 则 X->Z
- 覆盖 最小依赖集 最小覆盖 极小依赖集
数据库设计
- 需求分析 数字字典,数据项,数据结构,数据流,数据存储
- 调查用户需求
- 数据字典
- 数据项
- 数据结构
- 数据流
- 数据存储
- 处理过程
- 概念结构设计 E-R图
- 属性的特点:作为属性,不能再具有需要描述的性质,属性不能与其他实体具有联系
- 逻辑结构设计 数据模型的选定
- E-R图转为关系模式
- 1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并
- 1:n联系可以转换为一个独立的关系模式,也可以与n端对应得关系模式合并
- m:n联系转换为一个关系模式
- 具有相同码得关系模式可以合并
- E-R图转为关系模式
- 物理结构设计 物理结构设计
- 确定数据库的物理结构
- 对物理结构进行评价
- B+树索引存取方法的选择:根据应用要求确定对关系的那些属性列建立索引,哪些属性列建立组合索引,哪些索引要设计为唯一索引
- 如果一个属性经常在查询条件中出现,则考虑在这个属性上建立索引
- 如果属性经常作为最大值和最小值等聚集函数的参数,则考虑在这个属性上建立索引
- 如果一个属性经常在链接操作的连接条件中出现,则考虑在这个属性上建立索引
- hash索引存取方法
- 聚簇存取方法
- 数据库实施 创建数据库
- 数据库运行和维护 维护
UML(非针对数据建模的,而是为软件开发的所有阶段提供模型化和可视化支持的规范语言)
游标:系统为用户开设的一个数据缓冲区, 存放SQL语句的执行结果,每个游标区都有一个名字
SQL嵌入式编程,SQL过程化
ODBC编程
OLE DB编程
JDBC编程
关系查询处理和查询优化
- 代数优化
- 选择操作的实现
- 简单的扫描全表
- 索引扫描算法 如果对选择条件属性建立了索引(B+树,hash) 则可以直接通过索引找到满足条件的元组
- 连接操作的实现
- 嵌套循环算法
- 双重循环(内层一个个循环,匹配外层)
- 排序-合并算法
- 齐头并进
- 索引连接
- 通过查找连接条件的索引进行连接
- hash join
- 嵌套循环算法
- 查询树的启发式优化
- 选择运算应尽可能先做
- 把投影运算和选择运算同时进行
- 把投影同其前或后的双目运算结合起来
- 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算
- 找出公共子表达式
- 选择操作的实现
- 物理优化
- 选择查询方法(选择索引,全表扫描还是hash)
- 查询优化可以显著减少查询量,提高系统性能
事务: 用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位
- 特性:
- 原子性
- 一致性 事务的执行结果必须从一个状态转向另一个状态,不能出现部分改变,部分不变
- 隔离性:各个事务之间不能被干扰
- 持续性:事务对数据库中数据的改变应该是持久的,不应该被其他操作或故障影响
- 数据库恢复
- 故障类别
- 事务内部故障
- 系统故障:造成系统停止运转的任何事件,使得系统要重新启动
- 介质故障:硬件故障
- 计算机病毒:人为的故障
- 针对故障进程恢复数据的措施是冗余(那数据在其他地方的备份来恢复数据)
- 恢复
- 数据转储(但是只能恢复到备份时的状态,因为恢复到数据故障时状态非常耗时)
- 静态转储 不能改
- 动态转储 能改 但是要加上日志
- 海里转储 一次性所有 (小型)
- 增量转储 一次转储更新的部分(大型)
- 数据转储(但是只能恢复到备份时的状态,因为恢复到数据故障时状态非常耗时)
- 故障类别
- 数据库镜像
- 根据数据库管理员的要求,自动把整个数据库或其中的关键数据复制到另一个磁盘上,每当主数据库更新时,数据库管理系统自动把更新后的数据复制过去,保证镜像数据和主数据库的一致性
事务的并发控制
- 根据数据库管理员的要求,自动把整个数据库或其中的关键数据复制到另一个磁盘上,每当主数据库更新时,数据库管理系统自动把更新后的数据复制过去,保证镜像数据和主数据库的一致性
- 事务是并发控制的基本单位
- 并发操作带来的数据不一致性(主要是破坏了事务的隔离性)
- 丢失修改:两个事务同时修改,后面的提交破坏了前面事务的提交结果
- 不可重复读:一个事务读取数据后,另一个事务修改了数据,前一个读取数据的事务,无法再读取到与第一次读取结果相同的数据了
- 读脏数据: A事务修改了数据,此时B事务读取该数据,A因为某些原因撤销了对数据的修改,此时数据库的数据恢复,而B获取的数据已经和数据库的数据不一致了
- 并发控制的方法有封锁,时间戳,乐观控制法,多版本并发控制
- 封锁
- 排他锁(X锁)
- 使用排他锁后只有该事务能对数据读写,其他任何事务都不能再对该数据上锁,直到释放锁为止(保证了再修改完毕数据前,其他任何事务都不能读取和修改数据)
- 共享锁(S锁)
- 使用共享锁后,其他事务也可以对该数据上共享锁,但是不能上X锁(保证大家都能读这段数据,但是读完前不能修改)
- 封锁协议
- 一级 修改数据前必须上X锁
- 二级 读取数据前必须上S锁,读完就释放(不能保证不可重复读)
- 三级 读数据前上S锁,直到事务结束才释放
- 活锁(饥饿)
- 死锁(死锁) 两个事务封锁了一部分数据,同时申请被其他事务封锁的数据
- 死锁的预防
- 一次封锁法(摒弃请求并保持条件)
- 顺序封锁法(摒弃环路等待条件)
- 死锁的诊断和解除
- 超时法和等待图法进行判断是否发生死锁,超时法需要恰当的时间范围,否则容易判断失误,等待图法中出现回路时说明出现了死锁
- 选择一个处理代价最小的事务将其撤销进行死锁解除
- 死锁的预防
- 两段锁协议
- 事务分为两个阶段
- 第一阶段获得封锁,成为扩展阶段,事务可以向任何数据加上任何锁,但是不能释放任何锁
- 第二阶段释放封锁,称为收缩阶段,这个阶段事务可以释放任何封锁,但是不能申请任何锁
- 事务遵循两段锁协议是串行化调度的充分条件,不是必要条件
- 事务分为两个阶段
- 多粒度封锁
- 意向锁:若对一个阶段加上意向锁,说明该节点的下层节点正在被加锁,每个被加锁的节点都要给其上层节点加上意向锁
- 排他锁(X锁)

浙公网安备 33010602011771号