数据库常见问题整理


数据库

总体来说, 出现的频率很高但是问题问的不是很深, 并且内容少.

数据库系统概述

数据管理技术的发展主要经历三个阶段:人工管理阶段, 文件系统阶段, 数据库系统阶段.

数据库的完整性: 数据库的完整性是指防止数据库中存在不正确的数据.

数据库系统结构

数据库系统结构: 外模式, 概念模式(模式), 内模式

物理数据独立性: 更改模式/内模式映像

逻辑数据独立性: 更改外模式/模式映像

数据处理三阶段: 概念设计, 逻辑设计, 物理设计.

概念模型(E - R模型): 信息模型, 语言描述.

E - R模型三要素: 实体, 属性, 联系(一对一, 一对多, 多对多)

逻辑模型: 数据的逻辑存储方式, 比如层次模型(有向树), 网状模型(有向图), 关系模型(二维表), 面向对象模型等.

物理模型: 物理存储介质上怎么存的.

关系数据库的基本理论

关系模式, 关系子模式, 存储模式分别与外模式, 模式, 内模式相对应.

超键: 能唯一标识元组的属性或属性组称为关系的超键.

候选键: 如果一个属性组能唯一标识元组, 且又不含有多余的属性, 那么这个属性组称为关系的候选键.

主键: 若一个关系中有多个候选键, 则选其中的一个为关系的主键.

外键: 另一个关系的参照关系.

范围: 超键 > 候选键 > 主键.

关系的完整性约束

实体完整性: 主属性不为空.

参照完整性: 关系之间的引用, 参照关系的外键必须是被参照关系的主键或空.

用户自定义完整性: 用户自己定义的完整性.

关系代数

集合运算

交, 并, 差, 笛卡尔积.

笛卡尔积: 互相组合, 表A有3个元组, 表B有2个元组, 那么$A \times B$为2x3个元组.

关系运算

选择, 投影, 连接, 除(没学)

选择 $\sigma$: $\sigma_{condition}(R)$ 表示对表R进行condition的条件筛选. 根据条件选若干元组组成新的关系.

投影 $\pi$: $\pi_A(R)$ 表示从R表中选名为A的列, 并去除重复元组.

连接 $A\underset{C\theta D}⋈B$ : 连接符号下方添加C和D的关系条件, 表示从连接的结果中选出符合条件的元组.

自然连接$A⋈B$: 从两表中取相同属性列等值的元组, 并去掉重复列.

自然连接和等值连接的区别?

自然连接中相等的分量必须是相同的属性组, 并且要在结果中去掉重复的属性, 而等值连接则不必.

外连接是什么?

外连接是指两个表在进行操作时, 不仅返回符合连接和查询条件的元组, 还返回不符合条件的一些元组;
左外连接是指返回左表中仅符合连接条件不符合查询条件的元组;
右外连接是指返回右表中仅符合连接条件不符合查询条件的元组;
全外连接是左外连接和右外连接去掉重复项的元组集并集.

关系模式规范化

函数依赖

函数依赖: 对于X的每一个值, Y都有唯一值与之对应. 即$x \rightarrow y$ 称y函数依赖于x, 即y被x决定. 也称为x函数决定y.

完全函数依赖: 依赖关系中的键没有冗余属性.

部分函数依赖: 有冗余属性.

传递函数依赖: 依赖之间存在传递关系.

范式

第一范式(1NF): 对于关系模式所有属性都是不可分的基本数据项.

第二范式(2NF): 是第一范式, 且每个非主属性都完全依赖候选键(这个时候可以是传递依赖).

第三范式(3NF): 是第二范式, 且每个非主属性也不传递依赖于候选键(属性不能传递依赖于主属性).

数据库设计

ER图向关系模式转换

一对一: 直接合并成一张表.

一对多: 合并成一张表, 合并到多的那端.

多对多: 将两张表的主键拿出来单独形成一张表, 并储存与该关系相关的属性.

一对一对多: 单独形成一张表.

基本步骤

需求分析: 了解和分析用户需求;
概念结构设计: 对用户需求进行抽象和归纳, 形成一个独立于DBMS的概念模型(E-R图);
逻辑结构设计: 将概念结构转换为数据模型, 通常为关系模型;
物理结构设计: 为逻辑数据模型选取一个最适合存储结构和存取方法;
数据库实施阶段: 编写数据库, 编写和调试应用程序;
数据库运行和维护: 正式投入运行.

