数据库基础
一、引入
我们通常称 Mysql
、Oracle
、SQLite
之类的为数据库, 其实本质上它们是一个个数据库管理软件。
假设现在你已经是某大型互联网公司的高级程序员,让你写一个火车票购票系统,来hold住十一期间全国的购票需求,你怎么写?
由于在同一时段抢票的人数太多,所以你的程序不可能写在一台机器上,应该是多台机器一起分担用户的购票请求。
那么问题就来了,票务信息的数据存在哪里?存在文件里么?
如果存储在文件里,那么存储在哪一台机器上呢?是每台机器上都存储一份么?
首先,如果其中一台机器上卖出的票另外两台机器是感知不到的,
其次,是如果我们将数据和程序放在同一个机器上,如果程序和数据有一个出了问题都会导致整个服务不可用.\。
最后,是操作文件,修改文件对python代码来说是一件很麻烦的事
基于上面这些问题,单纯的将数据存储在和程序同一台机器上的文件中是非常不明智的。
数据库管理软件:本质就是个C/S架构的套接字程序
服务端套接字 客户端套接字
操作系统:Linux 操作系统
计算机(本地文件) 计算机硬件
sql语句:套接字管理软件的作者为使用者规定的命令规范
二、为什么用数据库
根据上面的例子,我们已经知道:
- 将文件和程序存在一台机器上很不合理的。
- 操作文件是一件很麻烦的事
下面将介绍会产生的问题以及数据库管理软件的解决方案
1.程序所有组件都运行在一台机器上的问题
- 问题 : 运行程序机器的宕机代表着整个软件的崩溃, 并且程序执行的效率依赖于承载它的硬件, 一台机器的性能是有限的, 受限于目前的硬件水平, 一台机器的性能垂直进行扩展是有极限的
- 解决 : 我们可以通过水平扩展来增强我们系统的整体性能,这就需要我们将程序的各个组件分布于多台机器去执行
2.数据安全性问题
- 问题 : 我们通过将组件放置不同机器解决了上一个问题, 但需知各组件仍然是一个整体, 所有组件的数据还是要共享的, 但每台机器上的组件都只能操作本机的文件, 这就导致了数据必然不一致
- 解决 : 将数据与应用程序分离, 将文件专门放在一台机器上, 然后将多台机器通过网络去访问这台机器上的文件(用socket实现), 即共享这台机器上的文件,共享则意味着竞争, 会发生数据不安全, 需要加锁处理
3.实现并发
-
基于问题 2 的解决我们就需要写出一个socket服务端来存放和管理数据库文件, 然后再写一个socket客户端来访问服务端存放的数据
-
功能实现 : 远程连接(支持并发)、打开文件、读写文件(并且加锁)、关闭文件
4.数据库管理软件诞生
- 针对上面产生的问题以及解决方案, 我们在编写任何程序之前, 都需要事先写好基于网络操作一台主机上文件的程序 (socket服务端与客户端程序)
- 于是有人将此类程序写成一个专门的处理软件,这就是mysql等数据库管理软件的由来
- 但mysql解决的不仅仅是数据共享的问题, 还有查询效率, 安全性等一系列问题, 总之, 把程序员从数据管理中解脱出来, 专注于自己的程序逻辑的编写
三、数据库介绍
3.1 新的概念诞生–数据
数据(Data), 就是描述事物的符号, 它可以是数字, 也可以是文字、图片、图像、声音、语言等, 数据由多种表现形式,它们都可以经过数字化后存入计算机, 在计算机中描述一个事物, 就需要抽取这一事物的典型特征, 组成一条记录, 就相当于文件里的一行内容
派大星,man,22,1999,美国,IT,17届,斯坦福 # 一条记录
章鱼哥,man,35,1986,美国,餐饮,10届,斯坦福 # 一条记录
单纯的记录没有什么意义, 必须给予说明, 于是我们就可以按逗号作为分隔,依次定义各个字段的意思,相当于定义表的标题
name,sex,age,birth,addr,industry,entrance_time,school # 字段
派大星,man,22,1999,美国,IT,17届,斯坦福 # 一条记录
章鱼哥,man,35,1986,美国,餐饮,10届,斯坦福 # 一条记录
添加字段之后我们就能知道每条记录每个逗号分隔开的都是代表什么意思
3.2 什么是数据库
数据库(DataBase)简称DB, 它是存放数据的仓库, 只不过这个仓库是在计算机存储设备上, 而且数据是按一定的格式存放的, 过去人们将数据存放在文件柜里, 现在数据量庞大, 已经不再适用。
数据库是长期存放在计算机内、有组织、可共享的数据集合, 数据库中的数据按一定的数据模型组织、描述和储存, 具有较小的冗余度、较高的数据独立性和易扩展性, 并可为各种用户共享。
3.3 什么是数据库管理软件
数据库管理软件(DataBase Management System)简称DBMS
- 在了解了Data与DB的概念后, 如何科学地组织和存储数据, 如何高效获取和维护数据成了关键, 这就用到了一个系统软件---->数据库管理系统, 如MySQL、Oracle、SQLite、Access、MS SQL Server
- mysql主要用于大型门户, 例如搜狗、新浪等, 它主要的优势就是开放源代码, 因为开放源代码这个数据库是免费的, 他现在是甲骨文公司的产品
- oracle主要用于银行、铁路、飞机场等, 该数据库功能强大, 软件费用高, 也是甲骨文公司的产品
- sql server是微软公司的产品, 主要应用于大中型企业, 如联想、方正等
而对数据库管理的人员一般称之为:数据库管理员 DBA(Database Administrator)
3.4 数据库核心概念总结及关系(重点)
- 数据 : 事物的状态, 可以将其归纳总结出字段信息
- 记录 : 多个字段的信息组成的一条记录, 即文件中的一行内容
- 表 : 一个文件
- 数据库 : 文件夹
- 数据库管理软件 : 即套接字程序, 例 : mysqld <—> mysql
- 数据库服务器 : 运行mysqld(服务端)的一台计算机
四.数据库管理软件分类
由上面的介绍我们已经知道, 数据库管理软件的本质就是一个C/S套接字程序, 一个服务端套接字, 一个客户端套接字, 而数据库管理软件不仅仅只有一种, 他们也有两种分类
1.关系型数据库管理软件
- 简单理解 : 需要有表结构
- 例 : sqllite,db2,oracle,access,sql server,MySQL (sql语句通用)
2.非关系型数据库管理软件
- 简单理解 : 通过key–value的形式存储的, 没有表结构。
- 例 :
mongodb
,redis
,memcache
五、数据库管理技术的发展历程(了解)
5.1 人工管理阶段
20世纪50年代中期以前,计算机主要用于科学计算。
当时的硬件水平:外存只有纸带、卡片、磁带,没有磁盘等直接存取的存储设备
当时的软件状况:没有操作系统,没有管理数据的软件,数据的处理方式是批处理。
人工管理数据具有以下特点:
- 数据不保存:计算机主要用于科学计算,数据临时用,临时输入,不保存
- 应用程序管理数据:数据要有应用程序自己管理,应用程序需要处理数据的逻辑+物理结构,开发负担很重
- 数据不共享:一组数据只对应一个程序,多个程序之间涉及相同数据时,必须各自定义,造成数据大量冗余
- 数据不具有独立性:数据的逻辑结构或物理结构发生变化后,必须对应用程序做出相应的修改,开发负担进一步加大
5.2 文件系统阶段
20世纪50年代后期到60年代中期
硬件水平:有了磁盘、磁鼓等可直接存取的存储设备
软件水平:有了操作系统,并且操作系统中已经有了专门的数据管理软件,即文件系统;处理方式上不仅有了批处理,而且能够联机实时处理
文件系统管理数据具有以下优点:
- 数据可以长期保存:计算机大量用于数据处理,因而数据需要长期保存,进行增删改查操作
- 由文件系统管理数据:文件系统这个软件,把数据组织成相对独立的数据文件,利用按文件名,按记录进行存取。实现了记录内的结构性,但整体无结构。并且程序与数据之间由文件系统提供存取方法进行转换,是应用程序与数据之间有了一定的独立性,程序员可以不必过多考虑物理细节。
文件系统管理数据具有以下缺点:
- 数据共享性差,冗余度大:一个文件对应一个应用程序,不同应用有相同数据时,也必须建立各自的文件,不能共享相同的数据,造成数据冗余,浪费空间,且相同的数据重复存储,各自管理,容易造成数据不一致性
- 数据独立性差:一旦数据的逻辑结构改变,必须修改应用程序,修改文件结构的定义。应用程序的改变,也将引起文件的数据结构的改变。因此数据与程序之间缺乏独立性。可见,文件系统仍然是一个不具有弹性的无结构的数据集合,即文件之间是孤立的,不能反映现实世界事物之间的内存联系。
5.3 数据系统阶段
20世纪60年代后期以来,计算机用于管理的规模越来越大,应用越来越广泛,数据量急剧增长,同时多种应用,多种语言互相覆盖地共享数据结合要求越来越强烈
硬件水平:有了大容量磁盘,硬件架构下降
软件水平:软件价格上升(开发效率必须提升,必须将程序员从数据管理中解放出来),分布式的概念盛行。
数据库系统的特点:
- 数据结构化
- 数据共享,冗余度低,易扩充
- 数据独立性高
- 数据由DBMS统一管理和控制
- 数据的安全性保护
- 数据的完整性检查
- 并发控制
- 数据库恢复