八股(5)——数据库

news2024/9/21 21:16:29

八股(5)——数据库

    • 4.1 数据库基础
      • 什么是数据库, 数据库管理系统, 数据库系统, 数据库管理员?
      • 什么是元组, 码, 候选码, 主码, 外码, 主属性, 非主属性?
      • 主键和外键有什么区别?
      • 为什么不推荐使用外键与级联?
      • 什么是 ER 图?
      • 数据库范式了解吗?
      • 什么是存储过程?
      • drop、truncate 与 delete 区别?
        • 用法不同
        • 属于不同的数据库语言
        • 执行速度不同
      • 数据库设计通常分为哪几步?

主要来自javaguide,加上自己的理解,放这里是方便自己时不时打开看看,后续每一次看的时候应该都会逐渐换成自己最新的理解。

4.1 数据库基础

数据库知识基础,这部分内容一定要理解记忆。虽然这部分内容只是理论知识,但是非常重要,这是后面学习 MySQL 数据库的基础。PS: 这部分内容由于涉及太多概念性内容,所以参考了维基百科和百度百科相应的介绍。

什么是数据库, 数据库管理系统, 数据库系统, 数据库管理员?

  • 数据库 (DataBase 简称 DB): 就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。
  • 数据库管理系统(Database Management System 简称 DBMS) : 是一种操纵和管理数据库的大型软件,通常用于建立、使用和维护数据库。
  • 数据库系统 (Data Base System,简称 DBS): 通常由**软件、数据库和数据管理员(DBA)**组成。
  • 数据库管理员(Database Administrator, 简称 DBA) : 负责全面管理和控制数据库系统。

数据库系统基本构成如下图所示:

数据库系统基本构成

什么是元组, 码, 候选码, 主码, 外码, 主属性, 非主属性?

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

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

主键和外键有什么区别?

  • 主键(主码) :主键用于唯一标识一个元组,不能有重复,不允许为空。一个表只能有一个主键。
  • 外键(外码) :外键用来和其他表建立联系用,外键是另一表的主键,外键是可以有重复的,可以是空值。一个表可以有多个外键。

为什么不推荐使用外键与级联?

对于外键和级联,阿里巴巴开发手册这样说到:

【强制】不得使用外键与级联,一切外键概念必须在应用层解决。

说明: 以学生和成绩的关系为例,学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群; 级联更新是强阻塞,存在数据库更新风暴的风 险; 外键影响数据库的插入速度

为什么不要用外键呢?大部分人可能会这样回答:

  1. 增加了复杂性: a. 每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦, 测试数据极为不方便; b. 外键的主从关系是定的,假如那天需求有变化,数据库中的这个字段根本不需要和其他表有关联的话就会增加很多麻烦。
  2. 增加了额外工作: 数据库需要增加维护外键的工作,比如当我们做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,保证数据的的一致性和正确性,这样会不得不消耗资源;(个人觉得这个不是不用外键的原因,因为即使你不使用外键,你在应用层面也还是要保证的。所以,我觉得这个影响可以忽略不计。)
  3. 对分库分表不友好 :因为分库分表下外键是无法生效的。

我个人觉得上面这种回答不是特别的全面,只是说了外键存在的一个常见的问题。实际上,我们知道外键也是有很多好处的,比如:

  1. 保证了数据库数据的一致性和完整性;
  2. 级联操作方便,减轻了程序代码量;

所以说,不要一股脑的就抛弃了外键这个概念,既然它存在就有它存在的道理,如果系统不涉及分库分表,并发量不是很高的情况还是可以考虑使用外键的。

什么是 ER 图?

我们做一个项目的时候一定要试着画 ER 图来捋清数据库设计,这个也是面试官问你项目的时候经常会被问道的。

E-R 图 也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。 它是描述现实世界关系概念模型的有效方法。 是表示概念关系模型的一种方式。

下图是一个学生选课的 ER 图,每个学生可以选若干门课程,同一门课程也可以被若干人选择,所以它们之间的关系是多对多(M: N)。另外,还有其他两种关系是:1 对 1(1:1)、1 对多(1: N)。

ER图示例

我们试着将上面的 ER 图转换成数据库实际的关系模型(实际设计中,我们通常会将任课教师也作为一个实体来处理):

关系模型

数据库范式了解吗?

以下来自于数据库之六大范式详解。
在这里插入图片描述

1NF(第一范式)

定义: 属于第一范式关系的所有属性都不可再分,即数据项不可分。

理解: 第一范式强调数据表的原子性,是其他范式的基础。如下图所示数据库就不符合第一范式:
在这里插入图片描述
上表就符合第一范式关系。