SQL语法

我估计应该不会考写SQL, 所以就整理一部分.

表管理操作

# 创建表
Create table BR
( RNo char(7) not null,
  ISBN char(13) not null,
  BDate date,
  primary key (RNo,ISBN),
  foreign key (RNo) references R(RNo),
  foreign key (ISBN) references B(ISBN)
 )

# 修改表
ALTER TABLE S
  ALTER COLUMN SEX CHAR(1) NULL 
ALTER TABLE S
  DROP COLUMN  AGE

# 删除表  
DROP TABLE <表名>
DROP TABLE S

# 插入数据
INSERT INTO <表名>
         [<属性列1> [, <属性列2>……)]
VALUES   ( <常量1>  [, <常量2>]……)
Insert into sc (Cno,Sno)
Values ('c2','s4')

# 修改表数据
UPDATE <表名>
   SET <列名>=<表达式>[,… n]
   [WHERE <逻辑表达式>]
UPDATE S
SET SNAME='姜芸',AGE=22
WHERE SNO='S2'

# 删除表数据
DELETE FROM <表名>
[WHERE <逻辑表达式>]
DELETE from S
WHERE SNAME='张丽'

基本查询

# 简单查询
SELECT SNo,SName
FROM   S
SELECT SName, Year(Getdate())-Age
FROM   S
SELECT SName,     
      'Year of Birth:',
       Year(Getdate())-Age,
       Lower(Sdept)
FROM   S
SELECT SName,     
      'Year of Birth:' AS 'YEAR OF BIRTH', # 可以给列赋别名
       Year(Getdate())-Age 'Birthday',
       Lower(Sdept) Department
FROM   S
# 去重
SELECT Distinct SNo
FROM   SC
# 多条件查询
Select SName,Sdept
From   S
Where  Sdept='CS' OR Sdept='MA' OR Sdept='IS'
# 范围查询
Select SName,Sdept,Age
From   S
Where  Age BETWEEN 20 AND 23
# 确定集合
Select SName,Sdept
From   S
Where  Sdept IN ( 'CS','MA','IS' )

语句执行顺序: From -> Where -> Group by -> Having -> Select -> Order by

视图与索引

视图

视图: 包含了一系列带有名称的列和数据行, 这些列和数据行来自由定义视图的查询所引用的表, 并且在引用视图时动态生成.

视图的作用?

  1. 能够简化用户的操作
  2. 使用户能以多种角度看待同一数据
  3. 在一定程度上提供了数据的逻辑独立性
  4. 能够对秘密数据提供安全保护
  5. 利用可以更清晰的表达查询

视图机制是如何对数据库实现安全性控制的?

可以对不同的用户定义不同的视图, 也就是说, 通过视图机制把要保密的数据对无权存取的用户隐藏起来.

索引

当表的数据量比较大时, 查询操作比较耗时, 建立索引可以加快查询速度.
优点: 加速查询速度; 缺点: 索引需要占一定的存储空间, 且基本表更新时需要维护索引表.

索引表是与基本表关联的一种数据结构, 它包含由基本表中的一列或多列生成的索引键和基本表中包含各个索引键的行所在的存储位置. 不论基本表中是否按索引键有序, 但索引中总是按索引键有序的.

优点:

  1. 创建唯一性索引, 可以保证每一行数据的唯一性;
  2. 可以大大加快数据的检索速度;
  3. 可以加速表和表之间的连接;
  4. 在使用分组和排序子句进行数据检索时, 同样可以显著减少查询中分组和排序的时间;
  5. 通过使用索引, 可以在查询的过程中, 使用优化隐藏器, 提高系统的性能.

缺点:

  1. 创建索引和维护索引要耗费时间;
  2. 索引需要占用物理空间;
  3. 当对表中的数据进行增加、删除和修改的时候, 索引也要动态的维护, 这样就降低了数据的维护速度.

聚集索引: 会对基本表进行物理排序, 所以这种索引对查询非常有效, 在每一张基本表中只能有一个聚集索引.

非聚集索引: 不对基本表进行物理排序.

基本的索引类型:

唯一性索引和复合索引.

唯一性索引保证在索引列中的全部数据是唯一的, 不会包含冗余数据.

复合索引就是一个索引创建在两个列或者多个列上, 可以减少一在一个表中所创建的索引数量.

应该哪些列建立索引:

在作为主键的列上, 强制该列的唯一性和组织表中数据的排列结构.

