面试常见问题——数据库(三)

面试常见问题——数据库(三)

目录:

  1. 数据库中适合建立索引和不建立索引的情况
  2. 数据库独立性
  3. 数据库事务处理
  4. 存储过程及其优点
  5. 数据库索引类型
  6. 数据库范式
  7. 数据库锁
  8. 数据库数据模型
  9. 关系型数据库三类完整性约束
  10. 数据库安全性
  11. 触发器
  12. 数据库转储与备份
  13. SQL语言的作用
  14. E-R图的作用

1、数据库中适合建立索引和不建立索引的情况

  • 定义:索引是对数据库表中的一列或多列的值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息。索引过多会影响数据的更新操作。所建索引的数目一般不要超过3个,最好不要超过5个。
  • 建立索引的原则:
    • 一定要建立:
      • 主键的数据列
      • 有外键的数据列
    • 最好建立:
      • 经常查询的数据列
      • 需要在指定范围内快速或频繁查询的数据列
      • 经常在where字句中的数据列
      • 经常出现在关键字order by、group by、distinct后面的字段(如果是组合索引,索引的字段顺序要和这些关键字后面的字段顺序一致,否则索引不会被使用;同时,只有组合索引的第一个字段出现在查询条件中,该索引才可能被使用)
    • 不要建立:
      • 查询中很少涉及的列
      • 重复值比较多的列
      • 定义为text、image和bit的数据类型的列
        • text(文本):大于8000字符的字符串
        • image(图像):大于8000字节的二进制数据
        • bit:0和1,取出来到ResultSet中时是布尔类型
      • 经常更新的列

2、数据库独立性

  • 逻辑独立性:
    • 当模式改变时,只需改变各个外模式 / 模式映射,可以保持外模式不变。应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。
  • 物理独立性:
    • 当数据库的存储结构改变时,只需改变模式 / 内模式映射,可以保持模式不变,因此应用程序也可以保持不变,保证了数据与程序的物理独立性,简称数据的物理独立性。
  • 一些定义:
    • 数据库系统的三级模式结构:
      • 外模式(又称为子模式,用户级,不唯一),如学生表的视图展示
        • 某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。
        • 外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。
        • 反映了数据库的用户观。
      • 模式(又称为概念模式和逻辑模式,概念级,唯一),如学生表结构
        • 对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。
        • 反映了数据库系统的整体观。
      • 内模式(又称为存储模式,物理级,描述数据库存储结构,唯一),如学生表内部存储文件(数据文件、索引文件等)
        • 数据库中全体数据的内部表示或底层描述,描述了数据在存储介质中的存储方式和物理结构,对应着实际存储在外存储介质上的数据库。
        • 反映了数据库的存储观。
    • 三级模式的映射:
      • 数据库的三层模式使得用户能逻辑地、抽象地处理数据而不必关心数据在计算机中的物理表示和存储。

3、数据库事务处理

  • 定义:数据库中一个单独的执行单元,通常由SQL语言或编程语言编写的用户程序的执行所引起。当在数据库中更改数据成功时,在事务中更改的数据会提交,不可改变。否则,事务就取消或者回滚,更改无效。
  • 事务必须满足四个属性(ACID):
    • 原子性(Atomicity):
      • 事务是一个不可分割的整体,当数据修改时,要么全部执行,要么全部不执行,不允许事务部分地完成。
    • 一致性(Consistency):
      • 一个事务在执行之前和执行之后,数据库数据必须保持一致性状态。
      • 数据库的一致性状态应该满足模式锁指定的约束。
      • 由于并发操作带来的数据不一致性包括:
        • 脏读:一个事务读取了另一个事务未提交更新的数据。
        • 不可重复读:在一个事务内两次读到的数据是不一样的。
        • 幻读:当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一次查询不相同。
    • 隔离性(Isolation):
      • 当两个或多个事务并发执行时,为了保证数据的安全性,将一个事务内部的操作隔离起来,不被其他的正在进行的事务看到。如对于任何一对事务T1和T2,对T1而言,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行。
      • 数据库有四种类型的事务隔离级别:
        • 面试常见问题——数据库(三)_第1张图片
        • 读未提交:
          • 第一个事务未提交更新的数据,第二个事务可以读到
          • 可能出现脏读、不可重复读、幻读
        • 读已提交(不可重复读):
          • 第一个事务未提交更新的数据,第二个事务读不到;第一个事务提交更新的数据,第二个事务可以读到
          • 同一事务内读取的数据结果不一致
          • 解决脏读,会出现不可重复读和幻读
        • 可重复读(MySQL默认的事务隔离级别):
          • 同一事务内读取的数据结果一致
          • 解决脏读,不可重复读,但会出现幻读
        • 串行化 (Serializable):
          • 所有事务操作按顺序执行,性能最差
          • 解决脏读、不可重复读、幻读
    • 持久性(Durability):
      • 事务完成后,数据库管理系统保证它对数据库中数据的修改是永久性的,当系统或介质发生故障时,该修改也永久保持。
      • 一般通过数据库备份与恢复来保证。

