数据库关系模型和关系运算[姊妹篇.第三弹]
随着ORM框架的日益流行,如今的码农们直接操作数据库语法的越来越少了,一顿orm语法操作猛如虎,一遇问题问题便靓仔语塞。这种情况不在少数,就如我的工作中,我所知道的同事和实习生当中,就有不少人非常喜欢linq语法以及lamda表达式来满足日常的db操作。
然而,常在河边走,哪有不湿鞋,经常一堆linq连表操作下来遇到一系列问题,又或者是要求其编写一些sql函数来解决相关复杂问题,便无从下手。嗯?不太会玩sql语法了,跟你这关系运算有啥关系?嗯,接着看。
▲图/ 来源网络
关系模型概念
首先针对这些名词抛出疑问,到底什么叫关系?啥叫关系模型?啥又叫关系代数?
关系:我们对它的解释是这样的,所谓关系,就是一张表。表的各列以属性开始,属性是列的入口。
关系模型:关系模型用一种称为“关系”的二维表来表示数据。通俗的讲就是说,一张表就可以泛指一个关系模型,表与表之间的又存在关系。关系模型也就是数据模型,也可以称为表与表之间的关系。
属性:属性就是关系(表)的标题栏中各列的名字(也成为字段名)。
元组:除了关系的标题栏以外,其他各行统称为“元组”,也就是每一行行的数据。
域: 关系模型要求每个元组的每个分量都是原子的,即必须属于某种基本类型,如整型或字符串型,而不允许一个值的结构、集合、列表、数组或者能分解为更小分量的其他任何类型。通俗的讲就是每一个表的字段都有一种类型声明,它可能是string、int、text,double等其中的一种。
▲图/ 来源网络
关系代数
我们了解数据库中的关系模型,也就是数据表的一些定义,那么我们是不是需要对关系表进行操作来满足用户需要的表现层数据?那么啥又叫关系代数呢?
▲图/ 来源网络
关系代数:关系代数是一种抽象的查询语言,用来对关系的运算来表达查询,作为研究关系数据语言的数学工具。就是说关系代数是我们对表的的查询来满足用户所需要的表现层。
关系代数中包括了:并、交、差、乘、选择、投影、联接、除、自然联接等操作。那这些关系代数中的名词我们又是怎样理解呢?
普通集合运算并、交、差这么几种:R∪S,R和S的并集,R∩S,R和S的交集,R—S,R和S的差。
在操作数据语法当中,我们对针对大量的数据中筛选用户需要的数据,就会用到这么几种运算:
选择运算:选择运算会删除某些行(元组),选择运算符号是σ,该运算作用于关系R将产生一个新关系S(类似加条件查询)。
投影运算:投影运算会删除某些列。投影运算符号是π,该运算作用于关系R将产生一个新关系S。(类似选择列查询)。
笛卡尔积:两个关系R和S的笛卡尔积记作R × S,它是一个新的关系,其关系模式是R和S的并集。
这个怎么来理解呢,我们用一组sql来示例:select * from table1 , table2。
自然连接:两个关系R和S的自然连接,记作R⋈S。(只有两个关系的元组所在公共属性上取值相同,才可以将他们的组合放入两个关系的自然连接中)。
例如:select * from student natural join score。此种连接也不需要 ON这种条件,直接会将公共属性相同的数列检索出来。
关系演算
关系演算,把数理逻辑中的谓词演算应用到关系中的谓词演算应用到关系中,就是所谓的关系演算。以元组为变量称为元组关系演算,而以域为变量,则称为域关系演算。
关系演算要怎么来理解呢?首先我们知道这么几种谓词:GET,PUT,HOLD,UPDATE,DELETE,DROPGET。第一种是信息查询,后面几种是更新作用。以下将给出几个关系演算的例子。
当我们想要查询学生的分数时,则可有表达式如下:
GET W (student.score)
查询计算机科学系(CS)学生的学号、年龄,结果按年龄降序排序:
GET W (student.sno,student.sage): student.sdept='CS' DOWN student.sage
其中:排序关键字:UP升序 DOWN降序.
查询选修2号课程的学生名字:
RANGE SC X GET W (student.sname): 存在X (X.sno=student.sno∧X.cno=2)
好了,数据库的关系模型和关系代数相关的内容就此交代了,如果伙伴们熟练的话,在你手动操作数据库的时候便会清楚何时情况下利用关系代数巧妙的检索出用户表现层的数据。在我的工作中,其实很多问题直接可以通过一组sql解决的,我本人也是比较喜欢写一些sql函数去解决更多复杂的实际场景问题。
▲图/ 来源网络
那么接下来的篇章就会面向查询优化了,我相信一些简单的crud查询语法大家都是熟练的,所以我们就谈谈数据库的性能优化。那么我将提前抛出几个问题:
1.返回表中0.014%的数据应不应该走索引?
2.什么样的列必须建立索引呢?
3.嵌套查询、HASH连接、排序合并连接、笛卡尔连接等怎样玩能达到最优?
4. IN 与EXISTS 谁快谁慢?