在经常用在连接的列上, 这些列主要是一些外键, 可以加快连接的速度.

在经常需要根据范围进行搜索的列上创建索引, 因为索引已经排序, 其指定的范围是连续的.

在经常需要排序的列上创建索引, 因为索引已经排序, 这样查询可以利用索引的排序, 加快排序查询时间.

在经常使用在where子句中的列上面创建索引, 加快条件的判断速度.

存储过程、触发器

存储过程

存储过程是一种数据库对象, 独立存储在数据库内, 它可以接受参数、输出参数、返回单个或多个结果集以及返回值. 是个预编译的SQL语句集合, 优点是可以建立非常复杂的查询, 只需创建一次, 在程序中即可多次调用, 且比执行单纯的SQL语句要快. 可以创建一个命令对象进行调用.

触发器

触发器是用户定义在关系表上的一类由数据驱动的一类由事物驱动的特殊过程, 类似于约束, 但是比约束更灵活, 是保证数据库完整性的一种方法. 任何用户对表进行增删改操作都会有数据库服务器自动激活相应的触发器, 对数据库进行相应的检查和操作.

数据库并发控制

事务

事务是并发控制的基本单位, 它是一个操作序列, 这些操作要么都执行, 要么都不执行, 是一个不可分割的工作单位. 事务是数据库维护数据一致性的单位, 在每个事务结束时, 都能保持数据一致性.

ACID特性:

A, atomacity: 原子性. 事务必须是原子工作单元, 对于数据的执行要不是全部执行, 要不都不执行. 如果只执行一个子集, 可能会破坏事务的总体目标.

C, consistency: 一致性. 事务将数据库从一种一致状态变为下一种一致状态

I, isolation: 隔离性. 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离. 事务查看数据时数据所处的状态, 要么是另一并发事务修改它之前的状态, 要么是另一事务修改它之后的状态, 事务不会查看中间状态的数据. 换句话说, 一个事务的影响在该事务提交前对其他事务都不可见.

D, durability: 持久性. 事务完成之后, 它对于系统的影响是永久性的. 该修改即使出现致命的系统故障也将一直保持.

为什么事务非正常结束时会影响数据库数据的正确性

事物具有一致性, 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态. 如果数据库系统运行中发生故障, 有些事务尚未完成就被迫中断, 这些未完成事务对数据库所做的修改有一部分已写入物理数据库, 这时数据库就处于一种不正确的状态, 或者说是不一致的状态.

并发访问不一致性

在数据库中为什么要并发控制?

数据库是共享资源, 通常有多个事物在同时执行, 当多个事物并发的存取数据库时就会存在同时读或写统一数据的情况, 如果对并发操作不加控制, 就会存在数据读取或存取错误, 破坏数据库的一致性.

都有哪几种并发出现的问题?

后面三个都是两次数据读取不一样. 脏读是因为ROLLBACK, 不重复读是因为修改数据, 幻读是因为插入或删除了数据. 而丢失数据是因为两个事物都对同一条数据进行了修改, 然后撤销时一起撤销了.

  1. 丢失数据:

    • 两个事务都对一个数据进行修改, 一个先修改, 另一个随后修改, 第二个修改覆盖了第一个的修改.

    • 两个事务更新相同的数据源, 如果第一个事务被提交, 第二个却被撤销, 那么连同第一个事务做的更新也被撤销.

  2. 读脏数据: T1对一个数据做了修改, T2读取这一个数据. 若T1执行 ROLLBACK 操作, 则 T2读取的结果和第一次的结果不一样. 当一个事务读取另一个事务尚未提交的修改时, 产生脏读.

  3. 不可重复读(非重复读): T1读取一个数据, T2对该数据做了修改. 如果 T1再次读取这个数据, 此时读取的结果和第一次读取的结果不同. 一个事务对同一行数据重复读取两次, 但是却得到了不同的结果. 同一查询在同一事务中多次进行, 由于其他提交事务所做的修改或删除, 每次返回不同的结果集.

  4. 幻读: T1读取某个范围的数据, T2在这个范围内插入新的数据, T1再次读取这个范围的数据, 此时读取的结果和和第一次读取的结果不同. 事务在操作过程中进行两次查询, 第二次查询的结果包含了第一次查询中未出现的数据(这里并不要求两次查询的SQL语句相同). 这是因为在两次查询过程中有另外一个事务插入数据造成的.

解决方案:

