天天看點

《SQL與關系資料庫理論——如何編寫健壯的SQL代碼》一2.1 類型和關系

本節書摘來華章計算機《sql與關系資料庫理論——如何編寫健壯的sql代碼》一書中的第2章 ,第2.1節 c. j. date 著 單世民 何英昊 許侃 譯 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

資料類型(簡稱為類型)在計算機科學中是很重要的概念。關系理論尤其要求一個類型理論支撐,因為關系定義在類型之上;即,每個關系的每個屬性都定義為某種類型(對于關系變量也是如此)。比如,本書中假設供應商關系變量s的屬性status定義為integer類型。在此假設下,作為關系變量s可能取值的每個關系都必須也具有類型為integer的status屬性。這又意味着這些關系中的每個元組也必須具有類型為integer的status屬性,進而又意味着每個元組必須有一個整數的status取值。.

本章中稍後部分會讨論這些問題。現在隻讨論:關系化屬性可以是任何類型(有一些重要的例外,稍後再叙),這意味着類型可以是任意複雜的。尤其是,這些類型可以是系統定義的,也可以是使用者定義的。然而,本書中不會過多涉及使用者定義類型,因為:

使用者定義類型的關鍵(從僅使用類型的使用者視角而不是定義這些類型的使用者視角)是,它們要在各方面表現得和系統定義類型一樣。

相對很少的使用者會遇到定義類型的工作,而且類型定義并不真正包含任何特别的關系化考慮因素。

是以,從本章開始,除非是上下文特殊要求,否則都可以使用類型來專門表示系統定義類型。關系模型隻規定了一個類型——boolean(所有類型中最為基礎的類型)。boolean類型隻包含兩個值:具體地說是兩個真值,分别代表字面值true和false。當然,真實的系統還會支援其他的多種系統定義類型,為了明确本書會假設支援的類型中包括integer(整數)、rational(有理數)和character(任意長度字元串)。注意:稍後會在本章特别讨論sql支援的系統定義類型。

旁注:有理數是可以表達為兩個整數之比的數(比如,3/8、5/12、-4/3);無理數是不能如此表達的數(比如,,)。有理數(隻)有一個性質——以十進制表示,有理數的小數部分可以表示為:(a)數字的有限序列并後續(可以無損忽略的)0的無限序列(比如3/8=0.375000…);(b)可能為空的數字有限序列後續另一個無限重複的有限數字序列,而兩個序列中的第一個是不為0的(比如5/12=0.4166666)。相反,以十進制表示的無理數小數部分由數字的無限不重複序列構成(比如,=3.14159…,=1.41412…)。實數是要麼為有理數要麼為無理數的數。很多程式設計語言目前都支援所謂的real數值類型;然而,計算機是有限的,它真正能夠表示的實數本質上是有理數。是以,tutorial d選擇關鍵字rational。

為了準确性,我要說明一下:在第一次定義關系模型的時候,codd說關系是定義在域(domain)之上而不是定義在類型之上的。然而,域事實上和類型完全是一回事。你可以認為此聲明是我個人立場的陳述,然而我要列出一系列支援此立場的論證。我會從codd原始定義的關系模型開始;是以,我會在進一步的提示之前使用域而不使用類型。我想在下面兩節中主要讨論兩個主題:

相等性比較和“域檢查重載”:希望此部分讨論會讓你确信域實際上就是類型。

資料值原子性和第一範式:希望此部分會讓你确信類型是可以任意複雜的。