数据库入门上篇(数据库基础概念知识)

news2024/11/26 1:34:26

在这篇文章里,笔者将简单介绍数据库的起源和发展,数据库的分类,读完这篇文章,大家就对数据库有一个大概了解,也就是知道我们该学什么样的东西

为什么需要数据库 

在如今的信息时代,各行各业每天都会产生大量的数据,这些数据通过加工处理可以转化成对我们有用的信息,那么在处理数据之前,总得将数据保存并管理起来

说到数据的保存和管理,我们可能会瞬间想到文件。没错,在未接触数据库之前,我们保存自己数据的方式大多都是通过文件,文件保存数据的方式操作起来简单,能够对数据进行简单增删查改,对于普通用户来说这些功能就足够了

但是我们从事IT行业的人事不一样,我们所面对的不是个人的数据,而是面向数以万计的用户的数据,文件系统管理个人数据还挺方便的,但是管理多人的数据呢?

我们可以做一个简单的实验,给自己的同学每一个人都建立一个文件,这个文件里存储着同学的姓名,学号,性别,专业,出生日期

那么现在提出两个问题

1.算出所有的同学当前是多少岁

2.把所有年龄大于20岁的同学的专业都改成人工智能

那么此时你是不是需要打开所有同学的文件,找到专业和出生日期,手动计算和修改

这个过程无疑是痛苦的,而这也仅仅是同学的数据,如果是全校的数据,所在城市所有用户的数据呢?

可以发现每个同学的数据是保存在各自的文件中的,在多个文件需要共享的情况下是很不方便的,同时因为数据不共享,可能导致一个数据在多个文件里被多次存储,这是完全没有必要的,会导致大量的空间被浪费。

例如,给同学的数据文件加上一个课程表的信息,你的同学肯定有和你是同班的,那么你俩之间的课程表的信息就是相同的,如果你的文件信息里放了课程表信息,而你的同班同学的文件里也放了课程表信息,那么这个信息就会重复。但是你不得不放,因为文件的信息不共享,如果你只在你的文件里放了课程表信息,你同班同学不放,打开你同班同学的文件就不知道他的课程信息。除此之外,文件系统管理数据还会带来数据的误差,假设课程表的信息要修改了,你只修改了你的课程表的信息,你同学的你没有改,那么比较长的一段时间后,查看两人的课程信息不一致,你又怎么确定是你改了还是输入错误了呢?

文件系统在管理大批量数据时的种种弊端催使着人们研发出一种更加高效,数据之间能够共享,数据的存储更加稳定和安全的产品,那么这个东西就是我们现在所谈的数据库了

数据库的一些概念知识

数据库的优点这里就不介绍了,无非是克服了...,取得了...这类的套话,感兴趣的同学可以自己搜索查看

那么到此我们能认识到数据库就是一个在面对大量的数据时,能更好的存储和管理数据的东西,那么接下来就要简单介绍数据库是如何做到这些的

如果要系统性学习数据库,那么绕不过几个模型,比如概念模型,逻辑模型,物理模型,这些概念一下全罗列出来,笔者个人觉得是没什么效果的,即使你强行记住了,没有通过实例去体会,那么不久就会忘掉,所以笔者这里先简单说明这些概念,后面在实践中用到时再强调和细分。对于物理模型,这个层次是考虑数据在硬件上的存储,因为我们并不是专门的数据库管理和设计人员,站在使用者的角度上,了解概念模型和逻辑模型就足够了,故此篇文章不再提及物理模型

概念模型

在了解概念模型之前,我们要先了解什么是属性信息?什么是实体和实体集以及实体集之间存在什么样的关系?

假设现在要统计校园里共有几种桌子,我们要在计算机中存储校园里使用的不同的桌子,那么就得在计算机中把桌子给表示出来呀,我们不能直接把桌子二字打上去就结束了,因为这是对所有桌子的概念统称,并不能指定某个具体的桌子,(具体的一个桌子就是一个实体,但这并不意味着实体必须在现实世界中有具体的形状,实体也可以是个抽象的物体)

那么回到上述问题,要想在计算机中存储标明每个桌子,我们就得观察这些桌子的特征了,抽象出能表示出这些桌子的属性信息,例如这些桌子的长,宽,高,颜色,有几个支撑腿等,我们把这些信息一填,是不是就能够描绘出这些桌子大概是个什么样子了

像这样根据现实中的实体的特征抽象出的,反过来又能够表达出这个实体的信息,就是属性信息,比如学生的学号,姓名,身高,年龄,年级,有这些信息就能指定某个具体的学生了。

