数据库常见理论常见面试题(总结)

一、前言

    这里呢,博主会介绍一些平时关于数据库的理论的问题,比如数据库的三级模式两级映射、触发器、范式、存储过程、视图等等概念知识,但是像索引、事务、锁等内容,之前的文章就讲解过了,这里就不作过多的介绍了,有需要的小伙伴去我的主页找哦。

二、三级模式两级映像

先看一张图

如图所示我们可以看到从最终用户到物理数据库分为三级模式:所谓的三级模式分别指的是:外模式、概念模式以及内模式。

而两级映像指的是:外模式-概念模式映像、概念模式-内模式映像。

1、三级模式:

①外模式:面向应用程序,描述用户的数据视图(View)。用户不同的需求得到不同的视图。

比如:有一张user表字段如图所示(一张基础表)

假设我现在只想得到username、password、nickname、sex这些字段,那我就可以通过在基础表上执行一些SQL语句,得到一个只包含这些字段的一个视图(View)。这样一来,这是面向用户的,不同需求的用户,得到的视图也是不一样的。

外模式的主要特点用来描述组成用户视图各个记录的组成、相互联系、数据的完整性和安全性、数据项的特征等。

②:概念模式(模式、逻辑模式):面向数据库设计人员,描述数据的整体逻辑结构。

比如,在如上图中,关于user表的设计,如表的一些性质,字段(id、username)等信息的设置(设计表的过程),其实就是在设置逻辑结构。

概念模式是数据库中全体数据的逻辑结构和特征的描叙是所有用户数据的公共数据视图

③:内模式(物理模式、储存模式):面向物理上的数据库(数据在磁盘中如何存储),描述数据库采用什么样的数据结构和怎样获得数据的。

2、两级映像:

定义了模式之间如何去转换。

①:外模式-概念模式映像:就是外模式向概念模式的转化,体现了逻辑独立性。所谓逻辑独立性是指我们修改了概念模式的基础表,但外模式却不受影响。

如图所示,我们修改基本表1和基本表2中的内容,当不会影响到视图(外模式)的查询,‘编号’、‘商品分类’、‘销量’,.....这些字段依然是使用于我们数据的查询到的。

②:概念模式-内模式映像:就是概念模式向内模式的转化过程,体现了物理的独立性。所谓物理的独立性指修改了内模式,不影响外层的概念模式和外模式。

例如:在Excel文件中将xls文件另存为xlsx文件,虽然更换了文件格式,但是打开文件后显示的表格的内容是不会改变的。

三、三大范式

为什么需要数据规范化?

如果没有数据规范化,我们的数据库表在设计时,可能会出现信息重复、更新异常、删除异常(删除了一个表,另一个表有的信息没有删除)、插入异常(无法正常显示信息)等问题,如果要避免这些问题就需要提到我们的三大范式。

1、范式概念

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

2、第一范式(1NF)

数据库表中的所有字段都是不可分割的原子。

如何理解呢?

其实,很简单,比如我们的user表中有个address字段,那我们可以试想一下,我们在填写地址的时候,就直接在address下写“四川省成都市武侯区新华路121号”吗?其实我们是将address分为province(省份)、city(城市)、detail_address(详细地址)这三个部分,因为有时候系统会经常访问province、city这些字段,而且这样的才分,更加满足字段的原子性。

3、第二范式(2NF)

第二范式的实现是基于第一范式的,指的是数据库表中的每一列都与主键完全相关,而不能只与主键的部分相关。

如何理解呢?

如图所示,假设我们的主键是(货物类型、货物ID),此时“货物名称”是是与主键的名称完全相关的,但“注意事项”只是与主键中的“货物类型”部分相关。所以这个表对的设计是不合我们的第二范式的。要想修改的符合第二范式,就只需要将“注意事项”这列去除,剩余的数据列形成的表就是符合我们第二范式的了。如下图所示:

4、第三范式(3NF)

第三范式的成立是需要满足第一、第二范式的,是指第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

如何理解呢?

如上图所示,我们的student表中,学号是主键,姓名、性别、家庭人口是指的是学生的个人信息是直接依赖于主键的,而班主任性别、班主任年龄是直接依赖的是班主任姓名,所以是不符合第三范式的。做成如下的表,就可满足第三范式:

5、数据库表设计必须遵循三范式吗

其实,我们说了三大范式的一些基本内容,也知道使用三大范式的好处,但是实际的项目开发中并不是必须严格遵守三大范式,因为范式虽然规范,但是性能就不会那么高。

