--- icon: material-symbols:overview title: 关系数据库简介 date: 2023-11-01 09:39:59 categories: - 数据库 - 关系型数据库 tags: - 数据库 - 关系型数据库 permalink: /pages/d3704adb/ --- # 关系数据库简介 ## 什么是关系型数据库 关系型数据库是指采用了关系模型来组织数据的数据库。关系模型是一种数据模型,它表示数据之间的联系,包括一对一、一对多和多对多的关系。在关系型数据库中,数据以表格的形式存储,每个表格称为一个“关系”,每个关系由行(记录或元组)和列(字段或属性)组成。 常见的关系型数据库有:MySQL、Oracle、PostgreSQL、MariaDB、SQL Server、SQLite 等。 ## 什么是 SQL SQL 是 Structured Query Language(结构 化查询语言)的缩写。SQL 是一种专门用来与数据库沟通的语言。 SQL 有两个主要的标准,分别是 SQL92 和 SQL99。92 和 99 代表了标准提出的时间,SQL92 就是 92 年提出的标准规范。除了 SQL92 和 SQL99 以外,还存在 SQL-86、SQL-89、SQL:2003、SQL:2008、SQL:2011 和 SQL:2016 等其他的标准。主流 RDBMS,比如 MySQL、Oracle、SQL Sever、DB2、PostgreSQL 等都支持 SQL 语言,也就是说它们的使用符合大部分 SQL 标准,但很难完全符合。 SQL 语言按照功能可以划分成以下的 4 个部分: - **DDL** 是 Data Definition Language 的缩写,即数据定义语言,它用来定义我们的数据库对象,包括数据库、数据表和列。通过使用 DDL,我们可以创建,删除和修改数据库和表结构。 - **DML** 是 Data Manipulation Language 的缩写,即数据操作语言,我们用它操作和数据库相关的记录,比如增加、删除、修改数据表中的记录。 - **DCL** 是 Data Control Language 的缩写,即数据控制语言,我们用它来定义访问权限和安全级别。 - **DQL** 是 Data Query Language 的缩写,即数据查询语言,我们用它查询想要的记录,它是 SQL 语言的重中之重。在实际的业务中,我们绝大多数情况下都是在和查询打交道,因此学会编写正确且高效的查询语句,是学习的重点。 ## 数据库核心术语 - **数据库** - 数据库 (DataBase 简称 DB) 就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。 - **数据库管理系统** - 数据库管理系统 (Database Management System 简称 DBMS) 是一种操纵和管理数据库的大型软件,通常用于建立、使用和维护数据库。 - **数据库系统** - 数据库系统 (Data Base System,简称 DBS) 通常由软件、数据库和数据管理员 (DBA) 组成。 - **数据库管理员** - 数据库管理员 (Database Administrator, 简称 DBA) 负责全面管理和控制数据库系统。 - **OLTP** - 联机事务处理 (OLTP) 系统的主要用途是处理数据库事务。 - **OLAP** - 联机分析处理 (OLAP) 系统的主要用途是分析聚合数据。 - **元组** - 元组(Tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。 - **码** - 码就是能唯一标识实体的属性,对应表中的列。 - **候选码** - 若关系中的某一属性或属性组的值能唯一的标识一个元组,而其任何、子集都不能再标识,则称该属性组为候选码。例如:在学生实体中,“学号”是能唯一的区分学生实体的,同时又假设“姓名”、“班级”的属性组合足以区分学生实体,那么{学号}和{姓名,班级}都是候选码。 - **主码** - 主码也叫主键。主码是从候选码中选出来的。一个实体集中只能有一个主码,但可以有多个候选码。 - **外码** - 外码也叫外键。如果一个关系中的一个属性是另外一个关系中的主码则这个属性为外码。 - **主属性** - 候选码中出现过的属性称为主属性。比如关系 工人(工号,身份证号,姓名,性别,部门). 显然工号和身份证号都能够唯一标示这个关系,所以都是候选码。工号、身份证号这两个属性就是主属性。如果主码是一个属性组,那么属性组中的属性都是主属性。 - **非主属性** - 不包含在任何一个候选码中的属性称为非主属性。比如在关系——学生(学号,姓名,年龄,性别,班级)中,主码是“学号”,那么其他的“姓名”、“年龄”、“性别”、“班级”就都可以称为非主属性。 ## 数据模型 数据模型是**对现实世界数据特征的抽象**,也就是说**数据模型是用来描述数据,组织数据和对数据进行操作的**。 现有的数据库都是基于某种数据模型的,**数据模型是数据库系统的核心和基础**。 数据模型可以分为两类:第一类是概念模型,第二类是逻辑模型和物理模型。 ### 概念模型 **概念模型**也称为信息模型,它是按照用户的观点来对数据和信息建模,主要用于数据库设计。 概念模型主要涉及以下一些概念: - 实体 - 客观存在并可相互区别的事务称为实体。 - 属性 - 实体具有的某一特性称为属性。 - 码 - 唯一标识实体的属性集称为码。 - 实体模型 - 用实体名及其属性名集合来抽象和刻画同类实体,称为实体模型。 - 实体集 - 同一类型实体的集合就是实体集。 - 联系 - 实体之间的联系通常指的是不同实体集之间的联系。 - 实体之间的联系有一对一,一对多和多对多等多种类型。 概念模型的一种表示方法是:**实体-联系方法**,该方法使用 ER 图来描述现实世界的概念模型,ER 方法也成为 ER 模型。 ### 逻辑模型 **逻辑模型**是计算机系统的观点对数据建模,主要用于数据库管理系统的实现。 逻辑模型通常由三部分组成: - **数据结构** - 数据结构描述数据库的组成对象以及对象之间的联系,也就是说,数据结构描述的内容有两类,一类是对象的类型、内容、性质有关的,一类是与数据之间联系有关的对象。 - **数据操作** - 数据操作指的是对数据库中各种对象的实例允许执行的操作的集合,包括操作及有关的操作规则。主要有查询和更新两大操作。 - **数据的完整性约束** - 数据的完整性约束条件是一组完整性规则。 **物理模型**是对数据最底层的抽象,他描述数据在系统内部的表示和存储方式,是面向计算机系统的。 ## 函数依赖 **定义**:设 **R(U)** 是**属性集合 U={ A1, A2, ... , An }** 上的**一个关系模式**,X, Y 是 U 上的两个子集,若对 R(U) 的任意一个可能的关系 r ,r 中不可能有两个元组满足在 X 中的属性值相等而在 Y 中的属性值不等,则称 “ X 函数决定 Y ” 或 “ Y 函数依赖于 X ” ,记作 X->Y 。 **白话**:在一个**关系 R** 中,属性(组) Y 的值是由属性(组) X 的值所决定的 。又可以说,在关系 R 中,**若两个元组的 X 属性值相同,那么这两个元组的 Y 属性值也相同**。 为什么叫做**函数**依赖? 函数的定义:对于定义域中任意 x ,有且只有一个 y 与之对应。 属性之间的依赖:对于相同的 X 属性值,有且只有一个 Y 属性值与之对应。 **本质**:函数依赖的本质就是反应了 一个关系中**属性之间**的**约束关系**,或者**依赖关系**。函数依赖是一种数据依赖。 **举例**: ``` U = { 学号,姓名,年龄,专业 } {学号} → { 姓名,年龄,专业 } ``` > 扩展阅读:[白话详解数据库函数依赖和 Armstrong 公理及其引理](https://zhuanlan.zhihu.com/p/344087914) ## 范式 数据库规范化,又称“**范式**”,是数据库设计的指导理论。**范式的目标是:使数据库结构更合理,消除存储异常,使数据冗余尽量小,增进数据的一致性**。 根据约束程度从低到高有:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)等等。 ![](https://raw.githubusercontent.com/dunwu/images/master/snap/202410022024207.png) ### 第一范式 (1NF) 1NF 要求**所有属性都不可再分解**。 ### 第二范式 (2NF) 2NF 要求记录有唯一标识,即实体的唯一性,即**不存在部分依赖**。 假设有一张 student 表,结构如下: ```sql -- 学生表 student(学号、课程号、姓名、学分、成绩) ``` 举例来说,现有一张 student 表,具有学号、课程号、姓名、学分等字段。从中可以看出,表中包含了学生信息和课程信息。由于非主键字段必须依赖主键,这里学分依赖课程号,姓名依赖学号,所以不符合 2NF。 不符合 2NF 可能会存在的问题: - **数据冗余** - 每条记录都含有相同信息。 - **删除异常** - 删除所有学生成绩,就把课程信息全删除了。 - **插入异常** - 学生未选课,无法记录进数据库。 - **更新异常** - 调整课程学分,所有行都调整。 根据 2NF 可以拆分如下: ```sql -- 学生表 student(学号、姓名) -- 课程表 course(课程号、学分) -- 学生课程关系表 student_course(学号、课程号、成绩) ``` ### 第三范式 (3NF) **如果一个关系属于第二范式**,并且在**两个(或多个)非主键属性之间不存在函数依赖**(非主键属性之间的函数依赖也称为传递依赖),那么这个关系属于第三范式。 3NF 是对字段的**冗余性**,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即**不存在传递依赖**。 假设有一张 student 表,结构如下: ```sql -- 学生表 student(学号、姓名、年龄、班级号、班主任) ``` 上表属于第二范式,因为主键由单个属性组成(学号)。 因为存在**依赖传递**:(学号) → (学生)→(所在班级) → (班主任) 。 **可能会存在问题:** - 数据冗余 - 有重复值; - 更新异常 - 有重复的冗余信息,修改时需要同时修改多条记录,否则会出现**数据不一致的情况** 。 可以基于 3NF 拆解: ``` student(学号、姓名、年龄、所在班级号) class(班级号、班主任) ``` ### 反范式 反范式,顾名思义,与范式的目标正好相反。**范式**的目标是**消除冗余**;**反范式**的目标是**冗余以提高查询效率**。 范式并非越严格越好,现代数据库设计,一般最多满足 3NF。范式越高意味着表的划分更细,一个数据库中需要的表也就越多,用户不得不将原本相关联的数据分摊到多个表中。当用户同时需要这些数据时只能通过关联表的形式将数据重新合并在一起。同时把多个表联接在一起的花费是巨大的,尤其是当需要连接的两张或者多张表数据非常庞大的时候,表连接操作几乎是一个噩梦,这严重地降低了系统运行性能。因此,**有时为了提高查询效率,有必要适当的冗余数据,以达到空间换时间的目的——这就是“反范式”**。 ## ER 图 E-R 图又称实体关系图,是一种提供了实体,属性和联系的方法,用来描述现实世界的概念模型。通俗点讲就是,当我们理解了实际问题的需求之后,需要用一种方法来表示这种需求,概念模型就是用来描述这种需求。 ER 图中的要素: - **实体** - **用矩形表示**。实际问题中客观存在的并且可以相互区别的事物称为实体。实体是现实世界中的对象,可以具体到人,事,物。可以是学生,教师,图书馆的书籍。 - **属性** - **用椭圆形表示**。实体所具有的某一个特性称为属性,在 E-R 图中属性用来描述实体。比如:可以用“姓名”“姓名”“出生日期”来描述人。 - **主键** - **在属性下方标记下划线**。在描述实体集的所有属性中,可以唯一标识每个实体的属性称为键。键也是属于实体的属性,作为键的属性取值必须唯一且不能“空置”。 - **联系** - **用菱形表示**。世界上任何事物都不是孤立存在的,事物内部和事物之间都有联系的,实体之间的联系通常有 3 种类型:一对一联系,一对多联系,多对多联系。 ![](https://raw.githubusercontent.com/dunwu/images/master/snap/202410022024964.png) 绘制 ER 图常用软件: - [drawio 官网](https://www.draw.io/) - 开源的绘图工具,特点是简洁、清晰,并且同时支持线上线下绘图。 - [Visio](https://products.office.com/zh-cn/visio/flowchart-software) - Office 的绘图工具,特点是简单、清晰。 - [亿图](http://www.edrawsoft.cn/) - 国内开发的、收费的绘图工具。图形模板、素材非常全面,样式也很精美,可以导出为 word、pdf、图片。 - [StarUML](http://staruml.io/) - 样式精美,功能全面的 UML 工具。 - [Astah 官网](http://astah.net/) - 样式不错,功能全面的绘图工具。 - [ArgoUML 官网](https://argouml.en.softonic.com/?ex=CAT-759.2) - [ProcessOn 官网](https://www.processon.com/) - 在线绘图工具,特点是简洁、清晰。 > 扩展阅读: > > [ER 图(实体关系图)怎么画?](https://www.zhihu.com/tardis/zm/art/270299029?source_id=1003) ## 参考资料 - [《关系数据库简介(第 5 版)》](https://book.douban.com/subject/26317662/) - [数据库逻辑设计之三大范式通俗理解,一看就懂,书上说的太晦涩](https://segmentfault.com/a/1190000013695030) - [ER 图(实体关系图)怎么画?](https://www.zhihu.com/tardis/zm/art/270299029?source_id=1003)