第二部分 - 關(guān)系模型與語言 - 5 - 關(guān)系演算

在關(guān)系代數(shù)表達(dá)式中,一般都顯式指定一個(gè)計(jì)值順序,它隱含著執(zhí)行查詢的策略。在關(guān)系演算中,不描述查詢執(zhí)行策略,即關(guān)系演算表達(dá)查詢只說明要什么,不說明如何得到它。

關(guān)系演算跟數(shù)學(xué)中的微積分無關(guān),而是根據(jù)符號(hào)邏輯中的一個(gè)分支—— 謂詞演算 命名的。在數(shù)據(jù)庫中,它有兩種形式:由 Codd(1972a)首先提出的元組關(guān)系演算,由 Lacroix 和 Pirotte(1977)提出的 關(guān)系演算。

在一階邏輯或謂詞演算中,謂詞是一個(gè)帶參數(shù)的真值函數(shù)。如果把參數(shù)值帶入,這個(gè)函數(shù)就會(huì)變成一個(gè)表達(dá)式,稱為 命題,它非真即假。例如,“John White 是一名員工” 和 “John White 的收入高于 Ann Beech” 這兩個(gè)語句都是命題,因此可以確定他們是真還是假。在第一個(gè)例子里,函數(shù)為 “是一名員工”,帶有一個(gè)參數(shù)(John White);在第二個(gè)例子中,函數(shù)為 “收入高于”,它有兩個(gè)參數(shù)(John White 和 Ann Beech)。

如果某個(gè)謂詞包含一個(gè)變量,比如,“x 是一名員工”,那么就一定有一個(gè)與 x 相關(guān)聯(lián)的 論域(range)。當(dāng)我們把該論域中的某些值賦給 x 時(shí),命題可能為真;而對(duì)于另一些值,命題則可能為假。例如,論域是所有人的集合,若將 John White 帶入 x,則命題 “John White 是一名員工” 為真。若將某個(gè)非員工的人名帶入,則命題為假。

假設(shè) P 是一個(gè)謂詞,那么所有使 P 為真得 x 的集合就可以表示成:


可以用邏輯連詞與,或,非連接謂詞形成符合謂詞。

1. 元組關(guān)系演算

在元組關(guān)系演算中,我們感興趣的是找出所有使謂詞為真得元組。這種演算是基于 元組變量 的。元組變量是 “定義于” 某個(gè)命名關(guān)系上的變量,即該變量的論域僅限于這個(gè)關(guān)系中的元組(“論域” 這個(gè)詞在這里不是指數(shù)學(xué)中的值域,而是定義域)。例如,指定元組變量 S 的范圍為關(guān)系 Staff,就寫成:

要表示 “找出所有使 F(S) 為真得元組 S 構(gòu)成的集合” 這樣一個(gè)查詢,可以表示為:

F 稱為 公式(在數(shù)理邏輯中稱為 合式公式wff)。例如,要表示查詢 “列出收入高于 10000 英鎊的所有員工的 staffNo、fName、lName、position、sex、DOB、salary 及 branchNo”,可以寫成:

S.salary 代表元組變量 S 在 salary 屬性上的取值。如果想獲取某個(gè)特定的屬性,如 salary,就可以寫成:

存在量詞與全稱量詞

可以在公式中使用兩個(gè)量詞來說明謂詞將作用在多少個(gè)實(shí)例上。

存在量詞 “?”(表 “存在”)在公式中說明至少有一個(gè)實(shí)例使謂詞為真,例如:

表示 “在 Branch 中存在一個(gè)元組,它在 branchNo 上的取值與 Staff 的元組 S 在 branchNo 上的取值相同而且對(duì)應(yīng)的分公司位于倫敦”。

全稱量詞 “?”(表示 “對(duì)于所有的”)在公示中說明每個(gè)實(shí)例都必須滿足這個(gè)謂詞,例如:

表示 “Branch 中的所有分公司都不再巴黎”??梢詫⒌隆つΩ赏茝V到存在量詞和全稱量詞。例如:





利用這些等價(jià)規(guī)則,可以把前面的公式寫成:


表示 “巴黎沒有分公司”。

受 “?” 或 “?” 約束的元組變量稱為 約束變量,反之,其他的元組變量則成為 自由變量。在關(guān)系演算表達(dá)式中,只有那些在豎線(|)左邊出現(xiàn)的變量是自由變量。

表達(dá)式和公式

正如并不是任意排列的英文字母序列都可以構(gòu)成一個(gè)結(jié)構(gòu)正確的詞語一樣,也不是每一個(gè)演算公式序列都可以被接受。公式序列必須是無歧義且有意義的。元組關(guān)系演算中的一個(gè)表達(dá)式必須具有下面所示的一般形式:

其中,S1,S2,...,Sn,...,Sm 代表元組變量,每個(gè) ai 是元組變量 Si的論域關(guān)系的一個(gè)屬性,F(xiàn) 為公式。一個(gè)(合式)公式包括一個(gè)或多個(gè)原子公式,原子公式可以有下面幾種形式:

  • R(Si),其中 Si 是一個(gè)元組變量,R 是一個(gè)關(guān)系。
  • Si.a1 θ Sj.a2,其中 Si 和 Sj 為元組變量,a1 是元組變量 Si 的論域關(guān)系的一個(gè)屬性,a2 是元組變量 Sj 的論域關(guān)系的一個(gè)屬性,θ 是比較運(yùn)算符中的一個(gè)。屬性 a1 和 a2 的值必須可進(jìn)行 θ 比較。
  • Si.a1 θ c,其中 Si 是一個(gè)元組變量,a1 是元組變量 Si 論域關(guān)系的一個(gè)屬性,c 是屬性 a1 對(duì)應(yīng)域內(nèi)的一個(gè)常數(shù),θ 是一個(gè)比較運(yùn)算符。