接下来区分一下实体与实体集的概念

以上面学生的例子来说,实体就是一个具体的学生,那么实体集就是学生这个集体,实体集也就是具有相同属性信息的实体的集合,虽然每个学生实体都不一样,但是它们有着相同的属性信息,像姓名,学号等,通过这些属性信息就能找到每一个学生实体

为什么要强调实体集呢?我们在处理数据的时候,往往是针对实体集而言的,因为实体集

能把具有相同属性特征的实体统一组织起来,便于我们对数据的使用和研究

例如学校里有管理人员,有老师,有职工,有学生,那每个学生的数据都在学生这个实体集里,每个老师都在老师实体集里,这样比老师,学生,职工等人员的数据混杂在一起,比每次使用数据都要针对具体实体,更有利于对数据的使用和研究

现实世界,万物互相联系,实体集与实体集之间也存在着联系,实体集之间的联系,具体还是体现在实体与实体间的关系上,例如,一个学生同时只能用一张桌子,一张桌子根据大小不同可以同时被多个学生共用,那么学生和桌子这两个实体集之间的联系就是多对一,可表示成n:1,除多对一之外,实体集与实体集之间的联系还有一对一,一对多,多对多

我们要存储的数据其实就是由这些实体,实体集,以及属性信息组成的,要想存储学生的数据,先根据学生的特征,抽象出能表示这个学生的属性信息,学生都有着相同的属性信息,放在一起,组成了一个学生实体集,除了学生实体集,还有老师实体集,不同的实体集之间可能存在着关联。那么在把上面说的实体,实体集,属性信息,实体集间的联系存到电脑之前,我们得先构造出这些信息呀,不能凭空来呀。

那么构造和研究 实体,实体集,属性信息,实体集间的联系等这些信息就是所谓的概念模型

在概念模型中,我们不需要考虑如何把这些东西存到电脑里,放到数据库里,而是一个设计的过程,是研究怎么抽象出要存储的东西的属性信息,以及不同东西之间存在着什么关系,我们可以直接在纸上画出来, 老师和学生的概念模型如下

(老师可以教多个学生,学生可以被多个老师教,故这两个实体集之间是多对多关系)

 

 

逻辑模型 

在概念模型中,因为概念模型不考虑计算机系统,只专注于对实体的抽象和描述,我们可以直接在纸上画出每个实体集的属性信息,不同实体集之间的联系,我们可以在两个实体集之间连一条线,然后在线上表述这两个实体集是什么关系,很方便

但是真正要在数据库软件中要把实体集的属性特征存储表示出来,还要把能把不同实体集之间的联系给表示出来,我们要考虑在计算机中如何实现,这可不是画条线那么简单了,而是要选取计算机中的一种数据结构来表示。所以说逻辑模型是在概念模型的基础上,考虑如何在计算机中实现这些实体及其之间的联系,需要选择合适的数据结构和算法来表示和操作实体集之间的关系

常见的一些逻辑模型有层次模型,网状模型,关系模型,面向对象模型,而大多数数据库采用的都是关系模型,所以我们重点介绍关系模型,其他模型简单提一提,面向对象模型我们很少接触到并且与关系模型关联不大,这里就不再提及

层次模型

层次模型是怎么表现实体集与实体集之间的联系的呢?大家应该都学过数据结构中的树,一个树的节点只能有一个父亲,但是可以有多个孩子,那么层次模型正是用树这种数据结构来描述实体集与实体集之间的联系

这样做能够很好的处理一对一和一对多的关系,但是在处理多对多的关系时就明显有些吃力

因为树的一个节点只允许有一个父亲,我们可以选择在每个节点上再加一些指针用虚拟记录的方式,使其实现一个节点可以指向多个父节点,从而实现多对多的结构

但是这个过程太过繁杂,很容易出错,除非是专门针对处理一对一和一对多关系的数据库,不然很少有数据库在设计时采用层次模型

网状模型 

网状模型类似于数据结构中的图,但是其在实现时采用的是链表结构,网状模型相比于层次模型,解决了多对多关系难以表示的问题,那么网状模型时如何表示出多对多关系的呢

我们以学生和课程这两个实体集为例,学生可以选择多门课程,一门课程可以被多个学生选择,那么这两个实体集就是多对多关系的

设有学生A,B,C 和课程 1, 2,3

学生A选择了1号和3号课程,学生B选择了2号和3号课程,学生C选择了1号课程

那么网状模型时如何表示出上述多对多关系的呢?

用链表先将学生集和课程集表示出来 

 

