守听 发表于 2024-9-2 12:31:27

八股(5)——数据库

重要来自javaguide,加上自己的明确,放这里是方便自己时不时打开看看,后续每一次看的时间应该都会逐渐换成自己最新的明确。
4.1 数据库基础

数据库知识基础,这部分内容肯定要明确记忆。虽然这部分内容只是理论知识,但是非常重要,这是后面学习 MySQL 数据库的基础。PS: 这部分内容由于涉及太多概念性内容,以是参考了维基百科和百度百科相应的先容。
什么是数据库, 数据库管理体系, 数据库体系, 数据库管理员?



[*]数据库 (DataBase 简称 DB): 就是信息的集合或者说数据库是由数据库管理体系管理的数据的集合。
[*]数据库管理体系(Database Management System 简称 DBMS) : 是一种操纵和管理数据库的大型软件,通常用于建立、使用和维护数据库。
[*]数据库体系 (Data Base System,简称 DBS): 通常由**软件、数据库和数据管理员(DBA)**组成。
[*]数据库管理员(Database Administrator, 简称 DBA) : 负责全面管理和控制数据库体系。
数据库体系基本构成如下图所示:
https://img-blog.csdnimg.cn/img_convert/e21120184e63406526a4e873cacd23f2.png
什么是元组, 码, 候选码, 主码, 外码, 主属性, 非主属性?

以学校举例,元组就是学生,候选码就是{学号}、{身份证号},而{姓名、性别、学院}都有可能重复,以是不是候选码。


