关系数据库基础理论[通俗易懂]

2022-11-03 17:01:29 浏览数 (1)

mysql系列之一关系数据库基础理论

正是数据库管理的需要催生了数据库管理系统DBMS,而关系型数据库管理系统为RDBMS

常见的数据模型有三种: – 层次模型 – 网状模型 – 关系模型


一、关系数据库的产生

在DBMS出现之前,人们用文件来管理数据,但存在很多缺陷: 1. 数据冗余和不一致性。数据冗余表示在每个shell脚本中基本上都是/bin/bash,但很多用户使用的都是bash,那么这个可能出现多次,冗余量很大;不一致性,比如有一个数据在多个文件中都被使用,那么修改的时候,需要把每个文件都手动修改。 2. 数据访问困难。如果数据库有上千万行数据,那么我们使用时,需要把这上千万行数据全部载入内存中,再使用,对硬件的要求会很高而且载入时间很长,但其实我们需要比较的也只是那一行数据而已。 3. 数据孤立。由于数据保存在不同的文件里面,所以这些文件之间的格式可能各不相同,所以后续开发一个软件来管理的话非常困难,因为它们不满足某一个规范,使得数据之间是相互孤立的。 4. 完整性问题。例如两个转账的用户之间数额的总和应该是一样的,但如果在转账的过程中出现了问题,那么文件就无法解决,除非应用程序设计上解决,但应用程序本身并无法理解数据之间的逻辑问题。 5. 原子性问题。类似于完整性问题,数据必须从一个稳定的状态转换为另外一个稳定的状态。 6. 并发访问异常问题。按道理来讲,如果一个用户访问数据库文件的前十行,另一个用户访问最后十行,本身他们俩并不会冲突,但如果某个用户需要修改的话,另外一个用户并不能访问。因为为了保证文件的完整性,我们会加锁的,但文件级别的锁安全性太高,并不适合这种访问。 7. 安全性问题。部分访问授权很难实现,很难使某一个用户只能看到其中指定的某些字段。

因为这些问题,所以出现了关系数据库 1. 关系数据库想要解决数据冗余问题,它将每一个关系都看成了一个,每一列都看成是一个属性,每一行看成是他的一个元组(也就是数据)如果有许多相同值的话,它将具有相同字段的值独立出来,把一张表拆分成两张表,降低所谓的冗余度,这种关系也叫做E-R关系模型(实体关系模型)

  • 常见的关系模型(结构化数据模型)
    • 关系模型:用一张二维表来表示关系模型
    • 实体关系模型:将一张表拆分,让它们产生某种联系
    • 对象关系模型:存储一些比较大的文件如何存储呢?可以将一个比较大的文件先存储在数据库文件管理系统当中的某一个存储空间上,表中用一个指针指向这么某一个数据,把它当作一个存储对象来进行管理。
    • 半结构化数据模型:结构化是指每一行存储的都是一样的,比如/etc/passwd文件中,第一个字段为用户名,第二个为密码等。半结构化表示它并不是唯一的,可能第一行存储的是用户名和性别,第二行存储的是用户名和年龄这种,所以每一行存储不止存储它的数据,还存储它的标签。

2.关系:关系代数,支持代数运算,比如两个集合的交集、并集等。

二、SQL和关系型数据的结构

SQL:Structure Query Language(关系结构化语言)

1、sql分类

  • DML:数据操作语言,增删改查都是DML语句:INSERT、DELETE、UPDATE、SELECT
  • DDL:数据定义语言,实现数据对象的存储和定义。CREATE、DROP、ALTER
    • 关系数据库RDB的对象基本有:库、表、索引、视图、用户、存储过程、触发器、事件调度器等。
    • 实现数据定义时,必须考虑数据的约束关系。数据库需要能够自己检查出来有没有逻辑性的错误,所以建立的时候注意它的有效数据范围。
    • 域约束:数据类型的约束
    • 外键约束:引用完整性约束
    • 主键约束:某字段能唯一标识此字段所属的实体,并且不允许为空,一张表中只能有一个主键
    • 唯一性约束:每一行的某字段都不允许出现相同值,可以为空,一张表中可以有多个
    • 检查性约束:比如年龄只能时int型
  • DCL:数据控制语言。GRANT、REVOKE,用来定义数据库中用户的访问权限

2、关系型数据的结构

  • 表示层:表
  • 逻辑层:存储引擎,实现表和数据文件的解构
  • 物理层:数据文件
数据存储和查询
  • 存储管理器
  • 查询管理器 负责接收用户查询,理解用户查询,并将用户的查询包括存储转换为对应的存储管理器可以理解的语句,存储管理器将数据存储到磁盘上或从磁盘上删除的这么一种组件
  • 存储管理器应该具有的组件(功能):权限及完整性管理器、事务管理器、文件管理器、缓冲区管理器
  • 查询管理器应该具有的组件(功能):DML解释器、DDL解释器、查询执行引擎

数据存储和查询的执行过程: 1. 查询管理器接收用户查询,并理解。使用DML和DDL解释器 2. 将DML和DDL解释器的结果给查询执行引擎 3. 查询执行引擎的结果给存储管理器 4. 存储管理器将操作写入磁盘中

mysql是单进程多线程的 mysql不允许一个进程为两个用户同时提供服务,比如一个用户请求访问某一个表,而第二个用户同时访问同样的数据,这两个请求不能使用同一个进程得到服务,原因是因该考虑是否两个用户对这个数据是否都有访问权限,如果其中一个没有,那么数据的安全性不能得到保障.

  • 单进程
  • 多线程
    • 守护线程:比如数据库将数据从缓冲区管理器写到磁盘上去,这个操作和应用没有任何关系,所以这些都是需要数据库本身来完成的.
    • 应用线程

    但因为数据库的请求很多时候需要的数据量是很大的,比如现在有十个用户同时对某个数据库访问,第一个用户需要载入256M的数据,第二个用户需要1G的数据等等.所以数据库通常是一个系统最慢的节点所在,应该尽量避免数据库的交互.那么应该怎么提高数据库的交互速度?

    • 缓存:第一次查询后保存缓存第二次访问时直接使用结果
    • 线程重用(thread reuse):一个用户退出之后,它的线程空闲下来之后不直接删除该线程,放在空闲线程池中,以后用户使用,直接用这个空闲的去响应它

三、关系运算

关系运算主要为了实现mysql语句的执行

  1. 投影:只输出指定属性
  2. 选择:只输出符合条件的行,类似于通过WHERE完成
  3. 自然连接:具有相同名字的所有属性上所有取值相同的行
  4. 笛卡尔积:不考虑表与表只见的关系,直接连接
  5. 并:和求并集相同

四、sql语言的组成部分

SQL语言的组成部分:DDL、DML、完整性定义语言(DDL的一部分功能)、视图定义、事务控制、嵌入式SQL和动态SQL、授权

使用程序设计语言如何与RDBMS交互 – 嵌入式SQL:与动态SQL类似,但是其语言必须在程序编译时完全确定下来,并由预处理器进行处理 – 动态SQL:程序设计语言使用函数(mysql_connect())或者方法与RDBMS服务器建立连接,并进行交互,通过建立连接向SQL服务器发送查询语句,并将结果保存至变量中而后进行处理。

五、mysql插件式存储引擎

mysql不同的存储引擎可以实现不同的功能 – 5.5.8之前,默认引擎为MyISAM – 5.5.8之后,默认引擎为InnoDB 简单来讲,MyISAM不支持事务,而InnoDB支持事务。所以InnoDB更适合在线事务处理系统

数据库逻辑请求过程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/181203.html原文链接:https://javaforall.cn

0 人点赞