接下来,我们再抽象出一个选课集,因为A学生选了1号和3号课程

我们在选课集中用a和b表示,a表示A学生选了1号课程,所以A连接a,并且a连接1

b表示A学生选了3号课程,所以A连接b,并且b连接3

这样就把A学生和课程的关系连接起来了,因为从学生的视角出发,A学生连接着a和b,a和b又分别连接着1和3,表明A学生选择了1号和3号课程

 

接下来B学生选择了2号和3号课程,那么在选课集中用c和d来表示

c表示B学生选了2号课程,所以B连接c,并且c连接2

d表示B学生选了3号课程B,所以B连接d,并且d连接3

这样就把B学生和课程的关系连接起来了,因为从学生的视角出发,B学生连接着c和d,c和d又分别连接着2和3,表明B​​​学生选择了2号和3号课程

最后C学生选择了1号课程,那么在选课集中用e表示

e表示B学生选了1号课程,所以C连接e,并且e连接1

这样就把C学生和课程的关系连接起来了,因为从学生的视角C学生连接着e,e连接着1,表明C学生选择了1号课程

 

最后我们发现,A学生连接了选课表中的a和b,a和b又分别指向了1和3,那么我们就知道了A学生选择了1号和3号课程, 同理B学生选了2号和3号课程,C学生选了1号课程

我们这是从学生的视角出发的,接下来换到课程的视角

课程1指向了a和e,我们知道a和e分别对应着学生A和C,所以我们就知道了课程1被学生A和C选择了

课程2指向了c,我们知道c对应着学生B,所以我们就知道了课程2被学生B选择了

课程3指向了b和d,我们知道b和d分别对应着学生A和B,所以我们就知道了课程3被学生A和B选择了 

现在我们发现了,从学生和课程的视角出发,都能够找到对应的关系,这种实现两个实体集之间多对多关系的方式,本质是在两个实体集之间再加了一个实体集,然后将多对多的关系给转换成两个一对多的关系。上例中选课集这个新增的实体集就是用来映射学生集和课程集之间的关系的,学生集与选课集之间的关系是一对多,课程集与选课集之间的关系也是一对多

早期的计算机资源很有限,直接使用图这种数据结构,效率比较低下,图在表达层次关系上不如链表那么直观,所以通过链表指针连接,然后加一层映射关系来实现的多对多联系的设计也是很巧妙的,能表示出来多对多的关系,但是缺点也是比较明显,那就是让链表的指向关系变得非常的复杂,导致用程序实现的难度相当的高,而且不利于后序对程序进行维护和升级

关系模型 

关系模型是绝大多数数据库软件采用的逻辑模型,不同于层次和网状模型的树和链表

关系模型采用的是二维表结构,每一列都是这个实体集的其中一个属性特征,每一行都是这个实体集中的一个实体,我们称表中的列为属性,表中的行为元组

咱们接着以学生为例,学生这个实体集有姓名,性别,学号,班级,学院,号码等属性特征,所以学生集这个二维表的属性列就有姓名,性别,学号,班级,学院,号码等内容,然后每一行(即每个元组)都表示一个具体的学生

学生实体集表
姓名性别学号班级学院号码
张三10101法政...
李四40207土木...
王五60304化环...

  

可能你会想这只是将实体集相关的属性数据存在了计算机中,其他的结构模型都可以做到,我们前面讨论的很多模型都不能很好的解决实体集之间多对多的问题,你关系模型有什么好的方法可以解决实体集之间多对多的问题呢?

事实上关系模型采用的是和网状模型类似的方法,都是将多对多模型转换成两个一对多来表示多对多关系的,这也是为什么,笔者费大量笔墨描述网状模型是如何将多对多关系转化成两个一对多关系的原因不过,关系模型和网状模型虽说都是采用将多对多关系转化成两个一对多关系,但是在使用效果上有很大的差别

咱们接着使用在介绍网状模型时的例子来对比这两个模型有什么区别

即设有学生A,B,C 和课程 1, 2,3

学生A选择了1号和3号课程,学生B选择了2号和3号课程,学生C选择了1号课程

这里为了简略,我们假设每个学生就三个属性,分别是姓名,学号,和性别

课程就两个属性,课程名和课程号

我们抽象出的选课属性有3个属性,分别是学号,课程号,成绩

那么接下来将这三个实体集用关系模型的二维表来表示出来

学生表
姓名学号性别
A01
B02
C03
课程表
课程名课程号
1k1
2k2
3k3
选课表
学号课程号成绩
01k1100
01k390
02k280
02k370
03k160

