第二部分 - 關(guān)系模型與語言 - 1 - 基本術(shù)語

在目前所使用的數(shù)據(jù)處理軟件中,關(guān)系數(shù)據(jù)庫管理系統(tǒng)(Relation Database Management System,RDBMS)占據(jù)了統(tǒng)治地位。它代表了第二代數(shù)據(jù)庫管理系統(tǒng),它是基于 E. F. Codd (1970)所提出的關(guān)系數(shù)據(jù)模型。在關(guān)系模型中,所有數(shù)據(jù)邏輯上被組織成 關(guān)系(表)結(jié)構(gòu)。每個(gè)關(guān)系都有自己的名稱,并由數(shù)據(jù)的一些命名 屬性(表中的列)所組成。每個(gè) 元組(表中的行)包含每個(gè)屬性的一個(gè)取值。關(guān)系模型的最大優(yōu)點(diǎn)在于其邏輯結(jié)構(gòu)簡單。但這種簡單的結(jié)構(gòu)卻有著可靠地理論基礎(chǔ),這正是第一代 DBMS 所欠缺的。

1.關(guān)系數(shù)據(jù)結(jié)構(gòu)

  • 關(guān)系(relation):關(guān)系是由行和列組成的表。
    RDBMS 要求用戶感知到的數(shù)據(jù)庫就是表。但需注意,這種感知只限于數(shù)據(jù)庫的邏輯結(jié)構(gòu),就是 ANSI-SPARC 結(jié)構(gòu)的外部層和概念層。它并不適用于數(shù)據(jù)庫的物理結(jié)構(gòu),數(shù)據(jù)庫的物理結(jié)構(gòu)是通過多種存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn)的。

  • 屬性(property):屬性是關(guān)系中命名的列。
    在關(guān)系模型中,用 關(guān)系 保存數(shù)據(jù)庫所描述對(duì)象的信息。關(guān)系用二維表表示,表中的每行對(duì)應(yīng)一個(gè)單獨(dú)的記錄,表中的每一列則對(duì)應(yīng)一個(gè) 屬性 。無論屬性如何排列,都是同一個(gè)關(guān)系,因此它所表達(dá)的意思也一樣。

  • 域(field):域是一個(gè)或多個(gè)屬性的取值集合。
    域在關(guān)系模型中起著至關(guān)重要的作用。必須給關(guān)系中的每一個(gè)屬性定義一個(gè)域。不同屬性可以互不相同,也可以讓兩個(gè)或兩個(gè)以上的屬性共用同一個(gè)域。

  • 元組(tuple):關(guān)系中的每一行稱為元組。
    關(guān)系的元素就是表中的行或者說是 元組。無論元組如何排列,都是同一個(gè)關(guān)系,因此所表達(dá)的意思也一樣。關(guān)系的結(jié)構(gòu)、域說明以及所有取值約束,統(tǒng)稱為關(guān)系的 內(nèi)涵(intension),它通常是固定的,除非關(guān)系的意義發(fā)生改變而需要加入另外的屬性。元組集稱為關(guān)系的 外延(extension)或 狀態(tài)(state),它經(jīng)常發(fā)生改變。

  • 維數(shù):關(guān)系的維數(shù)是指關(guān)系所包含屬性的個(gè)數(shù)。
    只有一個(gè)屬性的關(guān)系的維數(shù)為1,稱為 一元 關(guān)系或是一元組。有兩個(gè)屬性的關(guān)系稱為 二元 關(guān)系,有三個(gè)屬性的關(guān)系稱為 三元 關(guān)系,這之后的一般統(tǒng)稱為 n元 關(guān)系。關(guān)系的維數(shù)是關(guān)系 內(nèi)涵 的性質(zhì)之一。

  • 基數(shù):關(guān)系的基數(shù)指的是它所包含的元組的個(gè)數(shù)。
    反過來說,元組的個(gè)數(shù)稱為關(guān)系的基數(shù),在添加或刪除元組時(shí),基數(shù)就會(huì)發(fā)生改變?;鶖?shù)是關(guān)系 外延 的一個(gè)性質(zhì),它由給定時(shí)刻特定的關(guān)系實(shí)例所決定。

  • 關(guān)系數(shù)據(jù)庫(relational database):關(guān)系數(shù)據(jù)庫是具有不同關(guān)系名的規(guī)范化關(guān)系的集合。
    關(guān)系數(shù)據(jù)庫包含一組有合適結(jié)構(gòu)的關(guān)系。這種合適性稱為 規(guī)范化

