数据库简介
# 数据库简介
# 常见的数据库产品
商用数据库,例如:Oracle,SQL Server,DB2 等;
开源数据库,例如:MySQL,PostgreSQL 等;
桌面数据库,以微软 Access 为代表,适合桌面应用程序使用;
嵌入式数据库,以 Sqlite 为代表,适合手机应用和桌面程序。
# 数据库相关概念
DB:数据库 (databese): 存储数据的仓库。它保存了一系列有组织的数据
DBMS:数据库管理系统 (Datebese Management system)。数据库是通过 DBMS 创建和操作容器,用于建立、使用和维护数据库,对数据库进行统一管理和控制,用户通过数据库管理系统访问数据库中表内的数据。
DBS:数据库系统 (Database System),是一个人机系统,由硬件、软件(操作系统)、数据库、DBMS、数据库管理员组成。
SQL:结构化查询语言 (Structure Query Language): 专门用来与数据库通信的语言

# 数据表
数据表 (Table) 是一个二维表格,用来存储数据和操作数据的逻辑结构。它由纵向的列和横向的行组成。行被称为记录,列被为字段,每一列表示记录的一个属性,有相应的描述信息,如数据类型、数据宽度等。

# 数据库
数据库 (Database),简称 DB, 是存储数据的仓库,其本质是一个文件系统。一个数据库可以包含多个数据表,数据库学习系统所需数据库 db study 包括若干个数据表,保存在安装路径的 Date 文件夹中,如下图所示为 mysql 8.0 中某个数据库中多个数据表。

# 数据库存储数据的特点
将数据放到表中,表再放到库中。一个数据库可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。
- 有组织:数据按一定的数据模型组织、描述和存储;
- 共享性:可以为各种用户(应用程序)共享使用,涉及并发访问控制;
- 冗余度小:冗余小降低存储和访问开销,保证数据一致,提高系统效率;
- 独立性高:构建逻辑模型和物理模型,保证逻辑独立性和物理独立性:
- 易扩展:数据库系统的能力,能够应对增长、扩展和提高性能的需求,
- 永久存储:数据长期存储在 MySQL 数据库中。
# MySQL 服务端
DBMS 分两类:
基于共享文件系统的 DBMS (Access)
基于客户机,服务器的 DBMS C/S (client/sever),底层是 TCP/IP 协议的程序;如 Mysql、Oracle、sqlsever
# 数据模型
数据库结构的基础是数据模型:一个描述数据、数据联系、数据语义以及一致性约束的概念工具的集合。数据模型的作用是将用户数据进行有效的组织,使其成为数据库,并能进行访问和数据处理。
# 关系模型
关系模型用表的集合来表示数据和数据间的联系。每个表有多个列,每列有唯一的列名。表也称作关系。关系模型是基于记录的模型的一种。基于记录的模型的名称的由来是数据库是由若干种固定数目的字段或属性。表的列对应于记录类型的属性。关系数据模型是使用最广泛的数据模型,当今大量的数据库系统都基于这种关系模型。
# 一对一关系
一对一关系是指关系数据库中两个表之间的一种关系。 表示的是表 A 中的一行数据只与表 B 中的一行有关系
“一对一关系” 是最简单的关系模型了,描述的是实体与实体之间的关系。如一个用户,只有一个身份证信息,一个身份证对应一个用户,并不存在一个身份证对应多个用户,或者一个用户对应多个身份证

# 一对多关系
一对多关系表示表 A 中的一行数据可以和表 B 中的多个行相关,但是表 B 中的数据只能和表 A 中的一行数据相关
如一个班级包含了多个学生,但是一个学生只能在一个班级中。在一对多的数据库设计中,后台通常会在学生表中,加入一个 classId 指向 class 表,从而表示一对多的关系


# 多对多关系
多对多关系表示表 A 中的一行数据可以和表 B 中的一行或者多行数据相关。表 B 的一行数据也可以和表 A 中的一行或者多行数据相关。
多对多关系,在关系型数据库中,是最复杂的了。多对多关系,需要一张中间表(学生课程关系记录)来转换,这张中间表里面需要存放学生表和课程表的关系,此时学生与中间表示 1 对多关系,课程与中间表是 1 对多关系。
如一个学生可以选修多门课程,一门课程可以被多个学生选修,这种情况下,我们称之为多对多关系;通常会引入一个关系表来表述 “多对多” 的关系,通常,关系表中会包括表 A 和表 B 的主键


# ER 模型
实体 - 联系 (E-R) 数据模型使用称作实体的基本对象集合,以及这些对象间的联系。实体是现实世界中可区别于其他对象的一件 “事情 “或一个 “物体”。实体 - 联系模型被广泛用于数据库设计。
# 半结构化数据模型
半结构化数据模型允许在其数据定义中某些相同类型的数据项含有不同的属性集。这和前面讲到的数据模型形成了对比,在数据模型中特定类型的每一个数据项都必须有相同的属性集。JSON 和可扩展标记语言被广泛地用于表示半结构化数据。
# 基于对象的数据模型
这可以看成对关系模型进行扩展,增加了封装,方法和对象标识等概念。 根据应用的目的不同,将数据模型分为两个层次:
- 概念模型:即实体 - 联系 (E-R) 数据模型,是从用户的角度对信息进行建模。
- 结构数据模型:即关系模型,是从计算机应用的角度对数据进行建模。
# 概念模型
概念模型一般使用” 实体 - 关系”(E-R) 图表示,E-R 图中包含了实体、联系和属性三个要素:
- 实体:即数据对象,对应现实世界中的事物”。
- 属性:实体具有的某一特性。
- 联系:实体集之间的对应关系。

