深入理解RDBMS(上) | 青训营笔记

147 阅读8分钟

这是我参与「第五届青训营 」笔记创作活动的第10天

一、前情回顾

  • 存储系统
    • 块存储
    • 文件存储
    • 对象存储
    • key-value 存储
  • 数据库系统
    • 关系型数据库
    • 非关系型数据库
  • 分布式架构
    • 数据分布策略
    • 数据复制协议
    • 分布式事务算法

二、本堂课重点知识

  1. 经典案例
    • 喜闻乐见:从一场红包雨说起
  2. 发展历史
    • 源远流长:RDBMS从1970年第一篇论文发布至今已有50余年,衍生出Oracle,DB2,MySQL,SQL Server,Aurora等一系列知名数据库产品
  3. 关键技术
    • 万变归宗:无论RDBMS如何演变,其核心都是SQL引擎、存储引擎、事务引擎
  4. 企业实践
    • 繁花似锦:RDBMS广泛的应用于互联网、金融、电信、电力等领域,成为了各类企业级应用的数据基石

三、详细知识点介绍

1. 经典案例

1.1 从一场红包雨说起

每年的春节,抖音上都会下一场温暖人心的红包雨

  • 从抖音的账户上扣除一个小目标
    • UPDATE account_table SET balance = balance - '小目标' WHERE name = '抖音';
  • 给羊老师的账户加上一个小目标
    • UPDATE account_table SET balance = balance + '小目标' WHERE name = '羊老师';

1.2 RDBMS 事务 ACID

事务(Transaction):是由一组SQL语句组成的一个程序执行单元(Unit),它需要满足ACID特性。

BEGIN;
UPDATE account_table SET balance = balance - '小目标' WHERE name = '抖音';
UPDATE account_table SET balance = balance + '小目标' WHERE name = '杨洋';
COMMIT;