[*]元组 : 元组(tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条纪录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。
[*]码 :码就是能唯一标识实体的属性,对应表中的列。
[*]候选码 : 若关系中的某一属性或属性组的值能唯一的标识一个元组,则称该属性组为候选码。(候选码有最小性原则,不要多此一举,身份证号已经能标识学生,就不必要学号了)
[*]主码 (主键): 从候选码中人为选定一个作为主码。 主码肯定是候选码,候选码不肯定是主码。
[*]外码 (外键): 如果一个关系中的一个属性是另外一个关系中的主码则这个属性为外码。好比学生表有一个属性是学院编号,而学院表的主码也是学院编号,那么学院编号就是学生表的外键。
[*]主属性 : 候选码中出现过的属性称为主属性。好比学号、身份证号都是主属性。
[*]非主属性: 不包含在任何一个候选码中的属性称为非主属性。好比姓名、性别、学院都可以称为非主属性。
主键和外键有什么区别?



[*]主键(主码) :主键用于唯一标识一个元组,不能有重复,不允许为空。一个表只能有一个主键。
[*]外键(外码) :外键用来和其他表建立接洽用,外键是另一表的主键,外键是可以有重复的,可以是空值。一个表可以有多个外键。
为什么不推荐使用外键与级联?

对于外键和级联,阿里巴巴开辟手册这样说到:
   【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
说明: 以学生和结果的关系为例,学生表中的 student_id 是主键,那么结果表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发结果表中的 student_id 更新,即为级联更新。外键与级联更新实用于单机低并发,不得当分布式、高并发集群; 级联更新是强阻塞,存在数据库更新风暴的风 险; 外键影响数据库的插入速度
为什么不要用外键呢?大部分人可能会这样回复:
   
[*]增长了复杂性: a. 每次做DELETE 或者UPDATE都必须考虑外键束缚,会导致开辟的时间很痛楚, 测试数据极为不方便; b. 外键的主从关系是定的,如果那天需求有变化,数据库中的这个字段根本不必要和其他表有关联的话就会增长很多贫困。
[*]增长了额外工作: 数据库必要增长维护外键的工作,好比当我们做一些涉及外键字段的增,删,更新操作之后,必要触发相关操作去查抄,包管数据的的一致性和正确性,这样会不得不消耗资源;(个人觉得这个不是不消外键的缘故原由,由于即使你不使用外键,你在应用层面也照旧要包管的。以是,我觉得这个影响可以忽略不计。)
[*]对分库分表不友好 :由于分库分表下外键是无法生效的。
[*]…
我个人觉得上面这种回复不是特殊的全面,只是说了外键存在的一个常见的问题。实际上,我们知道外键也是有很多利益的,好比:

[*]包管了数据库数据的一致性和完整性;
[*]级联操作方便,减轻了程序代码量;
[*]…
以是说,不要一股脑的就扬弃了外键这个概念,既然它存在就有它存在的道理,如果体系不涉及分库分表,并发量不是很高的环境照旧可以考虑使用外键的。
什么是 ER 图?

   我们做一个项目的时间肯定要试着画 ER 图来捋清数据库设计,这个也是面试官问你项目的时间常常会被问道的。
E-R 图 也称实体-接洽图(Entity Relationship Diagram),提供了表示实体类型、属性和接洽的方法,用来描述实际世界的概念模型。 它是描述实际世界关系概念模型的有效方法。 是表示概念关系模型的一种方式。
下图是一个学生选课的 ER 图,每个学生可以选若干门课程,同一门课程也可以被若干人选择,以是它们之间的关系是多对多(M: N)。另外,另有其他两种关系是:1 对 1(1:1)、1 对多(1: N)。
https://img-blog.csdnimg.cn/img_convert/4717673e36966e0e4b33fccfd753f6ea.png
我们试着将上面的 ER 图转换成数据库实际的关系模型(实际设计中,我们通常会将任课教师也作为一个实体来处理):
https://img-blog.csdnimg.cn/img_convert/5897753dfb301dfa3a814ab06e718a5e.png
数据库范式相识吗?

以下来自于数据库之六大范式详解。
https://i-blog.csdnimg.cn/direct/cc2a4a70e26148c799ab7628e78364f7.png
1NF(第一范式)
界说: 属于第一范式关系的所有属性都不可再分,即数据项不可分。
明确: 第一范式夸大数据表的原子性,是其他范式的基础。如下图所示数据库就不符合第一范式:
https://i-blog.csdnimg.cn/direct/cce2021388214a979d4b9f935d01135f.png
上表就符合第一范式关系。
但一样平常生活中仅用第一范式来规范表格是远远不够的,依然会存在数据冗余过大、删除非常、插入非常、修改非常的问题,此时就必要引入规范化概念,将其转化为更标准化的表格,镌汰数据依赖。
规范化: 一个低一级的关系模式通过模式分解可以转化为若干个高一级范式的关系模式的集合,这个过程叫做规范化。
2NF(第二范式)
如下图所示,展示了第一范式到第二范式的过渡。第二范式在第一范式的基础上增长了一个列,这个列称为主键,非主属性都依赖于主键。
https://img-blog.csdnimg.cn/img_convert/bd1d31be3779342427fc9e462bf7f05c.png
分成了商品表和供应商表,各自有主键。
一些重要的概念:


[*]函数依赖(functional dependency) :确定属性(组)X ,肯定能确定属性 Y ,则 Y 函数依赖于 X,写作 X → Y。
[*]部分函数依赖(partial functional dependency) :如果 X→Y,而且存在 X 的一个真子集 X0,使得 X0→Y,则称 Y 对 X 部分函数依赖。好比学生基本信息表 R 中(学号,身份证号,姓名),(学号,身份证号)->(姓名),(学号)->(姓名),(身份证号)->(姓名);以是姓名部分函数依赖于(学号,身份证号);
[*]完全函数依赖(Full functional dependency) :在 R 关系中,(学号,班级)->(姓名),但是(学号)->(姓名)不建立,(班级)->(姓名)不建立,以是姓名完全函数依赖与(学号,班级);
[*]传递函数依赖 : 在关系模式 R(U)中,设 X,Y,Z 是 U 的差别的属性子集,如果 X →Y、Y → Z,且有 X 不包含 Y,Y 不确定 X,(X∪Y)∩Z=空集合,则称 Z 传递函数依赖(transitive functional dependency) 于 X。
传递函数依赖会导致数据冗余和非常。传递函数依赖的 Y 和 Z 子集往往同属于某一个事物,因此可将其归并放到一个表中。好比在关系 R(学号 , 姓名, 系名,系主任)中,学号 → 系名,系名 → 系主任,以是存在非主属性系主任对于学号的传递函数依赖。。
3NF(第三范式)
3NF 在 2NF 的基础之上,消除了非主属性对于码的传递函数依赖 。符合 3NF 要求的数据库设计,基本上解决了数据冗余过大,插入非常,修改非常,删除非常的问题。好比在关系 R(学号 , 姓名, 系名,系主任)中,学号 → 系名,系名 → 系主任,以是存在非主属性系主任对于学号的传递函数依赖,以是该表的设计,不符合 3NF 的要求。
https://i-blog.csdnimg.cn/direct/2221c96855de4197855d736896132605.png
总结


[*]1NF:属性不可再分。
[*]2NF:1NF 的基础之上,消除了非主属性对于码的部分函数依赖。
[*]3NF:2NF 的基础之上,消除了非主属性对于码的传递函数依赖 。
什么是存储过程?

我们可以把存储过程当作是一些 SQL 语句的集合,中心加了点逻辑控制语句。存储过程在业务比较复杂的时间是非常实用的,好比很多时间我们完成一个操作可能必要写一大串 SQL 语句,这时间我们就可以写有一个存储过程,这样也方便了我们下一次的调用。存储过程一旦调试完成通过后就能稳定运行,另外,使用存储过程比单纯 SQL 语句执行要快,由于存储过程是预编译过的。
存储过程在互联网公司应用不多,由于存储过程难以调试和扩展,而且没有移植性,还会消耗数据库资源。
阿里巴巴 Java 开辟手册里要求禁止使用存储过程。
https://img-blog.csdnimg.cn/img_convert/0fa082bc4d4f919065767476a41b2156.png
drop、truncate 与 delete 区别?

用法差别



[*]drop(丢弃数据): drop table 表名 ,直接将表都删除掉,在删除表的时间使用。
[*]truncate (清空数据) : truncate table 表名 ,只删除表中的数据,再插入数据的时间自增长 id 又从 1 开始,在清空表中数据的时间使用。
[*]delete(删除数据) : delete from 表名 where 列名=值,删除某一行的数据,如果不加 where 子句和truncate table 表名作用雷同。
truncate 和不带 where 子句的 delete、以及 drop 都会删除表内的数据,但是 truncate 和 delete 只删除数据不删除表的结构(界说),执行 drop 语句,此表的结构也会删除,也就是执行 drop 之后对应的表不复存在。
属于差别的数据库语言

truncate 和 drop 属于 DDL(数据界说语言)语句,操作立刻生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。
而 delete 语句是 DML (数据库操作语言)语句,这个操作会放到 rollback segement 中,事件提交之后才生效。
DML 语句和 DDL 语句区别:


[*]DML 是数据库操作语言(Data Manipulation Language)的缩写,是指对数据库中表纪录的操作,重要包罗表纪录的插入(insert)、更新(update)、删除(delete)和查询(select),是开辟职员一样平常使用最频繁的操作。
[*]DDL (Data Definition Language)是数据界说语言的缩写,简朴来说,就是对数据库内部的对象进行创建、删除、修改的操作语言。它和 DML 语言的最大区别是 DML 只是对表内部数据的操作,而不涉及到表的界说、结构的修改,更不会涉及到其他对象。DDL 语句更多的被数据库管理员(DBA)所使用,一般的开辟职员很少使用。
   由于select不会对表进行粉碎,以是有的地方也会把select单独区分开叫做数据库查询语言DQL(Data Query Language)
执行速度差别

一般来说:drop > truncate > delete(这个我没有设计测试过)。
   delete下令执行的时间会产生数据库的binlog日志,而日志纪录是必要消耗时间的,但是也有个利益方便数据回滚恢复。
truncate下令执行的时间不会产生数据库日志,因此比delete要快。除此之外,还会把表的自增值重置和索引恢复到初始巨细等。
drop下令会把表占用的空间全部开释掉。
Tips:你应该更多地关注在使用场景上,而不是执行效率。
数据库设计通常分为哪几步?


[*]需求分析 : 分析用户的需求,包罗数据、功能和性能需求。
[*]概念结构设计 : 重要接纳 E-R 模型进行设计,包罗画 E-R 图。
[*]逻辑结构设计 : 通过将 E-R 图转换成表,实现从 E-R 模型到关系模型的转换。
[*]物理结构设计 : 重要是为所设计的数据库选择合适的存储结构和存取路径。
[*]数据库实施 : 包罗编程、测试和试运行
[*]数据库的运行和维护 : 体系的运行与数据库的一样平常维护。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 八股(5)——数据库