在这篇文章里,笔者将简单介绍数据库的起源和发展,数据库的分类,读完这篇文章,大家就对数据库有一个大概了解,也就是知道我们该学什么样的东西
为什么需要数据库
在如今的信息时代,各行各业每天都会产生大量的数据,这些数据通过加工处理可以转化成对我们有用的信息,那么在处理数据之前,总得将数据保存并管理起来
说到数据的保存和管理,我们可能会瞬间想到文件。没错,在未接触数据库之前,我们保存自己数据的方式大多都是通过文件,文件保存数据的方式操作起来简单,能够对数据进行简单增删查改,对于普通用户来说这些功能就足够了
但是我们从事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选择了
现在我们发现了,从学生和课程的视角出发,都能够找到对应的关系,这种实现两个实体集之间多对多关系的方式,本质是在两个实体集之间再加了一个实体集,然后将多对多的关系给转换成两个一对多的关系。上例中选课集这个新增的实体集就是用来映射学生集和课程集之间的关系的,学生集与选课集之间的关系是一对多,课程集与选课集之间的关系也是一对多
早期的计算机资源很有限,直接使用图这种数据结构,效率比较低下,图在表达层次关系上不如链表那么直观,所以通过链表指针连接,然后加一层映射关系来实现的多对多联系的设计也是很巧妙的,能表示出来多对多的关系,但是缺点也是比较明显,那就是让链表的指向关系变得非常的复杂,导致用程序实现的难度相当的高,而且不利于后序对程序进行维护和升级
关系模型
关系模型是绝大多数数据库软件采用的逻辑模型,不同于层次和网状模型的树和链表
关系模型采用的是二维表结构,每一列都是这个实体集的其中一个属性特征,每一行都是这个实体集中的一个实体,我们称表中的列为属性,表中的行为元组
咱们接着以学生为例,学生这个实体集有姓名,性别,学号,班级,学院,号码等属性特征,所以学生集这个二维表的属性列就有姓名,性别,学号,班级,学院,号码等内容,然后每一行(即每个元组)都表示一个具体的学生
姓名 | 性别 | 学号 | 班级 | 学院 | 号码 |
张三 | 男 | 101 | 01 | 法政 | ... |
李四 | 男 | 402 | 07 | 土木 | ... |
王五 | 男 | 603 | 04 | 化环 | ... |
可能你会想这只是将实体集相关的属性数据存在了计算机中,其他的结构模型都可以做到,我们前面讨论的很多模型都不能很好的解决实体集之间多对多的问题,你关系模型有什么好的方法可以解决实体集之间多对多的问题呢?
事实上关系模型采用的是和网状模型类似的方法,都是将多对多模型转换成两个一对多来表示多对多关系的,这也是为什么,笔者费大量笔墨描述网状模型是如何将多对多关系转化成两个一对多关系的原因。不过,关系模型和网状模型虽说都是采用将多对多关系转化成两个一对多关系,但是在使用效果上有很大的差别
咱们接着使用在介绍网状模型时的例子来对比这两个模型有什么区别
即设有学生A,B,C 和课程 1, 2,3
学生A选择了1号和3号课程,学生B选择了2号和3号课程,学生C选择了1号课程
这里为了简略,我们假设每个学生就三个属性,分别是姓名,学号,和性别
课程就两个属性,课程名和课程号
我们抽象出的选课属性有3个属性,分别是学号,课程号,成绩
那么接下来将这三个实体集用关系模型的二维表来表示出来
姓名 | 学号 | 性别 |
A | 01 | 男 |
B | 02 | 男 |
C | 03 | 女 |
课程名 | 课程号 |
1 | k1 |
2 | k2 |
3 | k3 |
学号 | 课程号 | 成绩 |
01 | k1 | 100 |
01 | k3 | 90 |
02 | k2 | 80 |
02 | k3 | 70 |
03 | k1 | 60 |
学生表与选课表是一对多的关系,课程表与选课表也是一对多的关系,选课这张表同时包含了学生和课程这两张表的信息,能够清晰地看到学生表和课程表之间的关系
那么网状数据模型是如何做的呢?
上图是网状模型中,学生集和课程集之间的关系,那么具体体现在链表中如下图
(因为挺复杂的,在电脑上画图不方便,我就用手绘的方式画图了,见谅)
上图就是在用网状数据模型来表示学生集和课程集,看着还是挺复杂的,其实在设计和用代码实现时更复杂(这还仅仅只是几项数据),和我们上面的关系模型的表格对比,哪个好用就不用我多说了吧,我想应该没有多少程序员愿意设计和维护这样的结构模型,所以请替你的头发谢谢关系模型
开个玩笑,其实只要编写好了,底层实现复杂不复杂用户是不知道的,也不会关心
真正本质上的区别是,关系模型可以直接表示出学生集和课程集两个实体集之间的联系的,因为它把这两个实体集之间的联系直接用选课表来表示,那么我们想要查学生集和实体集之间的关系时,直接去查选课表就行了,这是即时性的
但是网状模型不一样,如果你想要在网状模型中查找学生集和课程集之间的关联,那么不好意思,请遍历一下上图画的那个链表,你只有把这个链表遍历一遍,才能知道学生集和课程集之间到底有啥关联,这需要一个遍历过程,所以是过程性的
现在我们大概清楚了,关系模型是使用二维表来存储实体集的属性以及实体集之间的联系的,我们使用的MYSQL数据库采用的也是关系模型,不要看是简单的二维表大家就完全放下心了, 二维表在数据库中的应用可以说是玩出了花,至于二维表能玩出什么变化,这是我们后面的内容了
本篇文章至此也就结束了,其实说了那么多,大家只需要记得,我们以后在使用MYSQL数据库时,主要是对关系模型的二维表进行各种操作,那么下篇文章笔者将详细讲讲如何在win和linux系统下安装自己的MySQL数据库,这里面的小问题还是挺多的,到时我会整理出来