数据库杂谈(四)——关系演算和E-R数据模型
文章目錄
- 3 形式化關系查詢語言
- 3.2 關系演算和E-R數(shù)據(jù)模型
- 3.2.1 概述
- 3.2.2 元組關系演算
- 3.2.2.1 概述
- 3.2.2.2 形式化定義
- 3.2.2.3 表達式的安全性
- 3.2.3 域關系演算
- 3.2.4 關于關系演算的習題
- 3.2.5 對傳統(tǒng)數(shù)據(jù)模型的評價
- 3.2.6 E-R數(shù)據(jù)模型
- 3.2.6.1 基本概念
- 3.2.6.2 E-R圖
- 3.2.7 題型總結
- 3.2.7.1 如何畫E-R圖
- 3.2.7.2 E-R圖轉(zhuǎn)關系模式
- 3.2.8 擴充E-R數(shù)據(jù)模型
3 形式化關系查詢語言
3.2 關系演算和E-R數(shù)據(jù)模型
3.2.1 概述
除了用關系代數(shù)表示關系操作外,還可以用謂詞演算來表達關系的操作,這稱為關系演算。
關系代數(shù)表示關系的操作,須標明關系操作的次序,哪個操作先哪個后你要說清楚,所以以關系代數(shù)為基礎的數(shù)據(jù)庫語言是過程化查詢語言。用關系演算表示關系的操作,只要說明所要得到關系的結果,而不必標明操作的過程,因而他是非過程的。關系演算分為元組關系演算和域關系演算。
3.2.2 元組關系演算
3.2.2.1 概述
元組關系演算就是以元組為變量,一般形式是t[<屬性表>]∣P(t){t[<屬性表>]|P(t)}t[<屬性表>]∣P(t)。
一般形式描述了其為使謂詞P為真的元組t的集合。當我們選的不是元組,而是元組的部分屬性的時候,就可以采用屬性表。
利用關系演算是可以做關系代數(shù)的所有操作的。舉一個例子,如果我們要查詢江蘇籍貫的女大學生姓名,那么我們會這么寫:
t[姓名]∣t∈STUDENTANDt.性別=′女′andt.籍貫=′江蘇′{t[姓名]|t∈STUDENT AND t.性別 = '女' and t.籍貫 = '江蘇'} t[姓名]∣t∈STUDENTANDt.性別=′女′andt.籍貫=′江蘇′
但是對于上面的查詢,我們只是表達了要查找的元組是在所表達的條件之中。為了表達要查詢的請求,我們需要引入數(shù)理邏輯的“存在”這一結構。記法為:?t∈r(Q(t))\exist t∈r(Q(t))?t∈r(Q(t))。這樣的意思是表示關系r中存在元組t使謂詞Q(t)為真。并且,我們在考試中很少寫and和or,而是改用?和?\bigwedge和\bigvee?和?來代替。
用上面的表達來表示上面的例子,即為:t[姓名]∣?t∈STUDENT?t.性別=′女′?t.籍貫=′江蘇′{t[姓名]|\exist t∈STUDENT \bigwedge t.性別 = '女' \bigwedge t.籍貫 = '江蘇'}t[姓名]∣?t∈STUDENT?t.性別=′女′?t.籍貫=′江蘇′。
那如果我們想表示學生表里不是江蘇籍貫的女大學生的姓名呢?這只需要用 ┐\urcorner┐,即否定符號,如下:t[姓名]∣??t∈STUDENT?t.性別=′女′?t.籍貫=′江蘇′{t[姓名]|? \exist t∈STUDENT \bigwedge t.性別 = '女' \bigwedge t.籍貫 = '江蘇'}t[姓名]∣??t∈STUDENT?t.性別=′女′?t.籍貫=′江蘇′
如果我們要表達那些是江蘇所有的大學生呢?我們會發(fā)現(xiàn),這里面含有一個所有的概念,為了用元組關系演算書寫此查詢,我們引入了?\forall?。
在上面的敘述中我們發(fā)現(xiàn),我們基本都是把高中課本上面的謂詞全部搬上來關系演算使用。
3.2.2.2 形式化定義
結果上一小節(jié)的敘述,我們知道元組關系演算表達式具有如下形式:t∣P(t){t | P(t)}t∣P(t)。其中P是一個公式,公式中可以出現(xiàn)多個元組變量。對于沒有被量詞綁定的變量,我們稱為自由變量。如果被量詞綁定了,我們稱為受限變量。
對于元組關系演算的公式,其由原子組成,原子可以是如下的形式之一:
- 如果是s∈r,那么代表s是元組變量r是關系。這是需要注意的是我們不允許使用??∈/?。
- 對于s[x]op[y],那么其中op為<,>,=,<=,>=,!=當中任意一個。
3.2.2.3 表達式的安全性
元組關系演算與關系代數(shù)具有同等表達能力,也是關系完備的。用謂詞演算表示關系操作時,只有結果是有限集才有意義。也就是說,一個表達式的結果如果是有限的,我們叫做表達式是安全的。反之,我們說他是不安全的。例如{t∣t?∈STUDENT}\{t| t ? ∈STUDENT\}{t∣t?∈STUDENT},宇宙中不屬于學生的東西是無限的,這個表達式是不安全的。
3.2.3 域關系演算
關系演算的另一種形式為域關系演算,使用從屬性域中取值的域變量,而不使用一整個元組的值。
就是關系代數(shù)是SQL語言的基礎一樣,域關系演算是被廣泛采用的QBE語言。
域關系演算一般以域為變量,其一般形式為:<x1,x2,…,xn>∣P(x1,x2,…x(n+m)){<x1,x2,…,xn>|P(x1,x2,…x(n+m))}<x1,x2,…,xn>∣P(x1,x2,…x(n+m))。
這樣說我們可能有點費解。在下面,我們有完整的習題可供練習。
域關系演算也是完備的,實際上這個案例和選擇操作很像。
3.2.4 關于關系演算的習題
對于1、3、5寫出元組關系演算,對于2、4、6寫出域關系演算。
這里留給各位看官一個BUG,第5題由于我的技術可能寫的不對,網(wǎng)上的答案也是錯的。所以如果是錯的可以給我來個答案,如果是對的給我個提醒哈哈。
3.2.5 對傳統(tǒng)數(shù)據(jù)模型的評價
一般來說,我們把層次,網(wǎng)狀和關系數(shù)據(jù)模型稱為傳統(tǒng)數(shù)據(jù)模型。對于傳統(tǒng)數(shù)據(jù)模型來說有四個弱點:
-
以記錄為基礎,不能很好地面向用戶和應用
比如衣服,有一個衣服的表,里面有個屬性是衣服的袖口類型,但是在現(xiàn)實世界中有很多連袖口都沒有的衣服,雖然有NULL可以作為填補,但是用NULL是迫不得已,并不是一種自然的表示。
-
不能以自然的方式表示實體之間的聯(lián)系。
有些聯(lián)系本來不是那種PCR關系,不是鏈表關系,但是我們還是要引入什么link,什么虛記錄來表示這些關系,這些表示是很不自然的。
-
語義貧乏。
比如你定義了一個表,表里面有學生的性別、年齡、身高、體重,但是你卻不知道他們本身代表什么意思,我可以說這是學生的醫(yī)療記錄,也可以說這是入學信息報告。還有表與表直接的聯(lián)系,由于沒有標明聯(lián)系,有時候用戶還需要查幫助文檔和一些文件才能了解。所以,由于語義不明,導致就算語義理解錯了也要用戶自己負責。
-
數(shù)據(jù)類型太少,難以滿足應用需要。
3.2.6 E-R數(shù)據(jù)模型
3.2.6.1 基本概念
E-R數(shù)據(jù)模型,也叫實體聯(lián)系數(shù)據(jù)模型。其提出的目的如下:
在E-R數(shù)據(jù)模型中有三個概念我們需要先知道,分別是實體,屬性,聯(lián)系。
實體
-
概念:凡是可以被人互相區(qū)別的東西就叫實體。
-
范例:飛機,春游,神,夢。
-
注意:同類實體我們可以歸為一類,稱為實體集。
-
范例:用E代表學生的實體集,那么E = {e|e是學生}
屬性
- 概念:實體的特征叫實體的屬性,屬性取值的范圍叫值集。值集的說法相當于關系數(shù)據(jù)模型里的屬性域。
聯(lián)系
-
概念:實體之間(也包括和實體集)的各種關系我們稱之為聯(lián)系。
-
范例:某個學生(實體)和課程(實體)之間有選課關系。學生(實體集)和課程之間的選課關系。人與人直接有領導關系,夫妻關系。
-
表示方法:如果實體e1,實體e2之間有聯(lián)系,我們用<e1,e2>來表示,擴展到n個實體,我們用<e1,e2…,en>來表示,當n>2的時候,我們稱為多元聯(lián)系。
聯(lián)系集
概念:比如說夫妻是一種聯(lián)系,那么具體的比如:<e1,e2>兩個人就是這個聯(lián)系的實例,生活中是夫妻的不止一對,所以多個實例我們用集合包括起來,稱為聯(lián)系集。
有時為了表明實體在聯(lián)系中的作用,我們會這么表示,以夫妻為例:
<r1/e1,r2/e2,…,rn/en><r1/e1,r2/e2,…,rn/en> <r1/e1,r2/e2,…,rn/en>
其中r表示哪個是夫,哪個是妻。
說明:聯(lián)系雖然用元組表示,但實體間的次序不是重要的,尤其標明作用后,他們的次序可以任意。
3.2.6.2 E-R圖
用E-R數(shù)據(jù)模型對一個單位的模擬,稱為一個單位的E-R數(shù)據(jù)模式。E-R數(shù)據(jù)模式可以用非常直觀地E-R圖來表示。
其中矩形框代表實體,菱形代表聯(lián)系,橢圓代表屬性。
需要注意的是,上述的表示實際上是不完整的,但是在大學考試以及考研中只要求用上述表述即可。
其他表示:
- 未分割的矩形代表聯(lián)系集的屬性
- 虛線將聯(lián)系集屬性連接到聯(lián)系集
- 雙線顯示實體在聯(lián)系集中的參與度
- 雙菱形表示弱實體集
對于E-R圖來說有兩個約束:基數(shù)比約束和參與度約束。它們兩個合稱聯(lián)系約束。
基數(shù)比約束
比如聯(lián)系有1:1,1:N,N:1,M:N。我們把這個數(shù)量上實體間的約束稱為基數(shù)比約束。基數(shù)比約束在數(shù)據(jù)庫原書上也被稱為映射基數(shù)。
范例:一個員工只能在一個工作部門工作,這就是1:1。
參與度約束
比如這個銀行卡賬號你最多只能取錢5次,比如這門課最多容納學生150人,這就是參與度約束。
表達方式:(min,max)
3.2.7 題型總結
3.2.7.1 如何畫E-R圖
步驟總結:
3.2.7.2 E-R圖轉(zhuǎn)關系模式
步驟總結:
實體轉(zhuǎn)換為一個關系模式
實體的屬性就是關系的屬性,實體的碼就是關系的碼
實體間聯(lián)系的轉(zhuǎn)換
-
1:1聯(lián)系:在任意一方加入對方的主碼變?yōu)橥獯a,并加入聯(lián)系本身的屬性。
-
1:n聯(lián)系:將1方的主鍵加入n方作為其外鍵,并同時將聯(lián)系的屬性也加入n方。
-
m:n聯(lián)系:將聯(lián)系本身本身轉(zhuǎn)化為一個關系模式,聯(lián)系雙方的主碼加入其中,并將聯(lián)系的屬性加入其中。
3.2.8 擴充E-R數(shù)據(jù)模型
擴充E-R數(shù)據(jù)模型我們通常稱為EER,在EER引入以下的幾個概念:弱實體、特殊化和普遍化、聚集、范疇。
弱實體(Weak entity)
弱實體實際上可以當成實體,可以當成屬性,由數(shù)據(jù)庫庫設計者決定。
范例:比如一個職工,他的家屬實體集可能有姓名,出生日期,和職工的關系這些屬性,但是家屬的姓名是可以重復的。什么意思呢,簡而言之就是家屬實體集中的表沒有鍵(沒有實體鍵),導致失去了辨認家屬的能力了,所以一般來說弱實體可以不做實體,只當做擁有這個實體集的那個實體(所有者實體)的組合屬性。
特殊化和普遍化(Specialization and Generalization)
范例:從普遍到特殊叫特殊化,在一些書上也叫做特化;如學生是普遍,劃分為研究生高中生本科生是特殊,研究生還可以繼續(xù)劃分為學術型研究生和專業(yè)性研究生。反之叫普遍化,在一些書上叫做概化。
聚集(Aggregation)
就是把實體集和聯(lián)系看成新的一個實體集,新的實體集中的屬性是原來實體集的屬性和聯(lián)系的屬性的并。
范疇(Category)
在模擬現(xiàn)實世界時,有時候要用到不同類型的實體組成的實體集。我們把這類實體集叫做范疇。
-
范例:車主有可能是一個人,有可能是一個企業(yè)的單位。
-
表達方式:T(E1,E2,E3,…,En)
-
說明:其中里面的不同的實體集我們叫做超實體集,例如E1是超實體集。
-
圖例:圓圈∪代表并操作。
這里有一點需要說明一下,我們前面說過特殊化,特殊化也就是一個子類對于父類的繼承,并且繼承了所有的屬性,但是范疇不一樣。拿這個例子來說,單位和人構成范疇,但是這個賬戶不是說既是單位又是人的,他的繼承具有選擇性,如果賬戶是單位的,則繼承單位的屬性,是個人的繼承個人的屬性,這叫選擇性繼承。
總結
以上是生活随笔為你收集整理的数据库杂谈(四)——关系演算和E-R数据模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Swift: 获取系统字体
- 下一篇: Razor视图引擎浅析