数据库系统概述(内核)
本章将分为以下几个部分来讲诉:
目录)
-
- 数据库系统概述(内核)
- 数据库系统的一些基本概念
- 数据库系统的一些实现问题
- 数据库系统的一些设计问题
- 数据库系统的一些存取问题
数据库系统的一些基本概念
下面用问题的形式来回答一下一些数据库基本概念的定义:
-
什么是数据?
按照百度百科的词条定义:
数据就是数值,也就是我们通过观察、实验或计算得出的结果。数据有很多种,最简单的就是数字。数据也可以是文字、图像、声音等。数据可以用于科学研究、设计、查证、数学等。
但在研究中的数据定义会更加宽泛,数据是:人们用来反映客观世界时记录下来可以鉴别的一些符号。当然,这些符号就有文字,数字,数据还包括多媒体数据。 -
数据有什么特点?
数据是有语义的,比如说90这个数据,放在不同的情况下就有不同的含义,比如考试成绩90分,汽车车速90 km/h等等。 -
什么是数据库?
数据库又叫Database,在程序员中又经常叫做DB,它的职责:
1.就是让数据可以在计算机内可以长期的存储,同时数据又可以按照一定的数据模型组织,通俗的来讲就是表结构。
2.可以让用户共享,就是可以让人进行crud。(Create)、(Retrieve)、(Update)、(Delete)
3.为某个应用服务,现在的数据库可能服务的系统不止一个,但就是提供服务的意思。
4.数据之间的关系,密切联系。
当然,这种功能在操作系统中的文件系统也是可以做到的,但为啥用数据库系统不用文件系统这里就不过多的阐述了。 -
什么是数据库管理系统
数据库管理系统又叫Database Management System (DBMS) ,就是我们通常用的用来创建和维护数据库的一些程序,比如Oracle11g,MySql等等。这里就会有人混了,咦你说的这个不是数据库吗?数据库其实就是一个存储数据的仓库,有了一些大家熟悉的数据库系统,程序员才能很好的操作数据。
数据库系统和数据库之间还夹着操作系统呢。 -
什么是数据库模式?
大学生在课堂上上数据库的课的时候老师就会讲数据库啊,有三种模式,内模式,外模式,模式(逻辑模式),但由于大学生一开始学的时候对数据库概念的不熟悉,所以就不容易弄懂,但这是内核讲解就不多阐述数据库的使用与设计过程了。
数据库系统的一些实现问题
接下来假装我们自己实现了一个简陋的数据库吧!暂且起名就叫Treeses DBMS吧!
1.首先 咱DBMS要解决的第一件事就是 数据库文件怎么存储?
第一步,我们要考虑我们的数据库要使用什么编码方式来存储,二进制?ASC-II码?
东西都是要用文件来存储的,数据库也不例外,文件在存储器上最终都是用二进制来存储的,为了让我们看起来方便,我们这里就给咱数据库用 ASC-II码存储吧!
于是我们就实现了细节,关系通过文件(ASC-II)存储,其中文件存在位置 /user/db/data/table/user.db里吧。
以上我们就是我们的数据库表的存储,但是既然是关系型数据库,那么一些模式(表结构)总也是要存储的吧,要不然怎么知道这个表是用来干啥的呢,于是,我们需要把这个表的一个表结构存储在文件 /user/db/model/table_structure.db 里吧。
于是乎,我们解决了表结构的存储问题。
有了表结构,我们忽略中间的缓存,内存,索引,SQL解析等等等等的问题,我们要直接使用我们做好的SQL语句来进行查询吧!
我们运行了以下语句:
然后我们要怎么处理这些个数据呢?
第一步我们要读取table_structure.db的文件,获取user表的表结构;
然后读取user对应的文件user.db,对于文件的每一行做检查,如果满足条件则输出,没有满足条件则跳到下一行。
直到表结束了。
很简单吧,接下来:
假设我们还有一个表叫标准身材表(standard_stature.db),里面每一个身高对应一个标准的体重。
我们运行了以下语句:
这个语句又应该怎么处理呢?
第一步一样的,读取table_structure文件,获取user表和standard_stature表的表结构;
然后我们忽略表连接的以下成本分析过程,就按规则来。
读user文件,对于每一行数据,读standard_stature文件,对于每一行数据,生成连接元组,检查条件,若条件满足,则输出
这个时候,Treeses DBMS就具备了定义表和一些数据操作的功能了。但是我们的Treeses DBMS存在一些什么问题呢?
-
我们的查询效率真的很高吗?
如果我们能先把选择操作先做了呢?那连接的操作是不是可以更少?以下做个简单的计算吧!
假设table_structure表有1000个数据,standard_stature有100个数据,按照原来的方案。(不考虑内存)
1000100=100000 io。
现在,我们先对表进行筛选,比如A表满足要求的数据500条,B表满足要求的数据50条,那先两个表进行筛选的io次数 1000+50=1500,剩余的数据量为500条与50条,io次数50050=25000次,一共使用25000+1500=16500次。很明显,效率快了将近10倍,但实际上真的是所有情况下io次数都会减少吗?这个留待读者自己思考。 -
我们的元组实际上是平铺在磁盘上的,考虑ASCII存储的代价是否过于昂贵呢?我们要修改表的元组是否太过于麻烦呢?我们要删除表元组是否代价也很高呢?
-
我们的数据全都是从磁盘直接读取,要知道磁盘io的代价是非常高的,我们是不是要考虑缓冲区来优化我们的数据存取效率呢?
-
如果有很多用户一起访问,我们怎么保证数据是否是正确的呢?比如说我修改了这个数据的时候,你要在读取这个数据,怎么办?
-
数据库缺乏索引,查询效率是不是有点低下呢?每次查询数据都要读入整个的关系呢?至于索引为什么可以提高查询效率在后续的文章中会有详细的讲解。
-
数据库的可靠性怎么保证呢?比如说突然断电了?咱数据库是不是没有一个数据库系统出现故障的时候的一个恢复机制,容易出现数据不一致的情况?
-
数据库怎么提供给应用程序使用?没有API?
-
数据字典的组织是不是做的特别差呢?
综合评价,这数据库系统是否没法商用呢(唉,时隔多年这么评价自己当初做过的数据库系统也是尴尬,大家可以去 https://github.com/nainaiguang/Treeses.git )
实际上数据库怎么表达是个很复杂的问题,在后续的文章中会陆续的说到,上面的方式只是一个简单的说明。
数据库系统的一些设计问题
数据库系统的设计问题指我们在使用数据库系统时候的一些问题,本文提供思路,具体学习还是要读者自己去学习。不是本系列的重点哈哈哈哈哈
数据库模式设计的不规范可能带来的问题。如数据冗余,更新异常,插入异常,删除异常等等。
数据库系统的一些存取问题
就是如何定义数据库语言,数据库语言如下:
- 数据库定义语言 (Data Definition Language DDL),数据库存取模式
包括:create bable;alter table drop table - 数据库操作语言 (Data Manipulation Language DML),数据库存取数据
包括:insert,delete,select update - 数据库控制语言 (Data Control Language DCL) 存取访问控制信息
包括: grant;recoke
码字好累,各位看官支持支持,谢谢,下一文我将会为大家绘画一个数据库完整应该有的架构,以后的文章将会围绕这个架构内核进行展开,谢谢大家!