复试面试-数据库面试题

将网上常见的数据库面试题整理一下,方便自己和有需要的人学习。

1.事务

概念:访问并可能操作各种数据项的一个数据库操作序列这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成,满足ACID特性

2.ACID特性

  • 原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。

  • 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。

  • 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。

  • 持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

注:事务的ACID特性是由关系数据库系统(DBMS)来实现的,DBMS采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所作的更新,如果某个事务在执行过程中发生错误,就可以根据日志撤销事务对数据库已做的更新,使得数据库回滚到执行事务前的初始状态。
单用户对数据库的串行操作并不会有隔离的问题,但当多用户并发对数据库进行操作时就会有并发一致性问题(读者可以思考一下不同的读写操作可能会引起哪几种不同的并发问题),这是致命的,所以必须满足事务的隔离性。DBMS是采用锁机制来实现事务的隔离性的。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。(可以结合操作系统中的同步互斥问题一起学习)

3.数据库的3级模式

  • 外模式:外模式又称子模式或用户模式,对应于用户级。它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。
  • 概念模式:又称模式或逻辑模式,对应于概念级。它是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。
  • 内模式:又称存储模式,对应于物理级。它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式和物理结构,对应着实际存储在外存储介质上的数据库。

注:数据库一旦被定义好,内模式和概念模式就是唯一确定的,但建立在数据库系统之上的应用则是非常广泛、多样的,所以对应的外模式不是唯一的,也不可能是唯一的。

4.视图

  • 视图是从一个或几个基本表(或视图)中导出的虚拟的表。在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。
    视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式。可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的数据。 视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。
  • 视图技术在数据库设计中很有用,可以提高用户操作的效率,也能提高数据库的安全性。

5.数据库中的各种键(码)

数据库中的键(key)也可以称为码,是关系模型中的一个重要概念,它是逻辑结构,不是数据库的物理结构

在一个关系(就是表)中,存在一个或多个属性(表中的列),可以在这个关系中将每个元组(表中的行)唯一标识,这个或这些属性就是键(码),又细分为:

  • 超键:能唯一标识元组的属性(集),一个属性可以为作为一个超键,多个属性组合也可以作为一个超键。
  • 候选键:候选键有两个要求:1.始终能够确保在关系中能唯一标识元组。2.在属性集中找不出真子集能够满足条件。
    其中第一个条件就是超键的标准,所以我们可以把候选键理解为不能再“缩小”的超键,最小的超键。
  • 主键(primary key):在一个关系中的候选键中指定一个来表示,主键不能为空值,也不能重复。一个关系中候选键可能有多个,但只能选择一个作为主键!在E-R图中主键用属性名带下划线标识。
  • 外键:在一个关系A中,有一个属性b不是关系A主键或候选键,但是是另一关系B的主键,这中情况属性b则是关系A中的外键。
    主键和外键是数据库设计中我们最常用到,最熟悉的!

注:学习函数依赖时我们再用函数依赖定义一下键,就更好理解了。

6.正确认识数据冗余

  • 主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚(没错我也不清楚~)。**非键字段的重复出现, 才是数据冗余!**而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。
  • 〖举个栗子〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

7.函数依赖(稍微复杂一点,需静心!实在看不下去可跳过,感觉不会太重点问这种难理解的抽象理论知识)

  • 定义:若关系R的任意两个元组在属性A1、A2、…、An上一致(即有相同分量值),则这两个元组在属性B上也一致,则称属性A1A2…An函数决定B,或称B函数依赖于A1A2…An 。 记为 A1A2…An → B

  • 怎样分析一个具体关系中的函数依赖
    1.根据实体属性之间的语义关系分析函数依赖
    2.应考虑所有可能的属性组合
    3.尽可能使函数依赖式的左面(A)最小化右面(B)最大化

  • 部分函数依赖:若X → Y,且存在X的真子集X’, X’→ Y,则称Y对X部分函数依赖。

  • 完全函数依赖:若X → Y,且Y对X不是部分函数依赖,则称Y对X是完全函数依赖。

  • 传递函数依赖:若X → Y,Y → Z,且Y → X,则称Z对X是传递函数依赖。

  • 用函数依赖再次理解一下键
    定义:对于关系R,若属性集合{A1,A2,…,An}满足下列条件,则该属性集合是R的一个键key:
    1.A1,A2,…,An函数决定R中所有其他属性。(超键)
    2.{A1,A2,…,An}的任何真子集都不能函数决定R中所有其他属性。(最小化=候选键)