在并发环境下, 事务的隔离性很难保证, 因此会出现很多并发一致性问题. 产生并发不一致性问题的主要原因是破坏了事务的隔离性. 解决方法是通过并发控制来保证隔离性, 并发控制可以通过封锁来实现.

封锁机制

锁是最常用的并发控制机构, 是防止其他事务访问指定资源, 实现并发控制的一种手段.

共享锁(S锁): 用于只读操作(SELECT), 锁定共享的资源. 共享锁不会阻止其他用户读, 但是阻止其他的用户写和修改.

更新锁(U锁): 用于可更新的资源中. 防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁.

独占锁(X锁, 也叫排他锁): 一次只能有一个独占锁用在一个资源上, 并且阻止其他所有的锁包括共享缩. 写是独占锁, 可以有效的防止“脏读”.

死锁: 系统中有两个或两个以上的事务都处于等待状态, 并且每个事务都在等待其中另一个事务解除封锁, 它才能继续执行下去, 结果造成任何一个事务都无法继续执行, 这种现象称系统进入了“死锁”(dead lock)状态.

封锁协议

一级封锁协议: 事务在修改数据之前加写锁, 直到事务结束才释放. 该协议可以防止丢失修改;
二级封锁协议: 在一级封锁协议的基础上, 加上了事务在读取数据之前对其加读锁, 读完后即可释放读锁. 该协议避免了读脏数据;
三级封锁协议: 在一级封锁协议的基础上, 加上了事务在读取数据之前必须加上读锁, 直到事务结束才释放. 该协议解决了不可重复读问题.

数据库的备份与恢复

数据库故障的种类有哪几种?相应的恢复策略是什么?
答: 三种: 事物故障、系统故障、介质故障;

事物故障是指事物在运行至终点前被中止;
事物故障恢复是由系统自动完成, 利用日志文件撤销此事务已对数据库进行的修改;

系统故障是指造成系统停止运转的任何事件, 使得系统要重新启动;
系统故障的恢复是在重新启动后系统自动完成, 为了防止系统故障造成的数据不一致性, 必须撤销故障时未完成的事物, 重做已完成的事物;

介质故障是指磁盘上的物理数据和日志文件被破坏;
介质故障的恢复方法就是重装数据库, 重做已经完成的事物.

数据库恢复的基本技术有哪些?
数据转储和登录日志文件是数据库恢复的基本技术.  
数据转储是指DBA定期将数据库复制到其他介质上进行保存, 这些备份的数据叫做后备副本;
登记日志文件, 日志文件是用来记录事物对数据库进行更新操作的文件.
当系统运行过程中发生故障, 利用转储的数据库后备副本和日志文件就可以将数据库恢复到故障前的某个一致性状态.

数据库恢复的关键是什么?
关键是建立冗余数据.

登记日志文件时为什么必须先写日志文件, 后写数据库?
把对数据的修改写到数据库中和把表示这个修改的日志记录写到日志文件中是两个不同的操作. 有可能在这两个操作之间发生故障, 即这两个写操作只完成了一个.
如果先写了数据库修改, 而在运行记录中没有登记这个修改, 则以后就无法恢复这个修改了. 如果先写日志, 但没有修改数据库, 在恢复时并不会影响数据库的正确性. 所以一定要先写日志文件, 即首先把日志记录写到日志文件中, 然后写数据库的修改

备份的几种方式?

完整备份: 指备份整个数据库的所有内容, 包括事务日志.

差异备份: 对完整备份的补充, 只备份上次完整备份后更改的数据.

事务日志备份: 只备份事务日志里的内容, 即数据库的所有变动.

文件或文件组备份: 只备份数据库中的某些文件.


文章作者: DaNing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 DaNing !
评论
 上一篇
嵌入在线Markdown编辑器 嵌入在线Markdown编辑器
嵌入在线Markdown编辑器因为Hexo是经过静态编译的, 所以其实不太需要在线编辑的Markdown, 因为平常都用Typora. 但是这仍然可以作为一个小功能放在自己的网站中. 在它的文档还有其他功能, 比如做在线代码编译器等. 下载
2020-07-25
下一篇 
jsDelivr和minivaline一起使用 jsDelivr和minivaline一起使用
jsDelivr和minivaline一起使用这个问题只有在使用matery1.31及以下版本时会遇到. 作者虽然在主题的_config.yml中添加了minivaline这个js, 但是当同时启用jsDelivr时会发生地址拼接的错误,
2020-07-24
  目录