一、关系模型基础知识
1、关系模型概述
关系模型的数据结构是:二维表结构,它是关系型数据库的基础。
关系数据模型由关系数据结构、关系操作和关系完整性约束三部分组成。
关系必须是规范化的,满足一定的规范条件。
关系数据库必须满足1NF范式,即一张表中不包含子表。(关系的每一个分量必须是一个不可分的数据项, 不允许表中还有表)
关系模型只是常用的数据模型的一种,数据模型按照数据之间的联系可以划分为:
- 层次模型
- 网状模型
- 关系模型
- 面向对象模型
2、关系模型的基本概念
关系模型在1970年提出,操作语言是结构化查询语言SQL(Structural Querry Language)
- 关系:通常指一张表
- 元组:表中的一行记录
- 属性:表中的一列,有属性名和属性值(分量)
- 分量:元组中的一个属性值
- 关系模式:对关系的描述,通常有几张表就有几个关系模式
- 域:属性值的取值范围
- 键:
- 超键(关键字):在关系中能唯一标识元组的属性集
- 候选键:不含有多余属性的超键(候选键中的所有属性都是必须的,缺少任何一个属性,都不能唯一标识一个元祖)
- 主键:用户选作元组标识的候选键(人为设定)
- 外键:如果关系模式R中的属性k是其他关系模式的主键,则k是R中的外键(表与表的关系通过外键来描述)外键表中的外键不能有主键表中不存在的数据。(保证数据的完整性和一致性)
- 主属性:一个属性只要在任何一个候选键中出现过,这个属性就是主属性。
- 非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。
举例说明超键、候选键等概念的含义:
假设有如下两张表:学生信息(学号 身份证号 性别 年龄 身高 体重 宿舍号)和 宿舍信息(宿舍号 楼号)
超键:只要含有“学号”或者“身份证号”两个属性的集合就叫超键,例如R1(学号 性别)、R2(身份证号 身高)、R3(学号 身份证号)等等都可以称为超键!
候选键:不含有多余的属性的超键,比如(学号)、(身份证号)都是候选键,又比如R1中学号这一个属性就可以唯一标识元组了,而有没有性别这一属性对是否唯一标识元组没有任何的影响!
主键:就是用户从很多候选键选出来的一个键就是主键,比如你要求学号是主键,那么身份证号就不可以是主键了!
外键:宿舍号就是学生信息表的外键
主属性:出现在候选键中的属性称为主属性,如上面学号、身份证号都是主属性。
非主属性:没有在任何候选键中出现的属性,称为非主属性。如上面性别、年龄、身高、体重、宿舍号都是非主属性。
关系的完整性约束
- 实体完整性:关系必须有主键,且主键不能重复,不能为空
- 参照完整性:以外键的形式维护实体间的引用关系,可以为空或者值为被参照关系的主键值
- 用户自定义完整性:用户由应用环境决定的针对具体关系数据库的约束(属性类型等)
3、关系代数
我们以如下的两张表作为原始数据:
并操作(Union)
关系(表) R 与关系 S 的并(∪)由属于 R 或属于 S 的元组(记录)组成。
差操作(except)
关系R与关系S的差由属于R而不属于S的所有元组组成。
交操作(intersection)
关系R与关系S的差由属于R且属于S的所有元组组成。
笛卡尔积(cartesian product)
这里的笛卡尔积严格地讲是广义笛卡尔积。在不会出现混淆的情况下广义笛卡尔积也称为笛卡尔积。
两个分别为n目和m目的关系R和S的广义笛卡尔积是一个n+m列的元组的集合。元组的前n列是关系R的一个元组,后m列是关系S的一个元组。若R有k1个元组,S有k2个元组,则关系R和关系S的广义笛卡尔积有k1×k2个元组。
R中的每一行元素与S中的每一行元素连接。
相当于:select 列名 from 表A,表B 或者select 列名 from 表A join 表B
投影(projection)
关系R上的投影是从R中选择出若干属性列组成新的关系。
相当于:select 列名 from 表名。
选择(selection)
选择又称为限制(Restriction)。它是在关系R中选择满足给定条件的诸元组。
相当于:select * from 表名 where 条件。
除(division)
除法运算是一个复合的二目运算。如果把笛卡尔积看作“乘法”运算,则除法运算可以看作这个“乘法”的逆运算。
若T=R÷S,则S×T的结果应该全部包含在R中。
关系数据库中,除法的计算,详细过程参见https://blog.csdn.net/weixin_42023723/article/details/80876568。
连接(join)
关系R与关系S的连接运算是从两个关系的广义笛卡尔积中选取属性间满足一定条件的元组形成一个新的连接。(如果不加任何条件,那么默认的连接就是两张表的广义笛卡尔积)。连接可以分为内连接、自然连接和外连接,其中外连接又可以分为左外连接、右外连接、全外连接。
(1)等值连接(equal join)
从关系R和S的广义笛卡尔积中选取A、B属性值相等的那些元组。
对应的SQL语句为:select * from R join S on R.A = S.B
(2)自然连接(natural join)
自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把属性重复的列去掉。
对应的SQL语句为:select * from R natural join S。
等值连接与自然连接的区别和联系:
1、自然连接一定是等值连接,但等值连接不一定是自然连接。
2、等值连接要求相等的分量,不一定是公共属性;而自然连接要求相等的分量必须是公共属性。
3、等值连接不把重复的属性除去;而自然连接要把重复的属性除去。
(3)内连接(inner join)
内连接是将两张表中共有某属性值的记录挑选出来。与等值连接类似,二者都是取交集。
(4)左外连接(left join)
在自然连接的基础上,保证左表完全显示,右表若不存在则用null填满。
(5)右外连接(right join)
在自然连接的基础上,保证右表完全显示,左表若不存在则用null填满。
(6)全外连接(OUTER JOIN)
左连接+右连接+去重=全连接
在MySQL中不支持FULL JOIN(全连接),但是可以通过UNION来实现,通过将左外连接和右外连接的结果求并得到。
(SELECT * FROM test1 LEFT JOIN test2 on test1.C=test2.d) UNION (SELECT * FROM test1 RIGHT JOIN test2 on test1.c = test2.C);
4、函数依赖
平凡的函数依赖
如果X→Y,但Y∈X,则称X→Y是平凡的函数依赖.
非平凡的函数依赖
如果X→Y,但Y∉X,则称X→Y是非平凡的函数依赖。通常情况下总是讨论非平凡的函数依赖.
完全函数依赖
如果存在 X 属性集(注意是集合,说明是联合主键)决定唯一的 Y ,且 X 中的任一子集都不能决定 唯一的 Y,则 Y 完全依赖于 X。
例子:学生数学成绩完全由该学生的学号和数学课决定,所以数学课成绩完全依赖于(学号,数学课)
部分函数依赖
如果存在 X 属性集(注意是集合,说明是联合主键)决定唯一的 Y ,且 X 中的任一子集也可以决定 唯一的 Y,则 Y 部分依赖于 X。
例子:学生学号和姓名可以决定唯一的学生,但是学号也可以决定唯一的学生。
传递函数依赖
如果X→Y,Y∉X,Y→Z,Y不完全函数依赖于X,则称Z对X传递依赖。
例如:书的出版编号是唯一,版权归出版社所有,所以只能由该出版社出版。所以存在函数依赖:书出版编号—>出版社名,出版社名—>出版社地址,但是出版社名不能决定唯一的出版书编号(除非出版社只出版过一本书,那我没话说?),则有出版书编号传递依赖于出版社地址。
5、关系范式
范式是符合某一种级别的关系模式的集合。
设计性能较优的关系模式称为规范化,规范化主要的理论依据是关系规范化理论。目的是消除插入、删除异常和数据冗余,提高数据库性能。
一般而言,我们只要让数据库中的所有表符合第三范式或者BCNF即可。
数据冗余
数据冗余是指各个数据文件中存在重复的数据。会导致:
- 浪费存储空间,降低检索效率
- 潜在的数据不一致性
在文件管理系统中各数据文件中难免有许多数据相互重复,数据的冗余度比较大。数据库系统更注重文件之间的联系。数据库系统中的数据具有共享性,因而尽可能地避免了数据的重复存储,减少和控制了数据的冗余。
然而,DBS中也不是不存在数据冗余的现象。当存在传递依赖或者部分依赖时,必然会出现数据冗余现象,我们要依据关系范式进行数据表分解,从而减轻冗余。
第一范式1NF(原子性)
表中的每一列都是不可分解的基本数据项,每一个属性不可拥有多个值。是关系数据库的基本要求。需要满足原子性。
第二范式2NF(消除部分依赖)
前提是满足1NF。此外:一个表必须有主键,非主属性必须完全依赖于主键。(消除非主属性对主键的部分依赖)
第三范式3NF(消除传递依赖)
前提是满足2NF。此外:任意一个非主属性都不可传递依赖于主键。(消除非主属性对主键的传递依赖)(要求依赖右侧全部为候选键或者它的成员)
BC范式BCNF(主属性不能依赖于主属性)
前提是满足3NF。此外:不能存在主键的一部分被另一部分或者非主键的其它部分所决定。(消除所有部分依赖与传递依赖)(要求依赖右侧全部为候选键)
第四范式
要求把同一表内的多对多关系删除。
第五范式
从最终结构重新建立原始结构。
6、闭包
闭包指的是:由一个属性或者属性组直接或间接推导出的所有属性的集合。
求闭包的算法:循环迭代,每一次迭代过程中找到能够被当前闭包中的属性直接推出的属性加入到闭包中。直到无法加入新属性。
7、关系型数据库和非关系型数据库
数据库 类型 | 特性 | 优点 | 缺点 |
---|---|---|---|
关系型数据库:SQLite、Oracle、mysql | 1、关系型数据库,是指采用了关系模型来组织数据的数据库; 2、关系型数据库的最大特点就是事务的一致性; 3、简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。 |
1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解; 2、使用方便:通用的SQL语言使得操作关系型数据库非常方便; 3、易于维护:丰富的完整性:实体完整性、参照完整性和用户定义的完整性。大大减低了数据冗余和数据不一致的概率; 4、支持SQL,可用于复杂的查询。 |
1、为了维护一致性所付出的巨大代价就是其读写性能比较差; 2、固定的表结构; 3、不适合高并发读写需求; 4、不适合海量数据的高效率读写; |
非关系型数据库:MongoDb、redis、HBase | 1、使用键值对(也可以是文档形式、图片形式等)存储数据; 2、支持分布式; 3、一般不支持事务的ACID特性; 4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。 |
1、无需经过sql层的解析,读写性能很高; 2、基于键值对,数据没有耦合性,容易扩展; 3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,而关系型数据库则只支持基础类型。 |
1、不提供sql支持,学习和使用成本较高; 2、无事务处理,附加功能bi和报表等支持也不好; |
数据的持久存储,尤其是海量数据的持久存储,还是需要一种关系数据库。
参考资料:
1、https://blog.csdn.net/weixin_42023723/article/details/80876568
2、https://hillzhang1999.gitee.io/2020/05/29/shu-ju-ku-fu-xi-ji-yu-mysql/#toc-heading-39