但日常生活中仅用第一范式来规范表格是远远不够的,依然会存在数据冗余过大、删除异常、插入异常、修改异常的问题,此时就需要引入规范化概念,将其转化为更标准化的表格,减少数据依赖。

规范化: 一个低一级的关系模式通过模式分解可以转化为若干个高一级范式的关系模式的集合,这个过程叫做规范化。

2NF(第二范式)
如下图所示,展示了第一范式到第二范式的过渡。第二范式在第一范式的基础上增加了一个列,这个列称为主键,非主属性都依赖于主键。

第二范式

分成了商品表和供应商表,各自有主键。

一些重要的概念:

  • 函数依赖(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 的要求。

在这里插入图片描述

总结

  • 1NF:属性不可再分。
  • 2NF:1NF 的基础之上,消除了非主属性对于码的部分函数依赖。
  • 3NF:2NF 的基础之上,消除了非主属性对于码的传递函数依赖 。

什么是存储过程?

我们可以把存储过程看成是一些 SQL 语句的集合,中间加了点逻辑控制语句。存储过程在业务比较复杂的时候是非常实用的,比如很多时候我们完成一个操作可能需要写一大串 SQL 语句,这时候我们就可以写有一个存储过程,这样也方便了我们下一次的调用。存储过程一旦调试完成通过后就能稳定运行,另外,使用存储过程比单纯 SQL 语句执行要快,因为存储过程是预编译过的。

存储过程在互联网公司应用不多,因为存储过程难以调试和扩展,而且没有移植性,还会消耗数据库资源。

阿里巴巴 Java 开发手册里要求禁止使用存储过程。

阿里巴巴Java开发手册: 禁止存储过程

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:你应该更多地关注在使用场景上,而不是执行效率。

数据库设计通常分为哪几步?

  1. 需求分析 : 分析用户的需求,包括数据、功能和性能需求。
  2. 概念结构设计 : 主要采用 E-R 模型进行设计,包括画 E-R 图。
  3. 逻辑结构设计 : 通过将 E-R 图转换成表,实现从 E-R 模型到关系模型的转换。
  4. 物理结构设计 : 主要是为所设计的数据库选择合适的存储结构和存取路径。
  5. 数据库实施 : 包括编程、测试和试运行
  6. 数据库的运行和维护 : 系统的运行与数据库的日常维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2068758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TD学习笔记————中级教程总结(中)

目录 四、生成艺术 问题: CHOP TO放置后直接报错 附着不上线 五、Python Lists 与 Python Dictionaries 问题: 使用for的格式要求 显示numRows错误 List中表格定义报错 六、Replicate 与 Instance 问题: 传递处理好的噪音后不变化 Renderpass区分线和字时不起作用…

安科瑞智能物联网关:重塑能源管理新纪元,远程智控尽在“掌”握

在数字化转型浪潮中,能源管理与工业自动化领域正经历着前所未有的变革。安科瑞智能物联网关-智能通信管理机不仅重新定义了智能监控与保护装置的通信管理模式,更为能源数据采集与远程控制提供了前所未有的高效解决方案。 安科瑞智能物联网关&#xff0c…

qt开发环境搭建Qt Creator并创建Demo项目

一 Qt Creator工具下载:工具下载链接: Index of /archive/online_installers/4.8 (qt.io) 下载后点击安装,没有账号得先注册一个账号,如下图,然后点击下一步 随便填点,我填"abc",然…

Unity读取Android本地图片

unity读取Android本地图片 一、安卓读取路径 安卓路径:“file:///storage/emulated/0/”自己图片的路径 例:“file:///storage/emulated/0/small.jpg” 二、unity搭建 使用UI简单搭个界面 三、新建一个脚本 代码内容如下 using System.Collectio…

Android自定义简单TextView

自定义属性 <declare-styleable name"TextView"><!--name 属性名称format 格式&#xff1a;string 文字 color颜色dimension 宽高 字体大小 integer数字reference 资源引用(drawable)--><attr name"YiRanText" format"string"/&…

Sora:视频生成模型

​2024年2月16日&#xff0c;OpenAI 在其官网上面正式宣布推出文本生成视频的大模型 Sora: openai.com/sora Sora的能力 Sora是生成视频为主要能力的模型&#xff0c;能够&#xff1a; 1. 文/图生成视频 openai sora文生视频案例&#xff1a; Prompt: Historical footage of…

自动化立体仓库设施及设备:汇总总结

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载。 这份文件是关于自动化立体仓库的详细介绍&#xff0c;包括其分类、系统组成、基本设施…

SylixOS 网卡混杂模式和组播模式

基本概念 混杂模式&#xff1a; Promiscuous mode&#xff0c;是电脑网络中的术语。是指一台机器的网卡能够接收所有经过它的数据流&#xff0c;而不论其目的地址是否是它。 一般计算机网卡都工作在非混杂模式下&#xff0c;此时网卡只接受来自网络端口的目的地址指向自己的…

《征服数据结构》LRU缓存

摘要&#xff1a; 1&#xff0c;LRU的介绍 2&#xff0c;LRU元素的添加 3&#xff0c;LRU元素的读取 4&#xff0c;LRU完整代码实现 1&#xff0c;LRU的介绍 LRU(Least Recently Used)最近最少使用&#xff0c;它是一种缓存淘汰策略。也就是说在缓存容量满的时候&#xff0c;我…

vue2 part2

数据代理 通过defineProperty里面传入obj2和x&#xff0c;然后get和set下读取接收下然后再接收set中给对象x用value接收下&#xff0c;这样就能两个数据读取和接收了 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>何…

printk 操作等级:修改系统日志等级

这是系统日志的等级&#xff0c;在kern_levels.h文件里面 这是printk 函数前面部分先消息等级&#xff0c;中间部分就是&#xff0c;应用层调的printf的格式化字&#xff0c;后面部分就是可变参数 所以信息的等级大于终端的等级才会被打印&#xff0c;命令&#xff0c;cat /pro…

远程连接vscode无法转到定义

遇到用vscode打开远程服务器运行代码的过程中&#xff0c;无法利用插件跳转到定义&#xff08;ctrl鼠标左键///或者F12&#xff09; 问题可能出在两个地方&#xff0c;一个是插件&#xff0c;找到python插件 点击扩展设置&#xff0c;找到language server设置 这里选中pylance…

springboot调用sap接口传输数据,RFC协议接口调用,包含linux,windows部署

背景&#xff1a;我这边需要将一串数组写入到sap系统中&#xff0c;原本希望sap能提供rest形式接口&#xff0c;可惜sap开发那边说sap对外都是rfc接口&#xff0c;现在记录一下sap接口对接&#xff0c;给其他小伙伴提供点经验。 1、首先必须有对应的原料&#xff0c;驱动jar包…

Web应用服务器Tomcat

一、tomcat Tomcat是Java语言开发的&#xff0c;Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;是Apache软件基金会的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。Tomcat属于轻量级应用服务器&#xff0c;在中小型系统和并发…

【微信小程序】自定义组件 - 数据监听器

1. 什么是数据监听器 2. 数据监听器的基本用法 组件的 UI 结构如下&#xff1a; 组件的 .js 文件代码如下&#xff1a; 3. 监听对象属性的变化 数据监听器 - 案例 案例效果 2. 渲染 UI 结构 3. 定义 button 的事件处理函数 4. 监听对象中指定属性的变化 5. 监听对象中所…

Vite + Vue 3 项目中实现路由自动化完整步骤。

下面是从创建项目到实现路由自动化的完整步骤 在 Vite Vue 3 项目中实现路由自动化可以通过使用文件系统路由生成器来简化路由管理过程。以下是实现路由自动化的完整步骤&#xff1a; 1.创建 Vite Vue 3 项目 如果你还没有一个 Vite Vue 3 项目&#xff0c;可以使用以下命令…

Oracle开始严查Java许可!

0x01、 前段时间在论坛里就看到一个新闻&#xff0c;说“Oracle又再次对Java下手&#xff0c;开始严查Java许可&#xff0c;有企业连夜删除JDK”&#xff0c;当时就曾在网上引起了一阵关注和讨论。 这不最近在科技圈又看到有媒体报道&#xff0c;Oracle再次严查&#xff0c;对…

【鸿蒙学习】HarmonyOS应用开发者高级认证 - 应用开发安全(含闯关习题)

学完时间&#xff1a;2024年8月23日 学完排名&#xff1a;第1748名 一、安全设计理念 以硬件TCB作为安全信任基础,软硬结合的安全设计 HarmonyOS系统安全设计基础: 基于最小的可信计算基础TCB;硬件主密钥,加解密引擎关键安全组件基于TEE可信运行环境;TEE&#xff08;Truste…

自编码器(Autoencoder, AE):深入理解与应用

自编码器&#xff08;Autoencoder, AE&#xff09;&#xff1a;深入理解与应用 引言 自编码器&#xff08;Autoencoder, AE&#xff09;是一种通过无监督学习方式来学习数据有效表示的神经网络模型。其核心思想是通过编码器将输入数据压缩成低维潜在表示&#xff0c;然后通过…

Element-UI自学实践(二)

因上篇 Element-UI自学实践&#xff08;一&#xff09; 文字过多&#xff0c;不便于观看&#xff0c;故另起一篇。 5. 反馈组件 反馈组件用于与用户进行交互&#xff0c;提供即时反馈&#xff0c;包括警告&#xff08;Alert&#xff09;、消息提示&#xff08;Message&#x…