学生表与选课表是一对多的关系,课程表与选课表也是一对多的关系,选课这张表同时包含了学生和课程这两张表的信息,能够清晰地看到学生表和课程表之间的关系

那么网状数据模型是如何做的呢?

 

上图是网状模型中,学生集和课程集之间的关系,那么具体体现在链表中如下图

(因为挺复杂的,在电脑上画图不方便,我就用手绘的方式画图了,见谅) 

 

上图就是在用网状数据模型来表示学生集和课程集,看着还是挺复杂的,其实在设计和用代码实现时更复杂(这还仅仅只是几项数据),和我们上面的关系模型的表格对比,哪个好用就不用我多说了吧,我想应该没有多少程序员愿意设计和维护这样的结构模型,所以请替你的头发谢谢关系模型

开个玩笑,其实只要编写好了,底层实现复杂不复杂用户是不知道的,也不会关心

真正本质上的区别是,关系模型可以直接表示出学生集和课程集两个实体集之间的联系的,因为它把这两个实体集之间的联系直接用选课表来表示,那么我们想要查学生集和实体集之间的关系时,直接去查选课表就行了,这是即时性的

但是网状模型不一样,如果你想要在网状模型中查找学生集和课程集之间的关联,那么不好意思,请遍历一下上图画的那个链表,你只有把这个链表遍历一遍,才能知道学生集和课程集之间到底有啥关联,这需要一个遍历过程,所以是过程性的

现在我们大概清楚了,关系模型是使用二维表来存储实体集的属性以及实体集之间的联系的,我们使用的MYSQL数据库采用的也是关系模型,不要看是简单的二维表大家就完全放下心了, 二维表在数据库中的应用可以说是玩出了花,至于二维表能玩出什么变化,这是我们后面的内容了

本篇文章至此也就结束了,其实说了那么多,大家只需要记得,我们以后在使用MYSQL数据库时,主要是对关系模型的二维表进行各种操作,那么下篇文章笔者将详细讲讲如何在win和linux系统下安装自己的MySQL数据库,这里面的小问题还是挺多的,到时我会整理出来

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

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

相关文章

11. python从入门到精通——异常处理及程序调试

目录 异常概述 异常处理语句主要有四种 程序调试:Python有两种常用调试方法 异常概述 异常:异常就是出现错误并且会中断程序的正常执行 异常处理语句主要有四种 示例库:在输入浮点数或除数为0时会异常 def division():功能:分苹果print…

【JMeter】threadNum:将接口查询结果列表按顺序赋值给各线程

使用JMeter做性能测试会遇到这么一个场景:后面的请求需要根据前面的查询列表结果通过正则表达式提取器取值后赋值,而后面用户的赋值必须是唯一的,此时该如何做? 如果按编程思维来说,这个问题并不难。只需要把前面的结…

他们都开始偷偷学习高性能计算了 | 学习高性能计算需要哪些前置知识?

随着大模型的越演越烈,高性能计算这一领域被越来越多的人所熟知。未来的超算互联网时代,不懂高性能计算更是难以适应未来时代的发展与变化。很多同学都想学习高性能计算,今天作为国内首家专注高性能计算人才培养的专业机构就帮大家梳理一下&a…

接连三预测成真,75%的参与率,华为、阿里、腾讯纷纷介入

Cartner预测:75%参与率 去年,Cartner预测,75%的大型企业将使用至少四种低代码/无代码开发工具,用于IT应用开发! 可以感受的到,这几年低代码以突飞猛进的速度在各领域中得到应用。可以预见的是,…

如何 Java 中的大量的 if else 判断?

目录 问题出现: 如何 Java 中的大量的 if else 判断? 解决方案: 1.策略模式 2.工厂模式 3.映射表 4.反射配置文件------极力推荐使用!!!!! 问题出现: 如何 Java 中的…

STM32F407ZGT6 LQFP144 uart 打印输出

STM32F407ZGT6 AX58100 ETHERCAT芯片软件,需要查看SSC 协议栈运行情况,UART输出状态信息。 STM32F407ZGT6 驱动库使用标准库,虽然老,但是够用。 1.STM32F407ZGT6 芯片情况 STM32F407ZGT6 作为AX58100 的主控 2.板子硬件 STM3…

mysql双主不一致数据修复

参考: pt-table-checksum — Percona Toolkit Documentation pt-table-sync — Percona Toolkit Documentation #对比host1 test库与备库差别 pt-table-checksum hhost1,proot,P3306,uroot -d test --recursion-method processlist --no-check-binlog-format -…