可選術(shù)語

可選關(guān)系模型術(shù)語

2. 數(shù)學(xué)中的關(guān)系

假設(shè)有兩個(gè)集合 D1 和 D2,其中
![](http://latex.codecogs.com/gif.latex?D_1 = {1, 3, 5}, D_2 = {2, 4})
這兩個(gè)集合的笛卡爾積是一個(gè)有序?qū)Φ募希總€(gè)有序?qū)χ械牡谝粋€(gè)元素都是D1中的成員,第二個(gè)元素是D2中的成員,D1 X D2 包含了所有這樣的有序?qū)?。換一種表達(dá)方式就是,找出所有第一個(gè)元素來自 D1、第二個(gè)元素來自 D2 的元素組合。在這個(gè)例子中可以得出:
![](http://latex.codecogs.com/gif.latex?D_1 \times D_2 = {(2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)})
這個(gè)笛卡爾乘積的任何子集都是一個(gè)關(guān)系。例如,可以找到如下的一個(gè)關(guān)系 R:
![](http://latex.codecogs.com/gif.latex?R = {(2, 1), (4, 1)})
可以通過一些選擇條件來說明關(guān)系中將會(huì)有哪些有序?qū)Α@?,如果看出R是所有第二個(gè)元素為1的有序?qū)Φ募?,就能夠?qū)?R 表示成:
![](http://latex.codecogs.com/gif.latex?R = {x, y | x \in D_1, y \in D_2, y=1})
使用同樣的集合D1、D2,還可以形成另一種關(guān)系S,它包含所有這樣的有序?qū)?,其中第一個(gè)元素是第二個(gè)元素的兩倍。因此,可以將 S 表示如下:
![](http://latex.codecogs.com/gif.latex?S = {x, y | x \in D_1, y \in D_2, x=2y})
或者,用這個(gè)實(shí)例,
![](http://latex.codecogs.com/gif.latex?S = {(2, 1)})
因?yàn)樵谶@個(gè)笛卡爾積中只有一個(gè)有序?qū)M足此條件??梢院唵蔚貙㈥P(guān)系的概念擴(kuò)展到三個(gè)集合上。假設(shè)有三個(gè)集合D1,D2,D3。這三個(gè)集合的笛卡爾乘積將是所有這樣的有序三元組的集合,有序三元組從 D1 中取出第一個(gè)元素,從 D2 中取出第二個(gè)元素,從 D3 中取出第三個(gè)元素。這個(gè)笛卡爾乘積中的任何子集也是一個(gè)關(guān)系。例如,假設(shè)有:
![](http://latex.codecogs.com/gif.latex?D_1 = {1,3}, D_2 = {2,4}, D_3 = {5,6})
![](http://latex.codecogs.com/gif.latex?D_1 \times D_2 \times D_3 = {(1, 2, 5), (1, 2, 6), (1, 4, 5), (1, 4, 6), (3, 2, 5), (3, 2, 6), (3, 4, 5), (3, 4, 6)})
這些有序三元組的任何子集都是一個(gè)關(guān)系??梢岳^續(xù)將三集合擴(kuò)展,從而定義 n 個(gè)域上的一般關(guān)系。設(shè)D1,D2.....Dn 為 n 個(gè)集合。它們的笛卡爾乘積定義如下:
![](http://latex.codecogs.com/gif.latex?D_1 \times D_2 \times \cdot \cdot \cdot \times D_n = {(d_1, d_2, \cdot \cdot \cdot ,d_n)|d_1 \in D_1, d_2 \in D_2, \cdot \cdot \cdot ,d_n \in D_n})
通常被表示成:
![](http://latex.codecogs.com/gif.latex?\prod_{i=1}^{n} D_1)
這個(gè)笛卡爾積中任何 n 元組的子集都是這 n 個(gè)集合上的一個(gè)關(guān)系。注意,為了定義這些關(guān)系,必須對(duì)取值集合(即)進(jìn)行說明。

3. 數(shù)據(jù)庫中的關(guān)系

將上面所介紹的概念應(yīng)用到數(shù)據(jù)庫當(dāng)中,就可以定義關(guān)系模式。

  • 關(guān)系模式:用一組屬性和域名對(duì)定義的具名的關(guān)系。
  • 關(guān)系數(shù)據(jù)庫模式:關(guān)系模式的集合,集合中的每個(gè)關(guān)系都應(yīng)有不同的名字。

4. 關(guān)系的性質(zhì)

一個(gè)關(guān)系通常有如下性質(zhì):

  • 有一個(gè)關(guān)系名,同一關(guān)系模式中各關(guān)系不能重名。
  • 關(guān)系中的每一個(gè)單元格都確切包含一個(gè)原子(單個(gè))值。
  • 每個(gè)屬性都有一個(gè)不同的名字。
  • 同一屬性中的各個(gè)值都取自相同的域。
  • 各元組互不相同,不存在重復(fù)元組。
  • 屬性的順序并不重要。
  • 理論上講,元組的順序也不重要(但實(shí)際上,這個(gè)順序?qū)⒂绊憣?duì)元組的訪問效率)。

現(xiàn)在說明這些限制的含義,關(guān)系不能包含重復(fù)組。滿足這一性質(zhì)的關(guān)系稱為 規(guī)范化 關(guān)系或 第一范式 關(guān)系。
關(guān)系的大部分特有性質(zhì)都源于數(shù)學(xué)中關(guān)系的性質(zhì):

  • 當(dāng)用簡單的、單值元素(如整數(shù))的集合導(dǎo)出笛卡爾積時(shí),每個(gè)元組中的所有元素都是單值的。類似的,關(guān)系的每個(gè)單元格中也只包含一個(gè)單值。但數(shù)學(xué)意義上的關(guān)系無需規(guī)范化。Codd 強(qiáng)調(diào)不允許重復(fù)組的出現(xiàn)是為了簡化關(guān)系數(shù)據(jù)模型。
  • 在數(shù)學(xué)關(guān)系中,某一位置的可能取值由定義該位置的集合或域來決定。對(duì)應(yīng)的,在表中每一列的取值必須源自相同的屬性域。
  • 集合中沒有重復(fù)元素。同樣,關(guān)系中沒有重復(fù)的元組。
  • 因?yàn)殛P(guān)系是用集合定義的,集合中元素的順序無關(guān)緊要,因此,關(guān)系中元組的順序也就沒有實(shí)質(zhì)意義了。

但在數(shù)學(xué)關(guān)系中,元組中各個(gè)元素的順序是很重要的。例如,有序?qū)Γ?,2)與有序?qū)Γ?,1)就大不相同。而對(duì)于關(guān)系模型中的關(guān)系則不一樣,它明確要求屬性的順序不具備實(shí)際意義。原因就在于每一列的標(biāo)題一說明了該列的值對(duì)應(yīng)哪個(gè)屬性。這就意味著,關(guān)系內(nèi)涵中列標(biāo)題的順序無關(guān)緊要,不過一旦選定了關(guān)系的結(jié)構(gòu),其外延中元組的元素順序就必須與屬性名的順序相一致。