可以根據(jù)下面的規(guī)則,遞歸的構(gòu)造出公式:

  • 原子公式是公式。
  • 如果 F1 和 F2 是公式,則它們的合取 F1 ∧ F2 、析取 F1 ∨ F2,以及取非 ~ F1 也是公式。
  • 如果 F 是帶自由變量 X 的公式,則(?X)(F) 和 (?X)(F) 也是公式。

表達(dá)式的安全性

另外還需要說明的是,演算表達(dá)式可以生成一個(gè)無窮集。例如:

表示不在 Staff 關(guān)系中的所有元組。將這樣的表達(dá)式稱為 不安全表達(dá)式。為了避免這種情況的出現(xiàn),必須加一個(gè)約束,在結(jié)果中出現(xiàn)的所有值必須在表達(dá)式 E 的域內(nèi),表示成 dom(E)。換句話說,E 的域包括所有顯式出現(xiàn)在 E 中的值和所有在 E 中出現(xiàn)的關(guān)系中的值。上例中,表達(dá)式的域就是所有出現(xiàn)在關(guān)系 Staff 中的值。

當(dāng)結(jié)果中出現(xiàn)的所有值都在表達(dá)式的域內(nèi)時(shí),這個(gè)表達(dá)式就是 安全 的。上面的表達(dá)式是不安全的,原因就在于它包括了 Staff 關(guān)系之外的元組(因此超出了表達(dá)式的域)。本文中所給出的其他元組演算表達(dá)式都是安全的。一些人用獨(dú)立的 RANGE 語句來定義變量的論域,以避免這個(gè)問題的出現(xiàn)。

2. 域關(guān)系演算

在元組關(guān)系演算中,使用了定義在關(guān)系上的元組變量。在域關(guān)系演算中,同樣也要用到變量,但它的論域不再是關(guān)系中的元組,而是屬性的域。域關(guān)系演算中的表達(dá)式具有下面的一般形式:


其中,d1,d2,...,dn,...,dm代表域變量,F(xiàn)(d1,d2,...,dm) 代表由某些原子公式組成的公式,原子公式可以有以下幾種形式:

  • R(d1,d2,...,dn),其中 R 是維數(shù)為 n 的關(guān)系,di 為域變量。
  • di θ dj,其中 di 和 dj 代表域變量,θ 是比較運(yùn)算符中的一個(gè)。di 和 dj 對(duì)應(yīng)域的值必須可進(jìn)行 θ 比較。
  • di θ c,其中 di 是域變量,c 是 di 對(duì)應(yīng)域中的一個(gè)常數(shù),θ 是某個(gè)比較運(yùn)算符。

可以根據(jù)下面的規(guī)則,用原子公式遞歸的構(gòu)造出公式:

  • 原子公式是公式。
  • 如果 F1 和 F2 是公式,則它們的合取 F1 ∧ F2 、析取 F1 ∨ F2,以及取非 ~ F1 也是公式。
  • 如果 F 是帶自由變量 X 的公式,則(?X)(F) 和 (?X)(F) 也是公式。

當(dāng)把域關(guān)系演算限制為安全表達(dá)式時(shí),它就等價(jià)于安全的元組關(guān)系演算,而這種元組關(guān)系演算又等價(jià)于關(guān)系代數(shù)。這就意味著,每個(gè)關(guān)系代數(shù)表達(dá)式都存在一個(gè)與之等價(jià)的關(guān)系演算表達(dá)式,反過來,每個(gè)元組或者域關(guān)系演算表達(dá)式都存在一個(gè)與之等價(jià)的關(guān)系代數(shù)表達(dá)式。

3. 其他語言

雖然關(guān)系演算難于理解與使用,但其非過程性令人滿意,因此人們開始尋求更易于使用的非過程化技術(shù)。這導(dǎo)致了另外兩類關(guān)系語言的出現(xiàn):面向轉(zhuǎn)換的語言和圖形化語言。

面向轉(zhuǎn)換的語言(transform-oriented language):是一種非過程語言 ,它利用關(guān)系將輸入數(shù)據(jù)轉(zhuǎn)換成期望的輸出。這種語言提供了一種易于使用的結(jié)構(gòu),可以很容易的根據(jù)已知的內(nèi)容表述出所期望的結(jié)果。SQUARE(Boyce et al.,1975)、SEQUEL(Chamberin et al.,1976)以及 SEQUEL 的后繼產(chǎn)品 SQL 語言都是面向轉(zhuǎn)換的語言。

圖形化語言(graphical language):給用戶提供了關(guān)系結(jié)構(gòu)的一種圖解說明。用戶在一個(gè)實(shí)例中填入想要的輸出,系統(tǒng)則以這種格式返回所需的數(shù)據(jù)。QBE(舉例查詢)就是圖形化語言(Zloof,1977)的一個(gè)范例。

還有一類稱為 第四代語言(4GL),它允許用戶使用一個(gè)受限的命令集來創(chuàng)建完整的用戶應(yīng)用,這個(gè)命令集對(duì)用戶十分友好,通常為菜單驅(qū)動(dòng)的環(huán)境。某些系統(tǒng)還能接受自然語言,比如受限的英語。這類語言常稱為 第五代語言(5GL),它們的發(fā)展仍處于起步階段。

最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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