4、存储过程及其优点

  • 存储过程(Stored Procedure)定义:一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后,再次调用不需要再次编译,用户通过指定存储过程的名字并给出必要的参数来执行。
  • 存储过程语法:
    • 创建存储过程:create procedure sp_name @[参数名][类型] as begin SQL语句 end
    • 调用存储过程:exec sp_name[参数名]
    • 删除存储过程:drop sp_name[参数名]
  • 优点:
    • 执行效率高。无须多次编译。
    • 减少网路流量。在调用时不需要每次把SQL语句传输到数据库上。
    • 安全机制好。通过对存储过程进行授权,从而保证安全性。

5、数据库索引类型

  • 索引优点:
    • 加快数据的检索速度
    • 对于唯一索引,可以保证数据库表中每一行记录的唯一性
    • 加速表与表之间的连接,有效实现数据的完整性
    • 使用分组和排序子句进行数据检索时,减少查询中分组和排序的时间
  • 索引缺点:
    • 创建索引和维护索引要耗费时间、空间
    • 每一个索引要占用一定的物理空间,从而造成不必要的空间浪费
    • 对表中的数据进行增加、删除和修改时,索引也要动态维护,从而降低了数据的维护速度
  • 普通索引(index):可快速定位特定数据。
  • 唯一索引(unique index):一个或多个字段组成,索引列在表中的值不可重复。
    • 主键索引只能有一个,唯一索引可以有多个
  • 主键索引(primary key):表中创建主键时自动创建的索引。
    • 一个表中只能建立一个。
    • 一些定义:
      • 码(超键):能够唯一识别一条记录的属性或属性集
      • 候选码:能唯一标识一个元组,且任何真子集都不能标识一个元组的属性组
      • 主属性:候选码所有属性的并集
      • 非主属性:不在任何候选码中的属性
      • 主码(主键):从候选码中选出,作为唯一识别关系元组的码
      • 外码(外键):子数据表中出现的父数据表的主键,称为子数据表的外键
  • 组合索引(联合索引):基于多个字段创建的索引
  • 全文索引(fulltext):用于搜索很长一篇文章的时候,效果最好
  • 聚集索引:表数据按照索引的顺序来存储,即索引项的顺序与表中记录的物理顺序一致。
    • 一张表最多只能创建一个聚集索引
    • 叶结点存储了真实的数据行,因此不再有另外单独的数据页
    • 优缺点:查询快,修改慢
    • 应用场景:一般用于排序或范围查找
  • 非聚集索引:表数据存储顺序与索引顺序无关。
    • 叶结点包含索引字段值及指向数据页、数据行的逻辑指针。
    • 优缺点:添加记录,不会引起数据顺序的重组
    • 应用场景:一般用于频繁更新的列

6、数据库范式

  • 第一范式(1NF):
    • 数据库表的每一列都是不可再分的基本数据项,这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
  • 第二范式(2NF):
    • 满足1NF且不存在非主属性对于码的部分函数依赖,即每个非主属性对于码都是完全函数依赖。
    • 部分函数依赖:设X、Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
    • 完全函数依赖:设X、Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。
    • 第二范式可能会导致数据冗余以及更新异常。
  • 第三范式(3NF):
    • 满足2NF且消除非主属性对码的传递函数依赖。
    • 设X、Y、Z是关系R中互不相同的属性集合,存在X→Y(Y!→X),Y→Z,则称Z传递函数依赖于X。
  • BCNF:
    • 满足3NF且主属性之间没有依赖关系。
    • BCNF消除了删除异常、插入异常和更新异常。

