深入学习关系理论

周末阴雨连绵,在家闲来无事,抽空读了《Database In Depth: Relational Theory for Practitioners》这本评价不错的关系理论书的开篇。作者C.J.Date是关系理论之父Codd的好友,所以对关系理论的理解是足够深入的。甚至在开篇不久,作者就提到了与Codd理念不合的地方,比如关于NULL的合理性,关于Domain与Type的等价性等。


1.SQL不等于关系模型!

在关系理论中,一般常用的术语是关系(Relation)、元组(Tuple)、属性(Attribute)。在SQL中为了方便用户理解,术语常用表(Table)、行(Row)、列(Column)。然而真相却是关系不是表,元组不是行,属性也不是列。如果你真的理解关系理论,这种术语互换可能没什么坏处。可是如果你只是通过SQL学到了关系理论的皮毛,这种类比会让你对真正的关系模型产生误解。

另一个例子就是关系模型中的关系是基于集合的,可SQL却允许重复的行出现在表中。而且投影(Project)操作也不会产生集合,而是保留重复的值,需要显示声明SELECT DISTINCT ...才能得到真正的集合。此外,属性在关系中也是无序,同样因为关系是基于集合的,然而在SQL中列却是有顺序的。种种细节都能看出,SQL定义的规范确实与正统的关系理论有很大出入。


2.真正的关系理论

1968年,Codd这位受过专业训练的数学家发现,数学可以为数据库管理领域注入严谨。他建立的关系理论最初包含三部分:结构(Structure)、完整性(Integrity)和操作(Manipulation)。下面简单快速地介绍一下这三部分的内容:

  1. 结构:定义了关系以及键(Candidate Key),包括主键(Primary Key)和外键(Foreign Key)。
  2. 完整性:主要是实体完整性和引用完整性,即主键不允许为NULL,以及外键不能引用一个不存在的键值。
  3. 操作:包括关系代数(Relational Algebra)和关系赋值。前者关系代数最早由8个运算符组成。

关于关系的操作最重要的一点就是所有运算都具有闭包属性(Closure Property),即每个操作的返回值都还是一个关系。所以运算符可以简单定义为,入参是1个或以上的关系,返回值则是确定的1个关系。正是基于闭包的性质,我们可以任意嵌套使用关系运算符,组成关系代数的表达式。


3.模型与实现

关系理论中重要的一点就是模型(Model)与实现(Implementation)的严格区分。就像软件架构时能在不同的抽象层级上设计一样,如果能在逻辑模型与物理实现之间切换思考,也是一种很强的能力。学习关系理论时需要这种能力,克制自己去思考底层实现。比如表是如何保存在硬盘和内存中的,如何构建索引来高效查询,JOIN如何高效地实现等等。有了模型与实现的分离,关系理论提出了数据独立性(Data Independence),即背后物理、算法等实现上的变化不应该被用户察觉。

介绍了这种理念后,作者画龙点睛,给出了关系理论中的关系模型的定义:“数据模型是一个抽象的、自包含的、数据结构和操作的逻辑定义,一起构成了一台与用户交互的抽象机器(Abstract Machine)”。从这一层含义上来说,关系模型就是语言,就像软件设计中的API和接口,是提供给用户来操作的语言层。而另一层含义就是,用户通过关系模型(语言)定义好的每个关系模型(实例),就像用编程语言写好的一个个程序一样


4.关系变量

如果前面的概念你都了如指掌,那么关系变量(Relation Variable或RelVar)一定会让你耳目一新。其实,当我们执行CREATE TABLE T时,这就像在传统的编程语言中执行了DECLARE T INTEGER,都只是变量的定义。唯一区别就是一个是关系变量,一个是整数变量。

相信大家对变量和值的概念区分都不陌生,刚开始学编程时最基础的一项应该就是区分变量和值,学会使用变量。从概念上来讲,值是不可改变的常量。值在时间和空间上都是不存在的,它只可以通过某种形式表示来保存在某个位置,比如通过二进制编码保存到内存。而变量是值的表示的容器。

对于整数变量来说,真正的变量值当然就是整数,而关系变量的值自然就是关系。每当我们改变关系时,其实都是在给关系变量重新赋值。例如,我们执行DELETE FROM T WHERE city = 'Athens',就相当于是在给关系变量T重新赋值T := T WHERE NOT (CITY = 'Athens')。而INSERTUPDATE也是类似的,这也就是为什么前面我们介绍关系的操作时,只要一个赋值运算符就够了。


5.理论的重要性

达芬奇:“那些热衷于实践而忽视理论的人,就像是没有方向舵或指南针就出航,永远不确定他将要到哪。实践应该总是基于扎实的理论知识之上”。正所谓“学而不思则罔,思而不学则殆”,本书作者说:如果你对关系理论的了解都来自于SQL,那恐怕你对关系理论的理解还没达到你应该或者以为的水平。所以,理论能学到多好就学到多好,永远别以为自己学透了。学到的知识,它总会在你不经意间派上用场。

发布了347 篇原创文章 · 获赞 1615 · 访问量 406万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览