ACID:

  • 原子性(Atomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生
  • 一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性
  • 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果
  • 持久性(Durability):在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

1.3 红包雨 与 ACID

  • Case1:抖音的账户上扣了一个亿之后,假设服务器挂了,还没来得及给羊老师账户上加一个亿。

image.png 原子性 Atomicity

两个操作要么同时成功,要么同时失败,不存在中间状态。

  • Case2:假设抖音的账户上只有0.5亿,但是扣减1个亿的操作成功了

image.png 一致性 Consistency

每个操作都必须是合法的,账户信息应该从一个有效的状态变为另一个有效的状态。

  • Case3:羊老师从抖音抢了一个亿红包,又从头条抢了一个亿,两个转账同时进行,假设他们都以为是从零开始更新羊老师的账户余额,羊老师最后得到一个亿。

image.png 隔离性 Isolation 两个操作在对同一个账户并发进行操作时,应该是相互不影响,表现的像是串行操作。

  • Case4:抖音的账户上扣了一个亿,然后羊老师的账户上加一个小目标,但都还没写到磁盘上。这个时候,如果服务器挂了:

image.png 持久性 Durability

操作更新成功之后,更新的结果应该永久性的保留下来,不会因为宕机等问题而丢失。

1.3 红包雨 与 高并发

  • Case5:全国14亿人,假设有10亿人同时开抢红包,每秒处理一个请求,那需要31年才能完成。春节完了,抖音可能也被大家嫌弃了...... ———— 高并发 Concurrency

image.png

1.3 红包雨 与 高可靠

  • Case6:假设除夕晚上大家正在愉快的从抖音身上“薅羊毛”,这时候服务器挂了,程序员花了一个小时,头发都要掉光了,终于修好了。这时候发现李谷一老师《难忘今宵》都唱完了。“抖音宕机”秒上热搜....————高可靠、高可用 High Reliability/Availability

image.png

2. 发展历史

2.1 前 DBMS 时代

2.1.1 人工管理

在现代计算机发明出来以前,通过人工的方式进行数据记录和管理:

  • 结绳记事
  • 清代钱庄账本
  • 用于1890年人口普查的霍列瑞斯式的打孔机

image.png 效率太低!

2.1.2 文件系统

1950s,现代计算机的雏形基本出现。1956年IBM发布了第一个的磁盘驱动器--Model 305 RAMAC,从此数据存储进入磁盘时代。在这个阶段,数据管理直接通过文件系统来实现。

image.png

写到纸上编程写到文件里,变了个马甲

2.2 DBMS 数据模型

2.2.1 网状模型

网状模型数据库所基于的网状数据模型建立的数据之间的联系,能反映现实世界中信息的关联,是许多空间对象的自然表达形式。1964年,世界上第一个数据库系统————继承数据存储(Integrated Data Storage,IDS)诞生于通用电气公司。IDS是世界上第一个网状数据库,奠定了数据库发展的基础,在当时得到了广泛的应用。在1970s网状数据库系统十分流行,在数据库系统产品中占据主导地位。

image.png

网状数据模塑是以记录类型为结点的网络结构,即一→个结点可以有→个或多个下极境点,也可以有一个或多个上圾话点,两个锋点之间甚至到可以有多种联系,他如以数门与请程两个记最灵型、可以有'任畏和棋导两娥系,称之为合钱,两个记录类型之间的值可以是多对多的联系,例如一门课程被多个学生修读,一个学生选修多门课程。

2.2.2 层次模型

1968年,世界上第一个层次数据库————信息管理系统(Information Management System,IMS)诞生于IBM公司,这也是世界上第一个大型商用的数据库系统。层次数据模型,即使用树形结构来描述实体及其之间关系的数据模型

image.png

层次数据库就是树结构。每棵树都有且仅有一个很节点,其余的节点都是非很节点。每个节点表示一个记录类型时应与实体的概念,记录类型的各个字段对应实体的各个属性。各个记录类型及其亨段部必须记录。

2.2.3 关系模型

1970年,IBM的研究员E.F.Codd博士发表了一篇名为“A Relational Model of Data for large Shared Data Banks”的论文,提出了关系模型的概念,奠定了关系模型的理论基础。1979年Oracle首次将关系型数据库商业化,后续DB2,SAP Sysbase ASE, and Informix等知名数据库产品也纷纷面世。

image.png

使用表格表示实体和实体之间关系的数据模型称之为关系数据模型。

关系数据模型中,无论是是实体、还是实体之间的联系都是被映射成统一的关系——张二维表,在关系模型中,操作的对象和结果都是一张二维表,它由行和列组成;

关系型数据库可用于表示实体之间的多对多的关系,只是此时要借助第三个关系—表,来实现多对多的关系;

2.2.4 DBMS数据模型

网状模型层次模型关系模型
优势能直接描述现实世界;存取效率较高结构简单;查询效率高;可以提供较好的完整性支持实体及实体间的联系都通过二维表结构表示
劣势结构复杂;用户不易使用;访问程序设计复杂无法表示M:N的关系;插入、删除限制多;遍历子节点必须经过父节点;访问程序设计复杂关联查询效率不够高;关系必须规范化

1974年ACM牵头组织了一次研讨会,会上开展了一场分别以Cod和1Bachman为首的支持和反对关系数据库两派之间的鹏论。这次著名的辩论推动了关系数据库的发展,使其最终成为现代数捱奔产品的主流,

2.3 SQL语言

1974年IBM的Ray Boyce和Don Chamberlin将Codd关系数据库的12条准则的数学定义以简单的关键字语法表现出来,里程碑式地提出了SQL(Structured Query Language)语言

  • 语法风格接近自然语言
  • 高度非过程化
    • 非关系数据模型的数据操纵语言是面向过程的语言,用其完成用户请求时,必须指定取路怪。而用SQL进行数据操作,用户只需提出“做什么”,而不必指明“怎么做”,因此用户无需了解存取路径,存取路径的选择以及SQL语句的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。
  • 面向集合的操作方式
    • SQL采用集合操作方式,不仅查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合
  • 语言简洁,易学易用
    • SQL的功能极强,但由于设计巧妙,语言十分简洁,完成数据定义、数据操纵、数据控制的核心功能只用了9个动词:CREATE、ALTER、DROP、SELECT、INSERT、UPDATE、DELETE、GRANT、REVOKE,且SQL语言语法简单,接近英语口语,因此容易学习,也容易使用。
UPDATE account_table SET balance = balance - '小目标' WHERE name = '抖音';
  1. Find account_table
  2. Search account_table and compare name to '抖音'
  3. Calculate balance - '小目标'
  4. Write new balance back to account_table

2.4 历史回顾

image.png