- 实体:矩阵框表示
- 属性:椭圆形框表示
- 联系:菱形框表示,同时在无向边上标注联系类型
将 E-R 模型中的实体,属性,实体之间的联系转换成关系模式时,一个实体对应一个关系模式,每个关系模式内需要有主键,还有其他必要的属性,同时还要反映实体之间的联系,用外键表示,班级和学生的关系模式表示如下:
- 学生表(学号,姓名,性别,身高,出生日期,班号,联系电话)
- 班级表(班号,班级名称,部门号)
其中,学号是学生表的主键,班号是学生表的外键,学生表中还需要有姓名,性别,身高,出生 日期以及联系电话等学生表必要的属性。 班号是班级表的主键,部门号是班级表的外键,部门表还需要部门名称属性。
# 关系代数
关系代数中有五个基本运算,即选择、投影、笛卡儿乘积、集合并、集合差,它们能实现大多数人们感兴趣的数据检索操作。此外,还有连接、集合交、除运算等,它们都可以通过五个基本运算表示出来。下图说明了每个运算的功能。


# 一元运算
# 选择
如列出工资多于 10000 英镑的所有员工,输人关系是 Staff,谓词是 salary>10000。
可以运用逻辑运算符

# 投影
产生仅显示 staffNo、fName、IName 和 salary 信息的员工工资列表
投影运算定义了一个新的关系,并以指定的顺序排列这些属性

# 集合运算
选择和投影运算都只是从单个关系中提取信息。显然还会遇到这样的情况,需要结合多个关系中的信息。如关系代数中的二元运算,首先介绍并、集合差、交和笛卡儿乘积四个集合运算。
# 并
为了获得具有并相容性的关系,首先用投影运算得到 Branch 关系和 PropertyForRent 关系在属性 city 上的投影,必要时消除重复元组。然后使用并运算获得新关系,结果下图所示。

# 差
列出有分公司但无待租房产的城市清单。
先将关系 Branch 和关系 Property-ForRent 在属性 city 上投影,获得具有并相容性的关系。再使用集合差运算得到新关系,结果下图所示。

# 交
列出既有分公司又至少存在一处待租房产的城市的清单
先将关系 Branch 和关系 PropertyForRent 在 ciy 属性上投影,获得具有并相容性的关系。再使用交运算得到新关系,结果下图所示。

# 笛卡尔乘积
列出所有查看过待租房产的客户的姓名和评论。 客户的姓名都保存在关系 Client 中,而所有的查看资料则保存在关系 Viewing 中。为了既获取客户信息,又得到他们查看房产后的评论,需要将这两个关系组合起来:

这个运算的结果上图所示。现在得到的表格中包含了一些多余的信息。例如,这个关系中的第一个元组就有两个不同的 clientNo 值。为了获取所需的列表,需要再执行一个选择运算,以提取 Client.clientNo=Viewing.clientNo 的元组。那么,完整的运算就是:

# 连接运算
通常只需要将满足特定条件的笛卡儿乘积结合起来,因此一般采用连接运算来代替笛卡儿乘积运算。连接运算是将两个关系结合起来组成一个新的关系,它是关系代数中一种重要的运算。连接是由笛卡儿乘积导出的,相当于把连接谓词看成选择条件,对两个参与运算关系的笛卡儿乘积执行一次选择运算。
# θ 连接
其中 θ 为六个比较运算符 (<,≤,>,≥,=,≠) 之一
因为 θ 连接是基于笛卡儿乘积的,所以它的维数是参与运算的关系 R 和 S 的维数之和。在谓词 F 仅包含等号 (=) 的情况下,θ 连接就变成了等接 (Equijoin)。
# 等接运算
列出所有查看过待租房产的客户的姓名和评论
或

# 自然连接
自然连接运算对两个关系中所有具有相同名称的属性执行等接运算
# 外连接
在连接两个关系时,经常会出现一个关系中的某些元组无法在另一个关系中找到匹配元组的情况,换句话说,就是这些元组在连接属性上不存在匹配值。但可能仍希望这些元组出现在结果中,这时就要用到外连接
左(自然)外连接,因为它在结果中保留了左边关系的所有元组
右外连接,在结果中保留右边关系的所有元组
全外连接,它保留了左、右两个关系中的所有元组,凡没有找到匹配元组的就在相应的属性中填入空。
# 半连接
半连接运算执行了两个关系的连接后,再将结果投影到第一个参与运算的关系的所有属性上。半连接的优点之一是可减少必须参与连接的元组的数目。
# 关系代数小结

# 三大范式
- 第一范式(1NF):数据表中的每一列 (字段),必须是不可拆分的最小单元,也就是确保每一列的原子性。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。 两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据
- 第二范式(2NF):在第一范式的基础上,每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。
- 第三范式(3NF):满足 2NF 后,要求:表中的每一列都要与主键直接相关,而不是间接相关(表中的每一列只能依赖于主键); 数据不能存在传递关系,即没个属性都跟主键有直接关系而不是间接关系。像:a–>b–>c 属性之间含有这样的关系,是不符合第三范式的。