注:函数依赖的定义是形式化的定义,而E/R模型中键的定义是一种非形式化的语义说明。二者是一致的。

  • 什么是函数依赖规则:在一个给定关系上,已知一组函数依赖作为前提条件。根据一组函数依赖规则,推断另一些函数依赖。
  • 为何需要函数依赖规则:可以根据函数依赖的计算和验证来有效地减少冗余,得到良好的关系设计。
  • 常见的函数依赖规则:分解/合并规则、平凡依赖规则、传递规则、Armstrong公理
    :具体就不仔细讲解了,大家有兴趣查阅查阅别的资料吧!
  • 两个函数依赖集合之间有何关系
    1.设T是关系R上的函数依赖集,若对R的所有实例,函数依赖X → Y都成立,则称T“逻辑蕴含” X → Y。(X → Y可由T推导出来)
    2.设S是关系R上的另一函数依赖集,若对R的所有实例,S中的所有函数依赖均成立,则称函数依赖集S“蕴含于”函数依赖集T。(S可由T推导出来)
    3.若函数依赖集S“蕴含于” T,同时T“蕴含于”S,则函数依赖集S“等价于”函数依赖集T。
  • 蕴含和等价关系有何用处
    1.可用等价的更简单的函数依赖集代替复杂的函数依赖集。
    2.可在一个函数依赖集S中增加蕴含其中的其它函数依赖。
    3.可判断一个函数依赖是否蕴含于已知的函数依赖集。

8.异常
什么是异常:即数据库设计不符合规范,在操作数据库时,影响数据一致性。主要有下列三种异常?

  • 冗余。同一信息在多个元组中不必要的重复。浪费空间,增加更新操作的复杂度,影响数据一致性。
  • 修改异常。当修改了某个元组中的信息,而重复的信息可能未修改而破坏一致性。插入数据时,某些有用信息暂时无法插入。
  • 删除异常。当删除某个元组时,可能删除其它信息;若需删除某个对象时,必须删除多个元组而不是一个元组。否则,破坏数据一致性。

9.范式
范式理论是为了规范数据库的设计,解决以上异常的。高级别的范式依赖于低级别的范式,1NF是最低级别的范式。

  • 第一范式(1NF):数据库表中的所有属性值都是不可分割的原子值。
  • 第二范式(2NF):数据库表中的每一列都与主键完全相关,而不能只与主键的部分相关。
  • 第三范式(3NF):数据库表中的每一列和主键直接相关,而不是间接相关。也就是属性不能传递依赖于主属性。
  • 实际上还有一些范式,但是考试中一般不涉及,因为实在是太深了,一般设计数据库也不会死磕。这点应付考试差不多了。
    常见范式的联系及其解决的问题

注:基本表及其字段之间的关系,应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的(这在算法中也是经常借鉴的,所以学习需要我们经常思考,寻找更优解!)。也就是讲数据冗余时我们所说的提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

10.E-R图
这个学过数据库都应该比较熟练了,简单回忆一下即可。别到时候问到了说不上来。

关系实体图(Entity-Relationship),有三个组成部分:实体、属性、联系。用来进行关系型数据库系统的概念设计。

  • 实体:用矩形表示,矩形框内写明实体名。(还有弱实体,用双矩形表示,了解即可。)
  • 属性:用椭圆形表示,并用无向边将其与对应的实体连接起来。
  • 联系:用菱形表示,菱形框内写明联系名,并用无向边分别有关实体连接起来。同时在无相边旁标上联系的类型(1…1、1…* 、* … *)即一对一、一对多、多对多关系。

11.ER模型转换为关系模型的原则(重要!)

  • 一对一:遇到一对一关系的话,在两个实体任选一个添加另一个实体的主键即可。
  • 一对多:遇到一对多关系的话,在多端添加另一端的组件。
  • 多对多:遇到多对多关系的话,我们需要将联系转换为实体,然后在该实体上加上另外两个实体的主键作为联系实体的主键(如学生选课表S-C),然后再加上该联系自身带的属性即可。这样将一个多对多关系分解成了两个一对多关系,要善于解决多对多关系。

12.索引

树是学习数据结构时最重要的数据结构之一,在查找算法中,我们学过B-树和B+树,索引即查找,同样可用B-树和B+树进行。

  • B-树:(Balance-Tree):也称为多路平衡查找树,所有的叶子节点位于同一层。
  • B+树:它不仅具有B-树的平衡性,并且可以通过顺序访问指针来提高区间查找的性能。

它们的最大区别是,B+树的非叶子结点不保存数据,只用于索引,所有的数据都保存在叶子节点中,并且叶子结点间按照从小到大顺序链接起来。这也是为什么SQL数据库会采用B+树来进行索引。相同的外存空间,用B+树数据结构进行索引能装下更多数据,索引速度更快。(参见《数据结构》)

13.触发器

一个触发器是存储在某个表中的一个命名的数据库对象。当该表进行某种数据更新时,将自动触发一组SQL语句的执行。使用触发器可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。触发器不要设计的太复杂。

猜你喜欢

转载自blog.csdn.net/qq_42533372/article/details/114312940