比如:阿里规范开发手册里面就强调关联的表不能超过三张表,而我们遵循三大范式,必然会把一张表拆成很多张。

在真实项目开发中需要常用做法:

①所以考虑到商业化的需求和目标时,对成本以及用户体验来说,数据库的性能就更加重要;

②在规范性能问题的时候,需要适当考虑一下规范性;

③有时需要给某些表增加一些冗余的字段,为了将多表查询改为单表查询。

四、存储过程

1、概念

存储过程(PROCEDURE)指的是事先编译好,存储在数据库中的一段SQL语句集合。我们自需要创建一次,但在以后的该程序中可以调用多次。

2、优点:

①:存储过程可以重复使用,调用这些存储过程,可以减少开发人员的工作量;

②:减少网络流量,存储过程是位于数据库上,我们调用的时候只需要传递存储过程的名称和参数即可,降低了网络传输的流量。

③:安全性提高,参数化的过程,可以防止SQL注入问题。

3、缺点:

①:移植性差:存储过程写在数据库中,维护起来比较困难。

②:开发和维护要求高:存储过程的编写直接依赖于开发人员,如果业务逻辑改动较多,需要频繁直接操作数据库,大量业务降维到数据库,很多异常不能在代码中捕获,出现问题较难排查,需要数据库管理人员的帮助。

五、触发器

1、概念

触发器(TRIGGER)是由事件来触发某个操作。这些事件包括insert语句、update语句、delete语句(DML操作)。当数据库执行这些事件时,就会激活触发器执行相应的操作。当然也可以把触发器可以看作是一种特殊类型的存储过程,它与存储过程的区别在于存储过程中使用时需要调用,而触发器是在预先定义好的事件(DML操作)发生时,才会被MySQL自动调用。

2、优点

触发器可以用来对表实施复杂的完整性约束,保持数据的一致性,当触发器所保护的数据发生改变时,触发器会自动被激活,响应同时执行一定的操作(对其它相关表的操作),从而保证对数据的不完整性约束或不正确的修改。

3、缺点

①:数据维护困难:应用程序的业务逻辑处理与数据操作耦合度高,不利于扩展与维护。

②:可能产生死锁:若触发器中使用了锁机制,可能造成死锁,影响数据库的稳定性。

六、视图

1、概念

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

2、使用场景

①:代替复杂查询,减少复杂性;

②:提供一致性接口,实现业务的规则;

③:控制对于表的访问,提高安全性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Google大模型Bard更名Gemini,现在实力如何?(VS gpt系列)

名人说:一花独放不是春,百花齐放花满园。——《增广贤文》 作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、简要介绍1、Gemini是什么?2、主要特点3、Gemini的版本4、应用潜力5、…

docker容器配置mysql5.7主从复制

介绍 本文将通过docker创建3个mysql数据库容器,实现数据库主从复制功能,三个数据库容器分别为主库mysql-master:3307,从库mysql-slave-01:3308,mysql-slave-02:3309。使用的是mysql5.7版本 1. 拉取mongo镜像 docker pull mysql…

springboot230基于Spring Boot在线远程考试系统的设计与实现

在线远程考试系统设计与实现 摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到…

学不动系列-git-hooks和husky+lintstage

git-hooks 为了保证提交的代码符合规范,可以在上传代码时进行校验。常用husky来协助进行代码提交时的eslint校验。husky是基于git-hooks来实现,在使用husky之前,我们先来研究一下git-hooks。 构建git-hooks测试项目 需要使用git-hooks就需…

网络安全概述(一)

目录 资产保护 资产的类型 资产损失类型 资产保护考虑因素 安全强度、安全代价和侵入可能性的关系 信息安全技术发展 单机系统的信息保密阶段 信息保障阶段 信息保障技术框架IATF PDRR模型 网络攻击类型 阻断攻击、截取攻击、篡改攻击、伪造攻击 被动攻击和主动攻…

【反哺开源】我们计划把“这个”商业化功能贡献给Apache DolphinScheduler

今年,白鲸开源计划将Gitops功能反馈贡献给Apache DolphinScheduler社区,这个功能主要解决了开发、生产环境的同步问题。 在没有这个功能之前,我们只能通过导入导出的方式,以 JSON 文件作为媒介将开发环境的内容同步到生产环境&…

WebSocket介绍与应用

介绍 WebSocket 是基于TCP的一种的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 HTTP协议和WebSocket协议对比: HTTP是短连接WebSocket是长连接…

