周末阴雨连绵,在家闲来无事,抽空读了《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这位受过专业训练的数学家发现,数学可以为数据库管理领域注入严谨。他建立的关