關係模型的數據結構很是簡單,只包含單一的數據結構——關係。在用戶看來,關係模型中數據的邏輯結構是一張扁平的二維表。sql
1.1 域數據庫
域是一組具備相同數據類型值的集合。數據結構
1.2 笛卡兒積oracle
笛卡兒積是域上的一種集合運算。ide
定義:給定一組域D1,D2,...,Dn,容許其中某些域是相同的,D1,D2,...,Dn的笛卡兒積爲D1×D2×...Dn = {(d1,d2,...,dn)|di∈Di,i = 1,2,...,n}函數
每個元素(d1,d2,...,dn)叫作一個元組,元素中的每個值di叫作一個份量。人工智能
一個域容許的不一樣取值個數稱爲這個域的基數。若Di(i = 1,2,...,n)爲有限集,其基數爲mi(i = 1,2,...,n)。spa
笛卡兒積可表示爲一張二維表,表中的每行對應一個元組,表中每一列的值來自一個域。操作系統
1.3 關係code
定義:D1×D2×...×Dn的子集叫作在域D1,D2,...,Dn上的關係,表示爲R(D1,D2,...,Dn)。這裏R表示關係的名字,n是關係的目或度,關係中的每一個元素是關係中的元組,一般用t表示。當n=1時,稱該關係爲單元關係或一元關係;當n=2時,稱該關係爲二元關係。
關係是笛卡兒積的有限子集,因此關係也是一張二維表,表的每行對應一個元組,表的每列對應一個域。因爲域能夠相同,爲了加以區分,必須對每列起一個名字,稱爲屬性。n目關係必有n個屬性。
若關係中的某一屬性組的值能惟一的標識一個元組,而其子集不能,則稱該屬性組爲候選碼。若一個關係中有多個候選碼,則選定其中一個爲主碼(primary key)。候選碼的諸屬性稱爲主屬性。不包含在候選碼中的屬性稱爲非主屬性或非碼屬性。簡單的狀況下,候選碼只包含一個屬性。最壞狀況下,關係模式的全部屬性是這個關係模式的候選碼,稱爲全碼。
通常來講,笛卡兒積是沒有實際語義的,只有它的真子集纔有實際含義。
⑴ 關係的三種類型
基本關係(基本表):是實際存在的表,是實際存儲的邏輯表示;
查詢表:查詢結果對應的表;
視圖表:是由基本一或其餘視圖表導出的表,是虛表,不對應實際存儲的數據。
⑵ 關係的限定和擴充
① 無限關係在數據庫系統中是無心義的,限定關係數據模型中的關係必須是有限集合;
② 經過爲關係的每一個列附加一個屬性名的方法取消關係屬性的有序性。
⑶ 基本關係具有的性質
① 列是同質的,每一列中的份量是同一類型的數據,來自同一個域;
② 不一樣的列可出自同一個域,稱其中的每個列爲一個屬性,不一樣的屬性要給予不一樣的屬性名;
③ 列的次序能夠任意交換;
④ 任意兩個元組的候選碼不能取相同的值;
⑤ 行的次序能夠任意交換;
⑥ 份量必須取原子值,每個份量都必須是不可再分的數據項。
關係模型要求關係必須是規範化的,即要求關係必須知足必定的規範條件。規範化的關係稱爲範式。
定義:關係的描述稱爲關係模式,它能夠表示爲R(U,D,DOM,F)。R是關係名,U爲組成該關係的屬性名集合,D爲U中屬性所來自的域,DOM爲屬性向域的映像集合(說明它們出自哪一個域,經常直接說明爲屬性的類型和長度),F爲屬性間數據的依賴關係集合。
關係是關係模式在某一時刻的狀態或內容,關係模式是靜態的、穩定的,而關係是動態的、隨時間不斷變化的,由於關係操做在不斷的更新着數據庫中的數據。
全部關係的集合構成一個關係數據庫。
關係數據庫也有型和值之分。關係數據庫的型稱爲關係數據庫模式,是對關係數據庫的描述。關係數據庫的值是這些關係模式在某些時刻對應的關係的集合,一般稱做關係數據庫。
表是關係數據的邏輯模型。
在關係數據庫的物理組織中,有的一個表對應一個操做系統文件,將物理數據組織交給操做系統來完成;有的從操做系統那裏申請若干個大的文件,本身劃分文件空間,組織表、索引等存儲結構,並進行存儲管理。
關係模型中經常使用的關係操做包括查詢(query)操做和插入(insert)、刪除(delete)、修改(update)操做兩大部分。
查詢操做又能夠分爲選擇(select)、投影(project)、鏈接(join)、除(divide)、並(union)、差(except)、交(intersection)、笛卡兒積等。其中選擇、投影、並、差、笛卡兒積是5種基本操做,其餘操做能夠用基本操做來定義和導出。
關係數據語言能夠分爲三類:關係代數語言(如ISBL),關係演算語言,具備關係代數和關係演算雙重特色的語言(如SQL)。
2.1 關係代數語言
關係代數用對關係的運算來表達查詢要求。
2.2 關係演算語言
關係演算用謂詞來表達查詢要求。它可按謂詞變元的基本對象是元組變量仍是域變量分爲元組關係演算和域關係演算。
一個關係數據語言可以表示關係代數能夠表示的查詢,稱爲具備完備的表達能力,簡稱關係完備性。已經證實關係代數、元組關係演算和域關係演算三種語言在表達能力上是等價的,都具備完備的表達能力。
2.3 結構化查詢語言
它是一種具備關係代數和關係演算雙重特色的語言,是集查詢、數據定義語言、數據操縱語言和數據控制語言於一體的關係數據語言。
關係模型中有三類完整性約束:實體完整性、參照完整性和用戶定義的完整性,其中實體完整性和參照完整性是關係數據模型必須知足的完整性約束條件,被稱做是關係的兩個不變性,應該由關係系統自動支持。
1.1 實體完整性規則
若屬性(一個或一組屬性)A是基本關係R的主屬性,則A不能取空值。
1.2 實體完整性規則說明
⑴ 一個基本表一般對應現實世界的一個實體集;
⑵ 實體在現實世界中是可區分的,它們具備某種惟一性的標識,關係模型中以主碼做爲惟一性標識;
⑶ 主碼中的屬性即主屬性不能取空值。
2.1 參照完整性規則
若屬性(一個或一組屬性)F是基本關係R的外碼,它與基本關係S的主碼相對應(R和S有多是相同的關係),則對於R中每一個元組在F上的值必須:或者取空值,或者等於S中某個元組的主碼值。
參照完整性規則就是定義外碼和主碼之間的引用規則。
2.2 參照完整性規則說明
⑴ 不只兩個或兩個以上的關係間存在引用關係,同一關係內部屬性間也可能存在引用關係(如學生(學員,...,班長));
⑵ 若是F是關係R的一個或一組屬性,但不是關係R的主碼,K是基本關係S的主碼。若是F與K相對應,則稱F是R的外碼,並稱基本關係R爲參照關係,基本關係S爲被參照關係。關係R和S有多是相同的關係。
⑶ 外碼並不必定發與相對應的主碼同名,但實際應用中爲了方便識別,通常使用同名;
⑷ 當參照完整性約束和實體完整性約束沒法同時知足時,優先知足實體完整性約束,如成績關係中學號和課程號分別參照學生關係和課程關係中的主碼,此時因爲學號和課程號是成績關係中的主屬性,則它們不能取空值,只能取被參照關係中已經存在的主碼值。
用戶定義的完整性約束就是針對某一具體關係數據庫的約束條件,它反映某一具體應用所涉及的數據必須知足的語義要求,如某個屬性必須取惟一值、某個非主屬性不能取空值。
關係代數是一門抽象的查詢語言,它用對關係的運算來表達查詢。
運算對象、運算符、運算結果是運算的三大要素。關係代數的運算對象是關係,運算結果也是關係,運算符包括:集合運算符和關係運算符。
傳統的集合運算是二目運算,包括並、交、差、笛卡兒積四種運算。如下以oracle爲例:
1.1 並(union)
R∪S
其結果仍爲n目關係,由屬於R或屬於S的元組組成。
--結果:2條記錄 select * from emp where empno=7369 union select * from emp where empno=7788
--結果:11條記錄 select * from emp where sal < 2000 --只有2個20號部門的人,一共8條記錄 union select * from emp where deptno = 20 --20號部門共有5我的,一共5條記錄
1.2 差(except)
R-S
其結果關係仍爲n目關係,由屬於R而不屬於S的全部元組組成。
--結果:1條記錄 select * from emp where deptno=30 --30號部門共有6我的,一共6條記錄 minus select * from emp where deptno=30 and mgr=7698 --部門經理爲7698的員工有5個,一共5條記錄
1.3 交(intersection)
R∩S
其結果仍爲n目關係,由既屬性R又屬於S的元組組成。交能夠用差來表示,即R∩S=R-(R-S)。
--結果:5個 select * from emp where deptno=30 --6個 intersect select * from emp where deptno=30 and mgr=7698 --5個
1.4 笛卡兒積
關係R和S的笛卡兒積是一個(n+m)列的元組的集合,元組的前n列是關係R的一個元組,後m列是關係S的一個元組。若R有x個元組,S有y個元組,則關係R和S的笛卡兒積有x*y個元組。
--笛卡兒積(若關係R有n列x行,關係S有m列y行,則R和S的笛卡兒積爲列n+m,行x*y) select a.*,b.* from emp a,dept b --第一種 select * from emp cross join dept --第二種
專門的關係運算包括選擇、投影、鏈接、除運算等。如下以oracle爲例:
2.1 選擇(selection)
選擇的邏輯表達式的基本形式爲:XθY。其中θ表明比較運算符,它能夠是比較運算符。X、Y是屬性名或常量或簡單函數。它是從行的角度進行的運算。
select * from emp where sal > 3000
2.2 投影(projection)
關係R上的投影是從關係R中選出若干屬性列組成新的關係。它是從列的角度進行的運算。因爲投影取消了某些列以後可能出現重複的行,應取消這些徹底相同的行。
select distinct deptno from emp
2.3 鏈接(join)
也稱θ鏈接,它是從兩個關係的笛卡兒積中選取屬性間知足必定條件的元組。
--向dept中添加列(平均工資)設置十、20、30號部門的平均工資並提交 alter table dept add (avgsal number(10)) update dept set avgsal=3000 where deptno = 10; update dept set avgsal=2000 where deptno = 20; update dept set avgsal=1500 where deptno = 30; commit; --向emp中添加一條沒有部門的員工信息記錄並提交 insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(8888,'ZHANG','ENGINEER',7788,sysdate,3000,2000,null); commit;
⑴ 非等值鏈接
θ不爲「=」的鏈接稱爲非等值鏈接
select * from emp e join dept d on e.sal > d.avgsal
⑵ 等值鏈接
θ爲「=」的鏈接稱爲等值鏈接,它是從關係R和S的笛卡兒積中選取A、B屬性值相等的那些元組。等值鏈接的屬性名能夠相同也能夠不相同。
select * from emp e join dept d on e.sal = d.avgsal select * from emp e join dept d on e.deptno = d.deptno
⑶ 天然鏈接
天然鏈接是一種特殊的等值鏈接,它要求兩個關係進行比較的份量必須是同名的屬性組,而且在結果中把重複的屬性列去掉。通常的鏈接是從行的角度進行操做,天然鏈接須要取消重複列,因此它是從行和列的角度進行操做。
select * from emp natural join dept
⑷ 外鏈接
兩個關係R和S在作天然鏈接時,選擇兩個關係在公共屬性上值相等的元組構成新的關係。此時,關係R和S可能有在公共屬性上不相等的元組,從而形成R或S中元組的捨棄,這些捨棄的元組被稱爲懸浮元組。若是把懸浮元組也保存在結果關係中,而在其餘屬性上填空值,那麼這種鏈接就叫作外鏈接。
① 左外鏈接
若是隻保留左邊關係R中的懸浮元組就叫作左外鏈接。
select * from emp e left join dept d on e.deptno = d.deptno --員工8888沒有部門,只保留左表的懸浮元組,其餘屬性爲null
② 右外鏈接
若是隻保留右邊關係S中的懸浮元組就叫作右外鏈接。
select * from emp e right join dept d on e.deptno = d.deptno --40號部門沒有人,只保留右表的懸浮元組,其餘屬性爲null
③ 全外鏈接
若是保留兩邊關係R和S中的全部懸浮無級就叫作全外鏈接。
select * from emp e full join dept d on e.deptno = d.deptno --保留兩邊的懸浮元組,左表和右表各有一條懸浮元組記錄,一共16行
⑸ 自鏈接
select * from emp e1 join emp e2 on e1.empno = e2.mgr
2.4 除運算(division)
設關係R除以關係S的結果爲關係T,則關係T包含全部在R但不在S中的屬性及其值,且T的元組與S的元組的全部組合都在R中。
⑴ 象集
給定一個關係R(X,Z),X和Z爲屬性組。它表示R中屬性組X上值爲x的若干元組在Z上份量的集合。
例:關係R
x1 | y1 |
x1 | y2 |
x1 | y3 |
x2 | y3 |
x2 | y1 |
x1在R中的象集Z1={y1,y2,y3}
x2在R中的象集Z2={y3,y1}
⑵ 用象集來定義除法
① 給定關係R(X,Y)和S(Y,Z),其中X、Y、Z爲屬性組,R中的Y與S中的Y能夠有不一樣的屬性名,但必須出自相同的域集;
② 元組在X上的份量值x的象集K要包含S在Y上投影的集合,知足前面條件的元組在X屬性上的投影就是R除以S的結果關係;
③ 除操做是同時從行和列角度進行的操做。
例:
關係R
X | Y |
x1 | y1 |
x1 | y2 |
x1 | y3 |
x2 | y3 |
x2 | y5 |
關係S
Y | Z |
y1 | z1 |
y3 | z2 |
R÷S=P,P以下:
X |
x1 |
分析:
① S在(Y)上的投影的集合是:{(y1),(y3)};
② 元組在X上的份量值x的象集有兩組;
x1的象集K1={(y1),(y2),(y3)}
x2的象集K2={(y3),(y5)}
③ 從①②得知只有象集K1包含了S在(Y)上的投影;
④ 知足以上條件的象集K1在X屬性上的投影爲{(x1)}。
小結:
在關係代數運算中,並、差、笛卡兒積、選擇和投影這5種運算爲基本的運算,其餘三種運算交、鏈接、除,都可使用這5種基本運算來表達。它些運算通過有限次複合後造成的表達式稱爲關係代數表達式。
① 數據冗餘
數據冗餘是指同一數據反覆被存取的狀況。
② 更新異常
數據冗餘將致使存儲空間的浪費和潛在數據不一致性以及修改麻煩等問題。
③ 插入異常
數據的插入操做異常是指應該插入到數據庫中的數據不能執行插入操做的情形。
④ 刪除異常
數據的刪除操做異常是指不該該被刪除的數據被刪去的情形。
小結:
關係模式產生上述問題的緣由,以及消除這些問題的方法,都與數據依賴的概念密切相關。數據依賴是能夠做爲關係模式的取值的任何一種關係所必須知足的一種約束條件,是經過一個關係中各個元組的某些屬性之間的相等與否體現出來的相互關係。這是現實世界屬性間相互聯繫的抽象,是數據內在的性質,是語義的體現。
數據依賴,其中最重要的是函數依賴和多值依賴。
函數依賴是指關係中屬性間的對應關係。
定義一:
設R爲任一給定關係,若是對於R中屬性X的每個值,R中的屬性Y只有惟一值與之對應,則稱X函數決定Y或稱Y函數依賴於X,記做X → Y,其中X稱爲決定因素。反之,對於關係R中的屬性X和Y,若X不能函數決定Y,則其符號記做X →× Y。
例:SNO → SNAME SNAME →× SNO(人名可能有同名同姓的,不能決定學號)
注意:函數依賴是針對關係的全部元組,即某個關係中只要有一個元組的有關屬性值不知足函數依賴的定義,則相對應的函數依賴就不成立。
函數依賴根據其不一樣性質可分爲徹底函數依賴、部分函數依賴和傳遞函數依賴。
① 徹底函數依賴
定義二:
設R爲任一給定關係,X、Y爲其屬性集,若X → Y,且任何X中的真子集X1都有X1 →× Y,則稱Y徹底函數依賴於X。
例:(SNO,CNO)→ GRADE(學號和課程編號決定成績)
② 部分函數依賴
定義三:
設R爲任一給定關係,X、Y爲其屬性集,若X → Y,且X中存在一個真子集X1知足X1 → Y,則稱Y部分函數依賴於X。
例:(SNO,SNAME)→ SSEX,但其中SNO → SSEX(學號和姓名能夠決定性別,但其中學號能夠直接決定性別)
③ 傳遞函數依賴
定義四:
設R爲任一給定關係,X、Y、Z爲其不一樣的屬性子集,若X → Y,Y →× X,Y → Z ,則有X → Z,稱爲Z傳遞函數依賴於X。(加入條件Y →× X,是由於若Y → X,即有X ←→ Y,這其實是X直接函數決定Z,而不是X傳遞函數決定Z)
例:BNO → PNAME (書號決定出版社)和 PNAME → PADDRESS(出版社決定出版社地址),但PNAME →× BNO(一個出版社可能出版多種書),所以有PADDRESS對BNO的傳遞函數依賴。
定義五:
設R爲任一給定關係,U爲其所含的所有屬性集合,X爲U的子集,如有徹底函數依賴X → U,則X爲R的一個候選關鍵字。做爲候選關鍵字的屬性集X惟一標識R中的元組,但該屬性集的任何真子集不能惟一標識R中的元組。顯然,一個關係R中可能存在多個候選關鍵字,一般選擇其中之一做爲主鍵,候選關鍵字中所含的屬性稱爲主屬性。
例:屬性集(SNO,CNO)爲候選關鍵字,SNO和CNO爲主屬性
關係數據庫中的關係須要知足必定的要求,不一樣程度的要求稱爲不一樣的範式。知足最低要求的稱爲第一範式,簡稱1NF,這是最基本的範式;在第一範式的基礎上進一步知足一些新的要求稱爲第二範式(2NF);以此類推,再進一步的範式是第三範式(3NF)及其改進形式BCNF。
一個低一級範式的關係模式經過模式分解,能夠轉換爲若干個高一級範式的關係模式的集合,這種過程叫作規範化。
定義:設R爲任一給定關係,若是R中每一個列與行的交點處的取值都是不可再分的基本元素,則R爲第一範式。
因而可知,第一範式是一個不含重複組的關係,其中不存在嵌套結構,不知足第一範式的關係爲非規範關係。下面是一個非規範關係,由於在學號爲80154的學生數據中出現了重複組。
SNO | CNO | CTITLE | INAME | IPLACE | GRADE |
80152 | C01 | 操做系統 | 五忠 | 東01 | 70 |
80153 | C02 | 數據庫 | 高國 | 東02 | 85 |
80154 | C01 | 操做系統 | 五忠 | 東01 | 86 |
C03 | 人工智能 | 楊凡 | 東03 | 72 | |
80155 | C04 | C語言 | 高國 | 東02 | 92 |
非規範關係轉化爲1NF比較容易,能夠經過重寫關係中屬性值相同部分的數據來實現,轉化後以下:
SNO | CNO | CTITLE | INAME | IPLACE | GRADE | |
80152 | C01 | 操做系統 | 五忠 | 東01 | 70 | |
80153 | C02 | 數據庫 | 高國 | 東02 | 85 | |
80154 | C01 | 操做系統 | 五忠 | 東01 | 86 | |
80154 | C03 | 人工智能 | 楊凡 | 東03 | 72 | |
80155 | C04 | C語言 | 高國 | 東02 | 92 |
然而,上面表中所示的關係存在着冗餘高、插入和刪除操做異常等問題。好比,若操做系統這門課程被1000個同窗選修,那麼該授課老師的辦公地址就要被存儲1000次,這就帶來了大量的數據「冗餘」;若是學校開設了一門新課程,但還沒有有學生選修,則這個課程的信息就沒法存儲到關係中,此時就出現了「插入異常」的現象;若是刪除上面關係中的最後一條記錄,則同時也會刪除和C語言相關的授課老師的信息,此時會面臨「刪除異常的問題」。因此,在知足1NF的基礎,須要對其進一步進行規範化。
經分析,SC關係出現冗餘高、插入異常、刪除異常的問題緣由在於:非主屬性GRADE徹底函數依賴於(SNO,CNO),其餘非主屬性(CTITLE,INAME,IPLACE)都是函數依賴於CNO,即它們與(SNO,CNO)爲部分函數依賴關係。那麼,解決1NF關係存在問題的方法是:將知足部分函數依賴關係和知足徹底函數依賴關係的屬性分解並組成兩個關係,從而消除非主屬性對候選關鍵字的部分函數依賴,由此得到更高一級的範式。按照此方法關係SC可分解爲關係SG和關係CI,以下所示:
SNO | CNO | GRADE |
80152 | C01 | 70 |
80153 | C02 | 85 |
80154 | C01 | 86 |
80154 | C03 | 72 |
80155 | C04 | 92 |
CNO | CTITLE | INAME | IPLACE |
C01 | 操做系統 | 五忠 | 東01 |
C02 | 數據庫 | 高國 | 東02 |
C03 | 人工智能 | 楊凡 | 東03 |
C04 | C語言 | 高國 | 東02 |
定義:設R爲任一給定關係,若R爲1NF,且全部非主屬性都徹底函數依賴於候選關鍵字,則R爲第二範式。
然而,2NF並不能解決全部問題,在關係CI中,若是有一位新老師報到,需將其有關數據插入到CI中去,但該老師暫時還未承擔任何教學工做,則因缺失關鍵字CNO的值而不能進行插入操做。
經分析,產生上述現象的緣由在於:關係CI中存在非主屬性對主屬性的傳遞函數依賴,即CNO → INAME、INAME →× CNO、INAME → IPLACE。所以,須要將2NF的關係CI進行一步進行規範化,消除非主屬性對候選關鍵字的傳遞函數依賴。
CNO | CTITLE | INAME |
C01 | 操做系統 | 五忠 |
C02 | 數據庫 | 高國 |
C03 | 人工智能 | 楊凡 |
C04 | C語言 | 高國 |
INAME | IPLACE |
五忠 | 東01 |
高國 | 東02 |
楊凡 | 東03 |
定義:設R爲任一給定關係,若R爲2NF,且其每個非主屬性都不傳遞函數依賴於候選關鍵字,則R爲第三範式。
一般,第三範式的關係大多數都能解決插入和刪除操做異常的問題,數據冗餘也能獲得有效的控制,但也存在一些例外。例如以下關係中,若每個學生可選修多門課程,每一門課程可有多個指導老師,但每一個老師只能指導一門課程,則其候選關鍵字爲(SNO,CTITLE)和(SNO,TNAME),故不存在非主屬性,也就不存在非主屬性對主屬性的傳遞函數依賴。因此,該關係是一個3NF,但其中仍存在插入和刪除操做異常問題。例如,一個新課程和指導老師的數據要插入到數據庫中,必須至少有一個學生選修該課程且該指導老師已被分配給他時才能進行。
SNO | CTITLE | TNAME |
S01 | 英語 | 王華 |
S01 | 數學 | 沈飛 |
S02 | 物理 | 高俊 |
S03 | 英語 | 袁曉 |
S04 | 英語 | 王華 |
經分析,上述問題的緣由在於:主屬性之間存在函數依賴TNAME → CTITLE,這裏須要對其進一步進行規範化,其結果以下:
SNO | TNAME |
S01 | 王華 |
S01 | 沈飛 |
S02 | 高俊 |
S03 | 袁曉 |
S04 | 王華 |
TNAME | CTITLE |
王華 | 英語 |
沈飛 | 數學 |
高俊 | 物理 |
袁曉 | 英語 |
定義:設R爲任一給定關係,X、Y爲其屬性集,F爲其函數依賴集,若R爲3NF,且其F中全部函數依賴X → Y(Y不屬於X)中的X必包含候選關鍵字,則R爲BCNF
簡而言之,若R中每個函數依賴的決定因素都包含一個候選關鍵字,則R爲BCNF,其中,決定因素能夠是單一屬性或組合屬性。
根據BCNF的定義可知,在關係SCT中,有函數依賴TNAME → CTITLE,但TNAME不是候選關鍵字。