K8S中POD的控制器

一、Pod控制器及其功用 Pod控制器,又称之为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效&am…

GL绘制自定义线条4_使用OpenGL ES实现钢笔效果

在以前的文章里http://t.csdnimg.cn/TgCtl,我简述了如何使用OpenGL ES实现光滑的粗线条的绘制效果,在闲暇时间我把它再进一步进化,实现了端点长度按照压感大小实现伸缩的逻辑,从而实现了如下的笔锋效果: 书写过程中的效…

python统计分析——逻辑回归

参考资料:用python动手学统计学 逻辑回归即logistic回归。概率分布为二项分布、联系函数为logit函数的广义线性模型叫作logistic回归。解释变量可以有多个,连续型和分类型的解释变量也可以同时存在。 1、logit函数 logit函数的数学式如下,对…

Vue之监测数据的原理(对象)

大家有没有想过,为什么vue可以监测到数据发生改变?其实底层借助了Object.defineProperty,底层有一个Observer的构造函数 让我为大家简单的介绍一下吧! 我用对象为大家演示一下 const vm new Vue({el: "#app",data: {ob…

LNMP架构(搭建论坛+博客)

目录 一、LNMP架构概述 1、LNMP架构的概念 2、LNMP架构的优点 二、编译安装nginx软件 1、准备工作 1.1 关闭防火墙 1.2 安装依赖包 1.3 创建运行nginx用户 1.4 压缩包解压 2、编译与安装 3、添加nginx自启动文件 三、编译安装mysql软件 1、准备工作 1.1 安装mysq…

循环队列的实现

文章目录 循环队列的概念循环队列的实现循环队列的判空和判满链表or数组 循环队列的概念 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓…

网站文章被百度快速收录的工具

百度是中国最主要的搜索引擎之一,对于网站管理员来说,网站文章被百度快速收录是至关重要的,因为这直接影响着文章的曝光和网站的流量。然而,许多网站管理员都会问一个常见的问题:文章百度收录需要几天?在这…

【HTML】HTML基础1(第一个网站!)

目录 软件使用 HTML的基本结构 案例示范 用记事本编写网页 软件使用 注释&#xff1a;<!-- -->中的内容是注释内容&#xff0c;自己写代码的时候可以没有&#xff01; HTML的基本结构 <!DOCTYPE html> <!-- 文档声明&#xff0c;位于文档最前面位置 -->…

STM32 IIC协议基础概念

文章目录 前言一、IIC协议介绍二、IIC硬件框图和程序层次三、IIC协议1.IIC协议通信流程2.IIC的引脚为什么需要加入上拉电阻3.IIC的引脚为什么需要配置为开漏输出 四、STM32 IIC硬件结构总结 前言 本篇文章将带大家学习IIC通信协议的一些基础概念和使用。 一、IIC协议介绍 I2…

国产数据库兼容性认证再下两城,极狐GitLab 国产适配更进一步

近日&#xff0c;极狐GitLab 与两大国产数据库 TDSQL 和人大金仓完成兼容性认证。极狐GitLab 在国产化适配、国产化生态建设上有了进一步的发展。 极狐GitLab 团队分别和 TDSQL 和人大金仓数据库团队做了严格的测试验证&#xff0c;完成了这两大国产数据库和极狐GitLab 企业级一…

面试题JS篇

目录 Js 基本数据类型有哪些Ajax 如何使用如何判断一个数据是 NaN&#xff1f;Js 中 null 与 undefined 区别闭包是什么&#xff1f;有什么特性&#xff1f;对页面会有什么影响JS中模块化的方法Js 中常见的内存泄漏什么是事件冒泡&#xff1f;如何阻止事件冒泡&#xff1f;事件…

服务器git安装python包失败,如何手动下载github项目包并安装到虚拟环境中(简单易懂)

背景&#xff1a; 想要复现一个项目&#xff0c;建立好虚拟环境后&#xff0c;准备安装项目需要的包&#xff0c;故输入命令pip install -r requirements.txt requirements.txt如下图 其他包我都安装成功了&#xff0c;只有最后一个包失败了&#xff0c;是需要服务器git链接…

CUDA C:查看GPU设备信息

相关阅读 CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm1001.2014.3001.5482 了解自己设备的性能是很有必要的&#xff0c;为此CUDA 运行时(runtime)API给用户也提供了一些查询设备信息的函数&#xff0c;下面的函数用于查看GPU设备的一切信息。 …