深入學習關係理論

週末陰雨連綿,在家閒來無事,抽空讀了《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,那恐怕你對關係理論的理解還沒達到你應該或者以爲的水平。所以,理論能學到多好就學到多好,永遠別以爲自己學透了。學到的知識,它總會在你不經意間派上用場。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章