SQL——關係模型
上一篇文章中介紹過資料庫模型共有四種:關係模型,ER模型,基於物件的資料模型,半結構化模型。這四種模型中,最為常用和流行的就是關係模型,SQL語言所支援的資料庫產品就基於關係模型。關係模型利用表的集合來表示資料和資料之間的關係。
關係資料庫的結構
關係資料庫由表(table)的集合構成,每張表有自己唯一的名字,每張表有很多行和列。在關係模型中,定義了專業的術語來表示上述概念,用“關係”(relation)來指代表,而用“元組”(tuple)來指代行,用“屬性”(attribute)來指代表中的列。類似地,採用了關係例項(relation instance)這個名詞來表示一個關係的特定例項,也就是所包含的一組特定的行。當下面涉及到以上名詞時,我們將採用“關係”,“元組”來做解釋,而捨棄了容易讓人混淆的”表”、”行”這些名詞。
元組與屬性是順序無關的
由於關係是元組的集合,所以元組在關係中出現的順序是無關緊要的。因此,無論關係中的元組是被按照某種情況被排列出先後的還是無序的都是沒關係的。屬性是表示關係中的元組取值的標識,屬性在關係中顛倒位置,只會影響元組存放數值的先後,而不會改變實際的內容。所以,和元組相同,在關係中屬性出現的順序是無關緊要的。
在某些資料庫中存放值時需要按照屬性的順序存放內容,這種方式更加便捷靈活,但實際上關係資料庫並沒有對屬性的順序做任何要求。
域是原子的
對於關係的每個屬性,都存在一個允許的取值集合,稱為該屬性的”域“(domain)。換言之,域的作用類似於值域,限定了一個變數取值的範圍。比如我們將age的域設定為0至150,薪水的域設定為>0,這是比較合理的做法。我們要求對所有關係R而言,R的所有屬性的域都是原子的。如果域中元素被看作是不可再分的單元,則域是原子的
舉個例子,比如一張User表中,一個元組的phone_number屬性中存放了多組聯絡電話號碼,那麼這個域就不再是原子的,因為其中的元素是一組 電話號碼,是可以被再分為單個電話號碼這樣的子成分。
當域中的值被確定時,它就能且僅能是一個確定值,而不能是多個值。比如0至100中的任意一個整數,當取出其中一個整數50時,我們認為這個域是原子的,值為50。但如果我們將{50,99}存放其中,想表示這個元組的該屬性值可取50或99時便違反了域的原子性。
空值的特殊性
”空值“(null)是一個特殊的值,null可以用來表示為”未知,不存在“。在資料庫中,一個boolean型別的判斷屬性除了true或false還可以取null值,表示我們不清楚它的真假性。這是一種三值判斷的做法,讓資料具有更多的靈活性。但是在資料庫的操作中,空值會給查詢和更新帶來很多困難,因此應該儘量避免使用空值。
關係資料庫的模式
當我們談論資料庫的時候,必須先區分資料庫模式(database schema)和資料庫例項(database instance)前者是資料庫的邏輯設計,後者是給定時刻中資料庫的一個快照。
這樣說起來可能有些難以理解,簡單的說,schema(資料庫模式)類似代表著資料庫中一張表的表頭欄,也就是所有屬性的集合。而instance(資料庫例項)表示著這個時刻這張表中的某一個元組,之所以強調時間是因為在每個時間點可能表中資料有變化。
碼/鍵
因為表具有集合的特性,所以在一張表中每個元組都是獨一無二的。我們使用每一個元組的一些屬性來表示他們的不同。這也就是說,一個元組的屬性必須是能唯一區分元組的。
超碼
超碼是一個或多個屬性的集合,這些屬性的組合可以使我們在一個關係中唯一的標識一個元組。比如一個User的表中,我們可以使用ID_card(身份證號碼)這個資訊來標識這個元組。在整張表中不可能存在另一個元組與該元組ID_card屬性數值相同的情況。超碼不是唯一的,只要可以用來唯一的表示出這個元組的屬性的集合都可以是該元組的一個超碼。
候選碼
超碼有很多,但我們並不對所有的超碼都感興趣。有的時候,我們只對其中最能表示出這個元組特性的屬性集感興趣。所以,我們用候選碼這個名詞來表示最小的超碼。
主碼/主鍵
主碼錶示設計資料庫的設計者選中的,用來在一個關係中區分不同元組的超碼。主碼並沒有嚴格的規定,主碼的選取很大程度上收到設計者思路的影響。
外碼/外來鍵
一個關係r1可能在它的屬性中包含了另一個關係r2的主碼。這個時候,在r1中這個r2主碼的屬性被稱作外碼。關係r1也稱為外碼依賴的參照關係,關係r2稱為外碼的被參照關係。