Spring Boot进阶(52):Spring Boot 如何集成Flyway并初始化执行 SQL 脚本?| 超级详细,建议收藏

1. 前言🔥 在我们的认知中,我们会使用 SVN 或 Git 进行代码的版本管理。但是,我们是否好奇过,数据库也是需要进行版本管理的呢? 在每次发版的时候,我们可能都会对数据库的表结构进行新增和变更,…

微机保护的数据采集系统(1)

一、模拟五输入电路概述 模拟量输入电路是微机保护装置中很重要的电路。保护装置的动作速度和测量精确度等性能都与该电路密切相关。模拟量输入电路的主要作用是隔离、规范输入电压及完成模数变换,以便与CPU接口,完成数据采集任务。因此这部分电路又称数…

iOS —— xcode14兼容 iOS9~iOS10系统

xcode14兼容 iOS9~iOS10系统 在Xcode升级到Xcode14以后,系统的支持版本升级到了iOS11.0。但是我们项目需要支持iOS9,脚本打包错误提示: The iOS deployment target IPHONEOS_DEPLOYMENT_TARGET is set to 9.0, but the range of …

鼠标的移入、移出事件

目录 一、mouseover和mouseenter 二、mouseout和mouseleave 三、重点总结 在原生JS中鼠标移入移出事件有四个,分别为mouseover ,mouseout ,mouseenter,mouseleave,其中mouseover和mouseenter为移入事件,mouseout和mouseleave为移出事件&…

IDEA提交过滤target、idea、iml、vscode、build、iws、imlz、ipr、xls、rebel.xml

一、问题截图(IDEA提交过滤target、idea、iml、vscode、build、iws、imlz、ipr、xls、rebel.xml) 二、解决 添加.gitignore提交到仓库,就可以了 HELP.md target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/** #!**/src/test/**### STS …

交换机中光口是如何配置的

在往期的文章中我们有介绍到电口和光口的概念,以及两者之间的区别。本期文章我们来了解一下交换机光口的是如何配置的。 一、交换机光口是如何配置的 1、确认光口类型:首先,确定光口插槽使用的光模块类型(如SFP、SFP、QSFP等&am…

掌握5个关键点,搞定语音识别测试!

现在市面上的智能电子产品千千万,为了达到人们使用更加方便的目的,很多智能产品都开发了语音识别功能,用来语音唤醒进行交互; 另外,各大公司也开发出来了各种智能语音机器人,比如小米公司的“小爱”&#…

Redis实战案例2-基于Redis实现共享session短信登录

1. 实现Redis替代session的业务流程 保存用户登录信息采用Hash结构; key要保证唯一,用随机生成的token(随机字符串)作为key; 并且要保证客户端可以携带key去redis取出value,之前采用session方式是Tomcat自动…

实在智能RPA亮相2023全球人工智能技术博览会,“能对话的数字员工”引领智能自动化新篇章

随着ChatGPT火爆全网,人工智能再次成为学术界和科技领域“新宠”,一场“智能革命”的序幕悄然掀开。 6月13日,“智能驱动 砥砺前行”为主题的2023全球人工智能技术博览会在杭州未来科技城学术交流中心圆满落下帷幕。此次博览会以展示智能科技…

Java开发 - 带你了解集群间的相互调用,你还在等什么?

目录 前言 导读 项目准备 集群准备 父工程引入子项目 服务调用方HelloService准备 pom文件 yml文件 Controller文件 服务提供方HelloWorld准备 pom文件 yml文件 Controller文件 运行此两个工程 hello_world组集群 集群调用测试 RestTemplate换成Dubbo行不行…

web基础与HTTP

文章目录 一.web基础1.域名概述2.DNS解析3.阿里云域名申请流程 二.网页1.网页(HTTP/HTTPS)1.1 网页1.2 网站1.3 域名1.4 HTTP/HTTPS1.5 URL1.6HTML1.7超链接1.8发布 2. HTML2.1HTML超文本标记语言&#xff…

人机交互学习-3 交互设计目标与原则

交互设计目标与原则 交互设计目标可用性目标易用性(learnability)高效率(efficiency)易记性(memorability)少出错(errors)主观满意度(satisfaction) 用户体验…

C++ 11(2)右值引用 | 移动构造、移动赋值

前文中我们讲解了C11中的部分知识点,下面我们来介绍一下C11中的一个比较重要的知识点右值引用。 右值引用和移动语义 左值引用和右值引用 左值引用 左值就是一个数据的表达式(如变量名和解引用指针),我们可以获取它的地址可以…