- 数据模型:关系模型、实体-联系模型、半结构化数据模型、基于对象的数据模型。
- 数据抽象:物理层、逻辑层、视图层。
- 文件处理系统的弊端:数据冗余和不一致、数据访问困难、数据孤立、完整性问题、原子性问题、并发访问异常、安全性问题。
- 数据库引擎:存储管理器、查询处理器部件、事务管理部件。
- 存储管理器:是数据库系统中负责在数据库中存储的低层数据与应用程序以及向系统提交的查询之间提供接口的部件。
包括:
- 权限及完整性管理器:检测是否满足完整性约束,并检查试图访问数据的用户的权限。
- 事务管理器:它保证即使系统发生故障,数据库也保持在一致的状态,并保证并发事务的执行不发生冲突。
- 文件管理器:管理磁盘存储空间分配,管理用于表示磁盘上所存储信息的数据结构。
- 缓冲区管理器:负责将数据从磁盘上取到内存中,并决定哪些数据应该被缓冲存储在内存中。
实现的数据结构:数据文件(它存储数据库自身)、数据字典(存储关于数据库的元数据,特别是数据库模式)、索引(提供对数据项的快速访问)。
- 查询处理器:帮助数据库简化和促进了对数据的访问。
包括:
- DDL解释器:解释DDL语句并将这些定义记录在数据字典中。
- DML编译器:将查询语言中的DML语句翻译为一系列查询执行引擎能理解的低级指令的执行方案。还可以进行查询优化,选出代价最小的执行方案。
- 查询执行引擎:执行由DML编译器产生的低级指令。
- 事务管理:
包括:
- 并发控制管理器:控制并发事务间的相互影响,保证数据库的一致性。(一致性、隔离性)
- 恢复管理器:检测系统故障并将数据库恢复至故障发生前的状态。(原子性、持久性)
- Varchar和char的区别:varchar为可变长度类型,char为固定长度类型
- 什么是数据库索引:索引是一种数据结构,协助快速查询、更新数据库表中的数据。
- 数据库索引一般采用什么结构:b树以及b+树。
- 事务的四种特性是什么:原子性、一致性、隔离性、持久性。
- 事务是什么:事务是访问并可能更新各种数据项的程序执行单元。
- 为什么要在数据库中引入事务:在数据库中引入事务的概念是因为事务为数据库操作序列提供了一种从故障恢复到正常状态的方法,同时也提供了一种即使在异常状态下也能保持数据库一致性的方法。
- 触发器:触发器是作为对数据库修改的连带效果而由系统自动执行的一条语句。
- 函数与触发器的异同:函数和触发器都是存储在数据库中的一段代码。差别是函数需要显式调用,有返回值;触发器需要有触发事件,系统自动调用,无返回值。
- 用户自定义类型和域的差别:用户自定义类型是强类型检查,无法定义约束,域是弱类型检查,可以定义约束。
- DDL:数据定义语言。提供定义关系模式、修改关系模式、删除关系模式的命令。包括:create、drop、alter、grant、revoke等。DDL的输出放在数据字典中,数据字典包含元数据,元数据是关于数据的数据。
DML:数据操纵语言。提供从数据库查询信息以及在数据库插入元组、删除元组、修改元组的能力。包括:select、insert、update、delete等。
- from子句嵌套的子查询中不能使用来自from子句其它关系的相关变量。加入lateral作为前缀,可以访问from子句中在它前面的表或子查询中的属性。
- E-R图转化关系模式时,联系集需要包含自身的属性,还需要包含参与该联系的属性集的主码。
- with as和视图的区别:with as 等同于一次性视图,只会持续到下一个查询。在之后就不能再被引用。
- 关系R与关系S要进行自然连接,需要满足什么条件:至少有一个同名属性列。
- 视图是可更新的,需要满足以下条件:
(1)、from子句只有一个数据库关系
(2)、select子句只包含关系的属性名,不包含任何表达式、聚集或distinct声明
(3)、没有出现在select的语句中的任何属性都可以取null;也就是说,这些属性没有非空约束,也不构成主码的一部分
(4)、查询中不包含group by或having子句
- 3nf范式分解能够保证函数依赖一定能够得到保持的原因:3nf分解将一个大表分解成多个小表,每个小表包含相关的属性,从而避免了非主属性对主键的部分函数依赖和传递函数依赖的情况。
- 函数和过程的异同:函数和过程都是存储在数据库中的元数据。函数和过程都可以被调用。二者的区别在于,函数有显式的返回值,而过程没有显式的返回值。但是二者实际上都可以有返回值还可以不止一个。
- 在数据库中,如果两个关系进行集合并运算,那么这两个关系必须满足什么条件:两个关系必须具有相同的属性集合,两个关系的对应属性的域必须相同。
- 可恢复调度:对于每对事务Ti和Tj,若Tj读取了由Ti之前所写过的数据项,则Ti的提交操作出现在Tj的提交操作之前。
- 无级联调度:对于每对事务Ti和Tj都满足若Tj读取了先前由Ti所写的一个数据项,则Ti的提交操作必须在Tj读操作之前。
- 可串行化调度:在并发执行的情况下,我们通过保证所执行的任何调度的效果都与没有任何并发执行的调度效果一样来确保数据库的一致性。
- 触发器是由触发事件发生而自动执行的一段代码。触发事件可以是insert, delete,update。不可以是select。
- 事务必须处于一下状态之一:
- 活跃:初始状态,当事务执行时就处于这种状态。
- 部分提交:在最后一条语句被执行后。
- 失效:在发现正常执行不能再继续后。
- 中止:在事务已回滚并且数据库已被恢复到它在事务开始前的状态之后。
- 提交:在成功完成之后。
- 回滚:中止事务造成的变更已撤销。
- 撤销已提交的事务所造成的影响的唯一方式:执行一个补偿事务。
- 两阶段锁(保证可串行化,可能会发生死锁和级联回滚):事务分为两个阶段提出加锁和解锁申请。起初,事务处于增长阶段,事务根据需要获得锁;一旦事务释放了一个锁,它就进入了缩减阶段,并且不能再提出加锁请求。
- 严格两阶段锁(保证可串行化、不会发生级联回滚,可能发生死锁):在两阶段锁的基础上,要求事务锁持有的排他锁必须在事务提交后才能释放。
- 强两阶段锁(保证可串行化,可能会发生死锁和级联回滚):事务提交前保留所有的锁。