5. 關(guān)系關(guān)鍵字

如前所述,關(guān)系中不會(huì)出現(xiàn)重復(fù)的元組。因此,可以指定一個(gè)或多個(gè)屬性(稱為關(guān)系關(guān)鍵字),唯一的標(biāo)識(shí)關(guān)系中的每個(gè)元組。如下所示關(guān)系Branch和關(guān)系Staff的實(shí)例:

關(guān)系Branch和關(guān)系Staff實(shí)例
  • 超關(guān)鍵字(superkey):一個(gè)屬性或?qū)傩约?,它能唯一地?biāo)識(shí)出關(guān)系中的每個(gè)元組。
    超關(guān)鍵字能唯一標(biāo)識(shí)關(guān)系中的每個(gè)元組。但超關(guān)鍵字中有可能包含多余屬性,但在一般情況下,人們僅對(duì)能唯一標(biāo)識(shí)元組的最小屬性集合感興趣。

  • 候選關(guān)鍵字(candidate key):本身是超關(guān)鍵字但其任何子集都不在是超關(guān)鍵字。
    關(guān)系 R 中的候選關(guān)鍵字 K 有兩條性質(zhì):

    • 唯一性:R 中的每個(gè)元組在 K 上的值都可以唯一的標(biāo)識(shí)該元組。
    • 不可約性:K 中的任一真子集都不具備唯一性。

    一個(gè)關(guān)系中可能會(huì)有多個(gè)候選關(guān)鍵字。當(dāng)一個(gè)關(guān)鍵字中包含多個(gè)屬性時(shí),就稱它為 合成關(guān)鍵字??紤]上圖所示的關(guān)系 Branch。給定一個(gè) city 屬性的值,可以確定出幾個(gè)分公司(例如,在 London 有兩個(gè)分公司)。這個(gè)屬性不能作為候選關(guān)鍵字。另一方面,因?yàn)?DreamHome 給每個(gè)分公司分配了唯一的分公司編號(hào),那么給定的一個(gè)分公司編號(hào)值 branchNo,則可以確定至多一個(gè)元組,因此 branchNo 就是一個(gè)候選關(guān)鍵字。同樣,postcode 也是這個(gè)關(guān)系中的候選關(guān)鍵字。

    現(xiàn)在假設(shè)有關(guān)系 Viewing,它包含客戶查看房產(chǎn)的相關(guān)信息。這個(gè)關(guān)系中包括客戶編號(hào)(clientNo)、房產(chǎn)編號(hào)(propertyNo)、查看日期(viewDate),還有一個(gè)可選擇填寫的屬性——對(duì)房產(chǎn)的評(píng)論(comment)。給定一個(gè)客戶編號(hào) clientNo,他可能查看過幾處不同的房產(chǎn),所以會(huì)有幾條記錄與之對(duì)應(yīng)。同樣,給定一個(gè)房產(chǎn)編號(hào) propertyNo,也可能會(huì)有多個(gè)客戶看過該房產(chǎn)。因此,clientNo 和 propertyNo 都不能單獨(dú)地作為候選關(guān)鍵字。但如果把 clientNo 和 propertyNo 結(jié)合起來,則至多可標(biāo)識(shí)一個(gè)元組,因此,對(duì)于 Viewing 關(guān)系而言,clientNo 和 propertyNo 一起形成了一個(gè)(組合)候選關(guān)鍵字。如果允許客戶對(duì)同一房產(chǎn)查看多次,則可以在組合關(guān)鍵字中添加 viewDate 屬性。

    注意,一個(gè)關(guān)系實(shí)例無法證明某個(gè)屬性或某幾個(gè)屬性的組合能否作為候選關(guān)鍵字。事實(shí)上,在某個(gè)特定時(shí)刻,沒有重復(fù)出現(xiàn)的值并不能保證永遠(yuǎn)不重復(fù)。但在一個(gè)關(guān)系實(shí)例中就出現(xiàn)重復(fù)值的屬性或?qū)傩越M合肯定不能作為候選關(guān)鍵字。確定候選關(guān)鍵字時(shí),必須明確這些屬性在 “現(xiàn)實(shí)世界” 中的含義,從而確保不會(huì)出現(xiàn)重復(fù)。只有通過這種語義信息才能確定一種屬性組合是否可以作為候選關(guān)鍵字。例如,在 Staff 關(guān)系中,可能認(rèn)為lName(姓氏)適合作為關(guān)系 Staff 的候選關(guān)鍵字。顯然,在關(guān)系 Staff 的這個(gè)實(shí)例中雖然只有一個(gè)姓 White 的員工,但完全可能會(huì)有一個(gè)同樣姓 White 的新員工加入公司,那時(shí) lName 作為候選關(guān)鍵字就無效了。

  • 主關(guān)鍵字(Primary key):被選用于唯一標(biāo)識(shí)關(guān)系中各元組的候選關(guān)鍵字。
    因?yàn)殛P(guān)系中沒有重復(fù)元組,所以總可以唯一的標(biāo)識(shí)出每一行。這就意味著,每個(gè)關(guān)系總有一個(gè)主關(guān)鍵字。最糟糕的情況是屬性全集作為主關(guān)鍵字,但一般都存在某個(gè)稍小的子集足以標(biāo)識(shí)每個(gè)元組。沒有被選為主關(guān)鍵字的候選關(guān)鍵字稱為 可替換關(guān)鍵字(alternate key)。如果在關(guān)系 Branch 中選擇 branchNo作為主關(guān)鍵字,postcode 就成了可替換關(guān)鍵字。對(duì) Viewing 關(guān)系而言,它只有一個(gè)候選關(guān)鍵字,即 clientNo 與 propertyNo 的組合,因此這兩屬性的組合就自動(dòng)地形成了主關(guān)鍵字。

  • 外部關(guān)鍵字(Foreign key):當(dāng)一個(gè)關(guān)系中的某個(gè)屬性或?qū)傩约吓c另一個(gè)關(guān)系(也可能就是自己)的候選關(guān)鍵字匹配時(shí),就稱這個(gè)屬性或?qū)傩约蠟橥獠筷P(guān)鍵字。
    當(dāng)一個(gè)屬性出現(xiàn)在兩個(gè)關(guān)系中時(shí),它往往表示這兩個(gè)關(guān)系中對(duì)應(yīng)元組之間的某種聯(lián)系。例如,屬性 branchNo 同時(shí)出現(xiàn)在關(guān)系 Branch 和 Staff 中,目的就是將每個(gè)分公司與在此分公司工作的員工聯(lián)系起來。在關(guān)系 Staff 中,branchNo 就是一個(gè)外部關(guān)鍵字?;蛘哒f關(guān)系 Staff 中的屬性 branchNo 指向 主關(guān)系 Branch 的 主關(guān)鍵字 ——屬性 branchNo。這些公有屬性在執(zhí)行數(shù)據(jù)操作時(shí)將扮演重要角色。

6. 關(guān)系數(shù)據(jù)庫模式的表示

關(guān)系數(shù)據(jù)庫是由一些規(guī)范化關(guān)系所組成的。對(duì)應(yīng) DreamHome 案例的部分關(guān)系模式如下:

relation property
Branch (<u>branchNo</u>, street, city, postcode)
Staff (<u>saffNo</u>,fName, lName, position, sex, DOB, salary, branchNo)
PropertyForRent (<u>propertyNo</u>, street, city, postcode, type, rooms, rent, ownerNo, staffNo, branchNo)
Client (<u>clientNo</u>, fName, lName, telNo, prefType, maxRent, eMail)
PrivateOwner (<u>ownerNo</u>, fName, lName, address, telNo, eMail, password)
Viewing (<u>clientNo</u>, <u>propertyNo</u>, viewDate, comment)
Registration (<u>clientNo</u>, <u>branchNo</u>, staffNo, dateJoined)

關(guān)系模式的習(xí)慣表示法是,給出關(guān)系名,并在后面的圓括號(hào)中列出關(guān)系的屬性名。一般用下劃線標(biāo)出主關(guān)鍵字。概念模型(或者說概念模式)是指數(shù)據(jù)庫中所有這種模式的集合。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容