昨天补充了DBMS概况的存储管理层面,今天来详细介绍数据库管理系统中常见且应用广泛的关系型数据库(简称关系数据库),比如postgreSQL、MySQL、Oracle Database。
关系模型
关系模型是数据库中如何进行存储和组织数据的理论基础。用C语言类比就是:我们输入一个值之前需要先用一个变量来替代实际的这个值并且同时给这个变量定义一个具体的数据类型;如下:
int a;//定义变量和数据类型
scanf_s(“%d”,&a);//输入a的值
我们在输入一个关系实例之前(比如选课表,有学号、选的课程名和课程号),先是要有一个关系(理解成表)来替代实际的值并且同时给这个关系定义一个关系模式(表存储和组织数据的方式),这就是关系模型的具体应用和解释。
如下图。
从上面我们也可以看到表和关系在一定程度上可以理解成是同一个东西。关系数据库实际上是表的集合关系数据库也是由于表和数学上关系的概念密切相关才因此得名。
但是日常生活中的表和数据库中的表语义上有很多不同:
比如下图
Student (Sno,Sname,Sgender,Sage Sdept)是关系模式,关系模式由关系名和属性名集合组成
Student表是关系名
这一整个表是关系
每一行的数据是元组
每一列的数据是属性
每一列的列名是属性名
每一列的列值是属性值
记录和列相交的部分就是分量如上图中的每一个学号
关系实例是元组的集合,会根据业务状态也就是实际情况会发生变化——比如学生表会因为多一个转学来的而多一个元组。
关系模型包含三个部分——关系数据结构、关系操作、关系完整性约束。
关系数据结构
域
实际上前面已经包含了关系数据结构的部分内容——关系模式的解释(新术语的引入),接下来介绍另外的关系数据结构。每一个关系中有不同的属性,这些属性都有对应的属性值,比如Sage,表示学生的年龄,很明显,学生的年龄是有范围的,也叫作域,即关系中的每一个属性都存在一个合法的取值集合,而且属性下的每一个值都来自于同一个域,比如Sage属性的值应该是整数或者是空值(NULL),而不会是日期等其他数据类型。
超键、候选键、复合键
当某一个属性能明显区分元组之间的区别时(可以唯一地标识不同的元组),这样的属性或者几个这样的属性(即属性集合)叫做超键,比如Sno属性是超键,(Sno、Sname)属性集合也是一个超键。
学号是不可能会出现重复的情况的,这样的也叫作候选键即超键中(当有多个时)没有多余的冗余的属性,如果(Sno、Sname)中Sname属性取值是唯一的(即没有出现同名情况)那么这个(Sno、Sname)超键也是候选键。注意:候选键得先是超键。
候选键中的属性也叫作主属性,之外的叫非主属性。比如Student关系主属性是Sno
有时候单个属性并不能区分元组之间的区别,得有两个或者两个以上的属性,比如想要标识“每个学生这门课程的成绩”就不仅需要学生学号,也需要课程号。这样的属性集合叫复合键。
主键、外键
一个关系中可能会有多个候选键,比如当学生姓名不出现重复时,那么Sno和Sname都可以是候选键,这时候需要选择一个最合适的候选键即主键,例如Student关系的主键是Sno
上面例子中复合键包括两个属性,这两个属性分别是Student关系和Course关系的主键,此时在SC关系中这两个属性叫做外键。
关系操作
有查询和数据更新操作,数据更新包含数据的删除、插入、修改,查询操作是关系操作中最核心的部分。关系操作用关系运算来表示,关系运算本质上是一种关系查询语言,它和SQL都是关系数据库语言。SQL不给出运算过程,直接描述数据本身的特征即可,和关系运算中的关系演算一样都是属于非过程化语言,关系运算中还存在过程化语言——关系代数,会给出运算过程。
关系运算
关系代数
关系代数包含基本、附加和扩展运算。
基本关系代数运算
包含一元的(对单个关系)运算——选择、投影、重命名;二元的(对两个关系)运算——并、差、笛卡尔积。
一元:
选择运算σ
(1)假如你想查询计算机系所有学生的信息,用关系代数是这么表示的
Student是关系名,CS属性值表示计算机系,Sdept表示属性名。
查询结果会是:
(2)再比如你想查询计算机系年龄大于等于18以及所有数学系的学生信息:
MA属性值表示数学系,∧是与运算,∨是非运算,前者是交集后者是并集。
查询结果:
投影运算∏
假如你想查询计算机系所有学生的姓名和学号:
结果:
重命名ρ
表示将原来的关系名从SC改成StudentCourse,并且属性栏改成了Snon Cno Score (原来是Snon Cno Grade)
结果
二元:
并运算U
查询所有17岁或18岁学生的信息:
可以看到包含选择运算σ,先是σ对两个关系一一做进行查询操作然后再做两个关系的并运算。
结果:
差运算-
查询计算机系中未成年同学的信息
结果:
笛卡尔积运算×
明天继续学习其他运算和关系完整性约束