7、数据库锁

  • 锁用途:多用户环境下保证数据库完整性和一致性。
  • 常用的锁:
    • 共享锁(Share Lock,S锁):
      • 用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。
      • 特点:
        • 多个事务可以封锁一个共享页;
        • 任何事务都不能修改该页;
        • 通常是该页被读取完毕,S锁立即被释放。
    • 排他锁(Exclusive Lock,X锁):
      • 表示对数据进行写操作。如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了。
      • 特点:
        • 仅允许一个事务封锁该数据页;
        • 其他任何事务必须等到排他锁被释放才能对该页进行访问;
        • 排他锁一直到事务结束才能被释放。
    • 更新锁(Update Lock,U锁):
      • 在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。
      • 特点:
        • 用来预定要对该数据页施加排他锁,它允许其他事务读,但不允许再施加更新锁或排他锁;
        • 当被读取的页将要被更新时,升级为排他锁;
        • 更新锁一直到事务结束时才能被释放。
    • 程序员的角度看,分为乐观锁和悲观锁:
      • 乐观锁(Optimistic Lock):假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
        • 适用于多读的应用场景,可以提高吞吐量。
      • 悲观锁(Pessimistic Lock):假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
        • 比如传统关系型数据库中的行锁、表锁、读锁、写锁等,都是在操作之前先上锁。

8、数据库数据模型

  • 数据库数据模型描述数据在磁盘或磁带上的存储方式(文件的结构)、存取设备(外存的空间分配)和存取方法(主索引和辅助索引)。
  • 网状模型:
    • 使用网络结构表示实体和实体之间联系的模型,相当于一个有向图。一个结点可以有多个双亲结点,且允许一个以上的结点无双亲。
    • 优点:
      • 能够更为直观的描述现实世界,如一个结点可以有多个双亲。
    • 缺点:
      • DDL、DML语言复杂,用户不容易使用。
      • 记录之间联系是通过存取路径实现的,应用程序在访问数据时必须选择适当的存取路径。
  • 层次模型:
    • 使用树形结构表示实体和实体之间联系的模型,相当于一棵有向树。树中每个结点代表一种记录类型,在这些结点中,有且仅有一个结点无双亲(根结点),其他结点有且仅有一个双亲结点。
    • 层次模型可以通过顺序法和链接法实现。
    • 优点:
      • 一对多层次关系的描述非常直观。
    • 缺点:
      • 对插入和删除操作的限制比较多。
      • 查询子女必须通过双亲结点。
    • IBM公司的IMS数据库
  • 关系模型:
    • 以二维表结构来表示实体与实体之间的联系。通过关系、元组、属性、键、关系模式等进行定义。
    • 每个属性必须是不可分的数据项。
    • 优点:
      • 可直接表示多对多的联系。
      • 灵活性、建库的简单性。
      • 结构简单。
    • 缺点:
      • 复杂查询功能差。
    • Access、Oracle、DB2、SQL Server、MySQL
  • 面向对象模型:
    • 面向对象数据模型把实体表示为类,一个类描述了对象属性和实体行为。面向对象数据模型强调对象(由数据和代码组成)而不是单独的数据。

9、关系型数据库三类完整性约束

  • 实体完整性规则:每个表都有唯一标识符,每一个表中的主键字段不能为空或者重复的值。
  • 参照完整性规则:关系中不允许引用不存在的实体。设定相应的更新删除插入规则来更新参照表。
  • 用户自定义完整性规则:针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。
    • 非空约束:not null,添加列数据不能为NULL
    • 唯一约束:unique,添加列数据不能重复,一个表可以根据需要对不同的列创建若干unique约束,unique允许为空
    • 检查约束:check,通过检查约束,使其满足特定的要求
    • 主键约束:primary key,定义一个主键来唯一确定表中每一行数据的标识符
    • 外健约束:foreign key,确保同一个表或者不同表之间的引用完整性

