各位同学大家好,本次课程我们就来了解数据库的相关知识,数据库顾名思义就是用来保存数据的,像是淘宝,美团,滴滴都有大量的数据需要保存,如果做一个横向对比,是程序重要还是数据库重要?那肯定是数据库重要了。
比如说淘宝系统吧,开发这个系统大致用了7000万元人民币,但是在淘宝里边的数据价值就远远超过了这个数字,淘宝的数据库里边记录了用户的信用信息,收入水平,购物习惯等等重要的数据,深挖这些数据,精准的向用户推送服务和广告数据的商业价值远远超过了静态的程序。
讲解数据库之前,我们首先要明白一个事情,就是在计算机中存放数据的载体是什么。我们所熟知的一些操作系统,比如说Windows, 和Linux,还有Mac OS,都是基于文件存储的操作系统。说的简单一些,就是这些系统都是用文件来保存数据的,比如说AVI文件,保存的是视频,doc保存的是word文档,JPG是图片文件,TXT是文本文档,同学们也都用了好多年Windows系统了,也都明白C盘里面存放了好多系统文件,这些文件一旦损坏了或者删除了,都有可能对系统造成严重的影响,比如说死机死机蓝屏什么的,现在你明白了,数据是以文件为载体保存。
那么推演下去,数据库的数据也得是依靠文件来保存,然后我们接着考虑一个问题,既然文件能保存数据,那我还用数据库干什么呀?用文件直接管理数据就好了呀,我来解释一下这种想法错在哪儿?比如说我可以用一个记事本来保存一个公司的员工数据,那这种数据格式是json格式的。那这个格式很特殊,它是分为key和value的,那么是这个key, value, key, value组成了一条数据,那这条数据的外侧,我用一个大括号儿给它括起来,就代表说是一条完整的数据了。
那么因为有很多的这个员工,那我就用大括号儿接着往下定义这些员工的信息,那么定义完以后我最外层再套上一个中括号,对儿,就代表说我定义的是一个集合,在这个集合里边是有好多的这个员工信息的,这是一种特殊的数据格式,那比如说李强这条数据它的年龄是25岁,然后基本工资是6800块钱,是属于技术部的员工,那像这样的这个信息下面儿都是我就不一一解释了。
那么我们用记事本来保存员工的数据,保存数据这一关是没有问题的,但是提取数据这关就非常不好过了,比如说在记事本里边只有CTRL加F这个快捷键是按照关键字来查找数据的,它并不支持按照复杂的表达式去提取数据,比如说我现在想查找每个部门中工资高于本部门平均工资,而且年龄是超过25岁的员工,那么我们用记事本。怎么用肯你用excel不就行了吗?其实excel也是有局限性的,那就是不支持关联数据的查找。
比如说我现在有两个sheet页儿,分别保存的是部门儿信息和员工信息,那么员工信息和部门儿信息是有关联关系的,比如说这个每个部门儿都有自己的编号儿,然后每一个员工都有自己所隶属的部门儿。
比如说张强这个人,他所属的部门儿就是4号部门儿,4号这个部门儿是管理部,所以每一个员工都有自己所隶属的部门儿,如果说我现在想查询每名员工的姓名,还有部门儿的名称,这个就需要到两个sheet页里面去提取数据了,excel是没有办法实现的,因此说我们还是得乖乖的去使用数据库系统它能实现多表儿的联合查询,数据库系统也是基于文件的,那么数据。
一、什么是数据库系统
我们完整的看一下数据库系统的定义,数据库系统的英文全称叫做data base manage system,简称的叫做DBM。数据库系统是指一个能为用户提供信息服务的系统,它实现了有组织的,动态的,存储大量相关的数据的功能。提供了数据处理和信息资源共享的便利手段,这么一大段文字,其实想表现的中心意思只有一个,数据库为我们提供了数据读写的服务,接下来我们看一下关系型数据库的概念,关系型数据库的英文全称叫做relation database manager system。简称叫做RDBMS,关系型数据库,顾名思义就是使用了关系模型的数据库系统。
我们到百度百科上去查找关系型数据库的词条,得到的解释非常的抽象,又是代数集合,又是科德12定律的,搞得大家云里雾里的,最终也没明白什么是关系型数据库,其实解释这个事情非常的简单,没有那么难以理解,数据库是用文件来存放数据的,这一点大家都知道,如果把数据。都写到一个文件里边比如说既有学生信息,又有考试记录,又有其他信息等等,这样存放数据就很不好管理,比如说数据库读取文件的时候一会儿遇到学生记录,一会儿又遇到考试记录了数据,乱七八糟的,数据库的经常去判断这条数据是什么呀那条数据是什么呀这样一来数据读取的速度就慢了,于是就有人想了一个办法,我们把数据分门别类的保存到不同的文件里边,这样不就好管理了吗?比如说学生信息都保。存到一个文件里边考试信息就保存到另外一个文件里边,那么教师信息也单独保存成一个文件,分开存放数据,但是数据之间还是可以有关联关系的。比如说学生和考试成绩,他们就是有关联关系的,老师和学生的数据也是有关联关系的,需要的时候数据库可以从多个文件里面联合提取出数据,所以这一点大家尽可放心,不是数据不是数据拆分完以后我们就无法提取联合信息了,是可以的。所以说关系型数据库总结成一句话,那就是数据分类存放到不同的文件里,数据之间是可以有联关系的,我这么说同学们是不是就好理解这个关系型数据库了?知识就是这样一层窗户纸,捅破了什么就都明白了。
接下来我说一下关系型数据库的历史,因为这里边是有很多人在争论,第一款关系型数据库产品是IBM的DB two,也有人说是甲骨文的oracle,那么准确的说,关系型数据库理论是IBM公司的system R团队提出的,但是第一个成品确实是oracle公司做出来的,因此说,世界上第一款关系型数据库的成品应该是oracle数据库,而不是IBM的DB 2数据库,刚才我解释过了,关系型数据库是把数据分门别类的保存到不同的数据文件里边,这样数据库就省去了不停的去判断这条数据是什么,那条数据是什么,所以数据的读写速度也就提升了,速度提升之后,那我们就可以往数据库里面保存大量的数据,就算成千上万的数据,数据库也可以轻松的去读写,那么保存上亿的数据也是没有问题的,所以说,你看数据文件的关系模型,还是有好处的吧。所以说,关系型数据库才是最重要的数据库产品,在教育,商业,医疗,电信,金融等领域吧都有大规模的使用,比如我们上学的时候接触过学籍系统,买东西会上淘宝网,有病了会刷医保卡,这些业务的背后都有数据库的身影,所以我们只有先掌握了数据库,才能用python语言开发出来种各种各样的系统。
大家介绍一下主流的关系型数据库产品,首先说的是IBM的DB 2数据库,它是商业版的数据库,一般来说是随着硬件儿服务器赠送给用户的,别看是免费赠送的硬件儿,服务器的价格可一点儿都不低呀,虽然DB 2的性能非常好,但是无奈采购的成本实在是太高了。所以DB two只会在超大型的项目中会见到,比如说电信以及金融领域。
另一款商用的数据库是甲骨文的oracle,它的性能也非常的棒,采购的成本就没有DB 2那么恐怖了,一般来说,oracle会有一个收费的价格表,它是按照CPU的数量,内核儿的数量以及主频的高低来收费,还分为一年授权,两年授权等等。甲骨文是根据这些因素来制定收费标准的,简单点儿说,一个CPU永久的授权费是17万左右,也许对中小型企业来说,这个儿价格儿还能接受,但是对于BAT这样的大型互联网企业,动不动就是几千台数据库的集群,oracle的授权支出还是非常高的。而且oracle是商业产品,不开放源代码,有的时候根据业务去定制数据库的模块儿也是不行的,因此在BAT眼里,oracle数据库反而不如一些开源免费的数据库好用。
第三个要说的就是MySql数据库了,这个数据库是我们要学习的数据库产品,MySql是开源免费的数据库产品。虽然说性能赶不上oracle和DB 2,但是贵在灵活,我们可以很方便的对mysql数据库做二次开发。比如说oracle的ocean base数据库,就是基于mysql 2次开发而来的,facebook,谷歌呀,腾讯,百度,这些企业都在大规模的使用mysql,所以我们学好mysql数据库前景还是非常好的。最后一个要说的是微软的circle Server数据库。这个数据库的图形界面儿做的是非常不错,而且在教育领域是免费让大家使用的。
在各个操作系统上都能安装唯独circle Server很特殊,早期微软的数据库只能安装在自家的Windows系统上面,不支持Linux系统。真正运营的时候,数据库是一定要部署在Linux系统之上的,Li因为Linux系统非常的稳定,可以去掉图形界面儿,用命令行儿去操作,而且安新装程序,更新程序也不要求我们重启系统。所以Linux非常的稳定,号称20年不用重启,那么circle Server不支持Linux系统,也就决定了这个数据库在生产领域没有人去使用。
二、非关系型数据库
我们这个课程既要学习关系型数据库,又要学习非关系型数据库。因为SQL语句是用来操作关系型数据的,所以人们常常把非关系型数据库叫做nosql数据库。
那么nosql数据库也是把数据分类存放到不同的文件里边,但是数据之间是没有关联关系的,这是因为nosql数据库根本就没有给你提供sql语言,让你从多个数据文件里面提取关系数据,那我们为什么还要用nosql数据库?其实no sql数据库是关系型数据库的一种补充,他们之间不是竞争的关系,而是互补的关系,比如说秒杀这个场景吧,两把200块钱的东西10块钱就卖你,但是库存只有100件儿,于是大家就疯狂的抢购秒杀有个严重的问题就是超卖,本来店家想卖100件儿,但是秒杀结束之后却发现卖出了300件儿造成超卖的原因是数据库系统是多线程的,消费者你买我也买的请求。在数据库上就变成了多个线程,争抢读库存和改库存,所以多线程的条件下就容易出现超卖,关系型数据库都是多线程的,所以秒杀这个业务对数据库来说就很难处理。因此我们可以引入nosql数据库,有一种nosql数据库叫做redis,它就是单线程的,所以它就不会出现超卖的情况。你看这是不是对关系型数据库的一种补充?还有就是关系型数据库,保存数据之前,需要先建表儿,定义字段的类型儿,还有约束的条件,哪些列不能为空值,哪些列不能有重复值等等。所以在高速写入的时候,这样的校验就会让速度明显的降低,如果保存的是重要数据,我也就不说什么了,如果保存的是海量低价值的数据,这就是对数据库的极大浪费。
主流的nosql数据库,这些nosql数据库都是开源免费的产品,比如说redis是用内存来保存数据的一种nosql数据库。新浪微博用它来保存很多大V用户的热点微博信息,内存的速度是远远超过硬盘的,所以redis中的数据读写速度比硬盘要快很多,那除了保存一些微博信息,比如说电商系统里边首页里的一些商品信息,那么都可以保存到redis里边,这样我们打开一个电商网站,首页加载的速度就非常的快。然后另外这个memcake跟redis也是相似的,都是用内存来保存数据的,但是相比较而言redis的市场份额更大一些,mongodb是用硬盘来保存数据的,no sql数据库保存海量低价值的数据是非常适合的,比如说新闻,留言,回帖,朋友圈,通知消息等等。它适合用来保存复杂的组织关系和人际关系。那么在本门课程中我们学到的nosql数据库是两种,一个是redis,另外一个是mongodb。nosql数据库只是关系型数据库的补充而已,只在特定的业务场景中去使用,比如说新闻的篇幅都很长,mysql的字符串儿类型不适合保存太长的字符内容,所以呢新闻就应该保存到mongodb数据库里边