10、数据库安全性

  • 定义:保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。
  • 常见安全措施:
    • 用户标识和鉴别:系统内部记录合法用户的标识,要求用户进入系统时,由系统鉴定后才提供其使用权。
    • 用户存取权限控制:不同的用户对于不同的数据对象有不同的操作权限。定义存取权限称为授权。这些授权定义经过编译后存放在数据字典中。
      • 存取权限组成要素:
        • 数据对象
        • 操作类型
    • 定义视图:为不同的用户定义不同的视图,可以限制用户的访问范围。
    • 数据加密:根据一定的算法将明文转换为密文。
    • 安全审计(Audit):把用户对数据库的所有操作自动记录下来放入审计日志中。数据库管理员可以利用审计日志记录,重现导致数据库现有状况的一系列事件找出非法存取数据库的操作。
    • 事务管理和故障恢复:应对系统内发生的自然因素故障,保证数据和事务的一致性和完整性。
      • 故障恢复主要措施:
        • 日志记录
        • 数据复制

11、触发器

  • 定义:数据库提供给程序员用来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,其执行不是由程序调用,也不是手工启动,而是由事件来触发。
  • 触发器可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新。
  • 可通过数据库中的相关表实现级联更改。
  • 一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。

12、数据库转储与备份

  • MySQL中备份命令:mysqldump -uroot 要备份的数据库表名 > 备份名 -p(路径)
  • 一些定义:
    • 转储 / 备份:数据库管理员定期将整个数据库复制到其他磁盘上保存起来的过程,是数据库恢复中采用的基本技术。
    • 热备份:在转储过程期间允许对数据库进行存取或修改,即转储和用户事务可并发执行。
    • 冷备份:使数据库正常关闭,将执行一致的脱机备份。
  • 转储机制:
    • 完全转储:对整个数据库中的数据全部重新备份,效率低,时间长。
    • 差量转储:基于上次完全转储之后的变化进行转储,是对上次转储之后对所有文件中新增、修改或删除的记录的转储,保证数据的完整性,效率高,时间短。
    • 增量转储:对数据库中凡是有记录变化的文件的整个文件进行复制,效率介于前两种转储方式之间。

13、SQL语言的作用

  • 数据定义语言DDL(Data Definition Language):
    • 建立、修改和删除数据库中的对象(包括表、视图、索引等),create,alter,drop等
  • 数据查询语言DQL(Data Query Language):
    • 检索数据库,select
  • 数据操纵语言DML(Data Manipulation Language):
    • 改变数据库中数据的语句,insert、update、delete
  • 数据控制语言DCL(Data Control Language):
    • 设置或更改数据库用户或角色权限的语句,grant,deny,revoke等

14、E-R图的作用

  • E-R图(Entity Relationship Diagram,实体-联系图):将现实世界的信息结构统一用实体、属性以及实体之间的联系来描述,是描述现实世界关系概念模型的有效方法。
    • 矩形:表示实体,矩形框内写明实体名
    • 椭圆:表示实体的属性,并用无向边将其与相应的实体连接起来
    • 菱形:表示实体型之间的联系,在菱形框内写明联系名,并用无向边分别与有关实体连接起来,同时在无向边上标记联系的类型(1:1、1:n、m:n)
  • 一些定义:
    • 数据库概念模型(是什么):经过业务需求分析后,提炼出来的用以描述用户业务需求的一些概念
      • 常用模型:实体-联系图
    • 数据库逻辑模型(做什么)(关系模型):将概念模型具体化,是对概念模型进一步的分解和细化。如系统有哪些表,包括哪些功能。
    • 数据库物理模型(怎么做):对真实数据库的描述,在真实的物理介质上实现出来。如关系数据库中的表、视图中的具体字段、数据类型、长度、主键、外键、索引、约束、是否可为空、默认值等。

参考文献:

[1]洪欣. 数据库原理、应用与开发. [M]北京:电子工业出版社,2013.01;
[2]猿媛之家. JAVA程序员面试笔试真题与解析. [M]北京:机械工业出版社,2017.01;

你可能感兴趣的:(数据库)