- Oracle從入門(mén)到精通(第5版)
- 明日科技編著
- 4695字
- 2024-12-27 22:36:43
1.2 關(guān)系型數(shù)據(jù)庫(kù)的基本理論
數(shù)據(jù)庫(kù)技術(shù)是應(yīng)對(duì)信息資源(即大量數(shù)據(jù))的管理需求而產(chǎn)生的。隨著信息技術(shù)的不斷發(fā)展,尤其是人類邁入網(wǎng)絡(luò)時(shí)代后,社會(huì)信息資源呈爆炸式增長(zhǎng),對(duì)數(shù)據(jù)管理技術(shù)也隨之提出更高的要求。數(shù)據(jù)管理技術(shù)先后經(jīng)歷了人工管理、文件系統(tǒng)、數(shù)據(jù)庫(kù)系統(tǒng)3個(gè)階段。在數(shù)據(jù)庫(kù)系統(tǒng)中,數(shù)據(jù)模型主要有層次模型、網(wǎng)狀模型和關(guān)系模型3種(另一種面向?qū)ο竽P瓦€處于探索研究中),目前使用最普遍的模型就是關(guān)系模型,它是關(guān)系型數(shù)據(jù)庫(kù)的理論基礎(chǔ)。
1.2.1 關(guān)系型數(shù)據(jù)庫(kù)與數(shù)據(jù)庫(kù)管理系統(tǒng)
關(guān)系型數(shù)據(jù)庫(kù)是建立在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫(kù),借助集合代數(shù)等數(shù)學(xué)概念和方法來(lái)處理數(shù)據(jù)庫(kù)中的數(shù)據(jù),現(xiàn)實(shí)世界中的各種實(shí)體以及實(shí)體之間的各種聯(lián)系均用關(guān)系模型來(lái)表示。
關(guān)系模型以二維表來(lái)描述數(shù)據(jù)。在關(guān)系模型中,每張表有多個(gè)字段列和記錄行,每個(gè)字段列有固定的類型屬性(如數(shù)字、字符、日期等類型)。在關(guān)系模型中,數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單、清晰,具有很高的數(shù)據(jù)獨(dú)立性,因此是目前主流的數(shù)據(jù)庫(kù)數(shù)據(jù)模型。
在關(guān)系數(shù)據(jù)模型中,關(guān)系可以看成由行和列交叉組成的二維表格,表中的行稱為元組,可以用來(lái)標(biāo)識(shí)實(shí)體集中的一個(gè)實(shí)體。表中的列稱為屬性,給每一列起個(gè)名稱即為屬性名,表中的屬性名不能相同。列的取值范圍稱為域,同列具有相同的域,不同的列也可以有相同的域。表中任意兩行(元組)不能相同。能唯一標(biāo)識(shí)表中不同行的屬性或?qū)傩越M(即多個(gè)屬性的組合)稱為主鍵或復(fù)合主鍵。
關(guān)系與傳統(tǒng)的二維表格數(shù)據(jù)文件具有類似之處,但是它們又有區(qū)別。嚴(yán)格地說(shuō),關(guān)系是一種規(guī)范化的二維表格,它具有如下特性。
屬性值具有原子性,不可分解。
沒(méi)有重復(fù)的元組,即沒(méi)有重復(fù)的行。
理論上沒(méi)有行序,但是在使用時(shí)有時(shí)可以有行序。
在關(guān)系型數(shù)據(jù)庫(kù)中,關(guān)鍵碼(簡(jiǎn)稱鍵)是關(guān)系模型的一個(gè)非常重要的概念,它通常是行(元組)的一個(gè)或幾個(gè)列(屬性)。如果鍵是由一個(gè)列組成的,則稱之為唯一鍵;如果是由多個(gè)列(屬性)組成的,則稱之為復(fù)合鍵。鍵的主要類型如下。
超鍵:在一個(gè)關(guān)系中,能唯一標(biāo)識(shí)元組的屬性或?qū)傩约Q為關(guān)系的超鍵。
候選鍵:如果一個(gè)屬性集能唯一標(biāo)識(shí)元組,且又不含有多余的屬性,那么這個(gè)屬性集稱為關(guān)系的候選鍵。
主鍵:如果一個(gè)關(guān)系中有多個(gè)候選鍵,則選擇其中的一個(gè)鍵為關(guān)系的主鍵。用主鍵可以實(shí)現(xiàn)關(guān)系定義中“表中任意兩行(元組)不能相同”的約束。
這里以管理學(xué)生信息為例。我們?cè)凇皩W(xué)生信息表”中設(shè)置學(xué)號(hào)、姓名、性別、年齡、院系、班級(jí)等列。在該表中,“學(xué)號(hào)”能夠唯一標(biāo)識(shí)一名學(xué)生,因此把學(xué)號(hào)作為主鍵是最佳的選擇。而如果把“姓名”作為主鍵則會(huì)存在問(wèn)題,因?yàn)橛锌赡艽嬖谕膶W(xué)生。為此,最好創(chuàng)建一個(gè)單獨(dú)的鍵將其明確地指定為主鍵,這種唯一標(biāo)識(shí)符在現(xiàn)實(shí)生活中很普遍,如身份證號(hào)、銀行卡號(hào)、手機(jī)號(hào)、發(fā)票號(hào)等。
外鍵:如果一個(gè)關(guān)系R中包含另一個(gè)關(guān)系A(chǔ)的主鍵所對(duì)應(yīng)的屬性組T,則稱此屬性組T為關(guān)系R的外鍵,并稱關(guān)系A(chǔ)為參照關(guān)系,關(guān)系R是依賴關(guān)系。為了表示關(guān)聯(lián),可以將一個(gè)關(guān)系的主鍵作為屬性放入另一個(gè)關(guān)系中,第二個(gè)關(guān)系中的那些屬性就稱為外鍵。
這里以商品銷售為例。在填寫(xiě)一張商品銷售單時(shí),可以將商品銷售信息分為兩大類:第一類是單據(jù)的主體信息(銷售主表),如銷售單號(hào)、銷售金額、銷售日期、收款人等;第二類是單據(jù)的明細(xì)信息(銷售明細(xì)表),如商品序號(hào)、商品名稱、商品數(shù)量等。在數(shù)據(jù)庫(kù)的銷售主表中通常以“銷售單號(hào)”作為主鍵;在銷售明細(xì)表中,為了標(biāo)識(shí)被銷售出去的商品隸屬于哪張單據(jù),需要對(duì)每一條商品銷售記錄標(biāo)明“單據(jù)編號(hào)”。在這種情況下,銷售明細(xì)表中的“銷售單號(hào)”就被稱為外鍵,因?yàn)椤颁N售單號(hào)”是其所在表以外(主體表)的一個(gè)主鍵。
當(dāng)出現(xiàn)外鍵時(shí),主鍵與外鍵的列名稱可以是不同的,但必須要求它們的值集相同,即銷售明細(xì)表中出現(xiàn)的“銷售單號(hào)”一定要和主體表中的值匹配。
對(duì)于上面提到的二維表格中存儲(chǔ)的數(shù)據(jù)信息,通常以物理文件的形式存儲(chǔ)在磁盤(pán)上,這種物理文件稱為數(shù)據(jù)文件。用戶通常使用數(shù)據(jù)庫(kù)軟件與磁盤(pán)上的數(shù)據(jù)文件進(jìn)行交互,這種數(shù)據(jù)庫(kù)軟件就稱為數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)。DBMS是建立在操作系統(tǒng)基礎(chǔ)上的,它可以對(duì)數(shù)據(jù)庫(kù)文件進(jìn)行統(tǒng)一的管理和控制。用戶對(duì)數(shù)據(jù)庫(kù)提出的訪問(wèn)請(qǐng)求都是由DBMS來(lái)處理的。另外,DBMS還提供了多種用于管理數(shù)據(jù)的實(shí)用工具。
1.2.2 關(guān)系型數(shù)據(jù)庫(kù)的E-R模型
在設(shè)計(jì)關(guān)系型數(shù)據(jù)庫(kù)時(shí),首先需要為它建立邏輯模型。關(guān)系型數(shù)據(jù)庫(kù)的邏輯模型可以通過(guò)實(shí)體和關(guān)系組成的圖形來(lái)表示,這種圖形稱為E-R圖,它將現(xiàn)實(shí)世界中的實(shí)體和實(shí)體之間的聯(lián)系轉(zhuǎn)換為邏輯模型。使用E-R圖形表示的邏輯模型稱為E-R模型,一個(gè)標(biāo)準(zhǔn)的E-R模型由實(shí)體、屬性和聯(lián)系3部分組成。
1.實(shí)體和屬性
實(shí)體是一個(gè)數(shù)據(jù)對(duì)象,是指客觀存在并可以相互區(qū)分的事物,如一名教師、一名學(xué)生、一名雇員等。每個(gè)實(shí)體由一組屬性來(lái)表示,如一名具體的學(xué)生擁有學(xué)號(hào)、姓名、性別和班級(jí)等屬性,其中學(xué)號(hào)可以唯一標(biāo)識(shí)該名學(xué)生實(shí)體。具有相同屬性的實(shí)體組合在一起就構(gòu)成實(shí)體集—實(shí)體的集合,而實(shí)體則是實(shí)體集中的某一個(gè)特例。例如,王同學(xué)這個(gè)實(shí)體就是學(xué)生實(shí)體集中的一個(gè)特例。
在E-R模型中,實(shí)體用矩形表示,矩形內(nèi)注明實(shí)體的命名。實(shí)體名常用以大寫(xiě)字母開(kāi)頭的有具體意義的英文名詞來(lái)表示,聯(lián)系名和屬性名也采用這種方式。圖1.2為一個(gè)圖書(shū)檔案的E-R圖。
2.聯(lián)系
在實(shí)際應(yīng)用中,實(shí)體之間是存在聯(lián)系的,這種聯(lián)系必須在邏輯模型中表現(xiàn)出來(lái)。在E-R模型中,聯(lián)系用菱形表示,菱形框內(nèi)寫(xiě)明聯(lián)系名,并用連接線將有關(guān)實(shí)體連接起來(lái),同時(shí)在連接線的旁邊標(biāo)注上聯(lián)系的類型。兩個(gè)實(shí)體之間的聯(lián)系類型可以分為以下3類。
一對(duì)一:若對(duì)于實(shí)體集A中的每一個(gè)實(shí)體,在實(shí)體集B中最多有一個(gè)實(shí)體與之相關(guān),反之亦然,則稱實(shí)體集A與實(shí)體集B具有一對(duì)一的聯(lián)系,可標(biāo)記聯(lián)系為1∶1。
一對(duì)多:若對(duì)于實(shí)體集A中的每一個(gè)實(shí)體,在實(shí)體集B中有多個(gè)實(shí)體與之相關(guān);反之,對(duì)于實(shí)體集B中的每一個(gè)實(shí)體,實(shí)體集A中最多有一個(gè)實(shí)體與之相關(guān),則稱實(shí)體集A與實(shí)體集B具有一對(duì)多的聯(lián)系,可標(biāo)記聯(lián)系為1∶n。
多對(duì)多:若對(duì)于實(shí)體集A中的每一個(gè)實(shí)體,在實(shí)體集B中有多個(gè)實(shí)體與之相關(guān);反之,對(duì)于實(shí)體集B中的每一個(gè)實(shí)體,實(shí)體集A中也有多個(gè)實(shí)體與之相關(guān),則稱實(shí)體集A與實(shí)體集B具有多對(duì)多的聯(lián)系,可標(biāo)記聯(lián)系為m∶n。
例如,一名讀者可以有多條圖書(shū)借還記錄,而一條借還記錄只能隸屬于一名讀者,這樣“讀者檔案實(shí)體”與“讀書(shū)借還實(shí)體”之間就存在一對(duì)多的聯(lián)系(即1∶n),如圖1.3所示。

圖1.2 圖書(shū)檔案實(shí)體E-R圖

圖1.3 “讀者檔案實(shí)體”與“讀者借還實(shí)體”之間的聯(lián)系
1.2.3 關(guān)系型數(shù)據(jù)庫(kù)的設(shè)計(jì)范式
在數(shù)據(jù)庫(kù)中,數(shù)據(jù)之間存在著密切的聯(lián)系。關(guān)系型數(shù)據(jù)庫(kù)由相互聯(lián)系的一組關(guān)系組成,每個(gè)關(guān)系包括關(guān)系模式和關(guān)系值兩方面。關(guān)系模式是對(duì)關(guān)系的抽象定義,給出關(guān)系的具體結(jié)構(gòu);關(guān)系值是關(guān)系的具體內(nèi)容,反映關(guān)系在某一時(shí)刻的狀態(tài)。一個(gè)關(guān)系包含許多元組(記錄行),每個(gè)元組都是符合關(guān)系模式結(jié)構(gòu)的一個(gè)具體值,并且都分屬于相應(yīng)的屬性。在關(guān)系數(shù)據(jù)庫(kù)中的每個(gè)關(guān)系都需要進(jìn)行規(guī)范化,使之達(dá)到一定的規(guī)范化程度,從而提高數(shù)據(jù)的結(jié)構(gòu)化、共享性、一致性和可操作性。
規(guī)范化是把數(shù)據(jù)庫(kù)組織成在保持存儲(chǔ)數(shù)據(jù)完整性的同時(shí)最小化冗余數(shù)據(jù)的結(jié)構(gòu)的過(guò)程。規(guī)范化的數(shù)據(jù)庫(kù)必須符合關(guān)系模型的范式規(guī)則。范式可以防止使用數(shù)據(jù)庫(kù)時(shí)出現(xiàn)不一致的數(shù)據(jù),并防止數(shù)據(jù)丟失。關(guān)系模型的范式有第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)、第六范式(6NF)和BCNF范式等多種。通常數(shù)據(jù)庫(kù)只要滿足前3個(gè)范式就足夠使用,下面我們舉例介紹前3個(gè)范式。
1.第一范式(1NF)
第一范式是第二范式和第三范式的基礎(chǔ),是最基本的范式。第一范式包括下列指導(dǎo)原則。
數(shù)據(jù)組的每個(gè)屬性只可以包含一個(gè)值。
關(guān)系中的每個(gè)數(shù)組必須包含相同數(shù)量的值。
關(guān)系中的每個(gè)數(shù)組一定不能相同。
在任何一個(gè)關(guān)系數(shù)據(jù)庫(kù)中,第一范式是對(duì)關(guān)系模式的基本要求,不滿足第一范式的數(shù)據(jù)庫(kù)不是關(guān)系型數(shù)據(jù)庫(kù)。
如果數(shù)據(jù)表中的每一個(gè)列都是不可再分割的基本數(shù)據(jù)項(xiàng)—同一列中不能有多個(gè)值,那么就稱此數(shù)據(jù)表符合第一范式,由此可見(jiàn)第一范式具有不可再分解的原子特性。
在第一范式中,數(shù)據(jù)表的每一行只包含一個(gè)實(shí)體的信息,并且每一行的每一列只能存放實(shí)體的一個(gè)屬性。例如,對(duì)于學(xué)生信息,不可以將學(xué)生實(shí)體的所有屬性信息(如學(xué)號(hào)、姓名、性別、年齡、班級(jí)等)都放在一個(gè)列中顯示,也不可以將學(xué)生實(shí)體的兩個(gè)或多個(gè)屬性信息放在一個(gè)列中顯示,而是將學(xué)生實(shí)體的每個(gè)屬性信息都放在一個(gè)列中顯示。
如果數(shù)據(jù)表中的列信息都符合第一范式,那么在數(shù)據(jù)表中的字段都是單一的、不可再分的。例如,表1.1就是不符合第一范式的學(xué)生信息表,因?yàn)椤鞍嗉?jí)”列中包含了“系別”和“班級(jí)”兩個(gè)屬性信息,這樣“班級(jí)”列中的信息就不是單一的,它是可以再分的;而表1.2就是符合第一范式的學(xué)生信息表,它將原“班級(jí)”列的信息拆分到了“系別”列和“班級(jí)”列中。
表1.1 不符合第一范式的學(xué)生信息表

表1.2 符合第一范式的學(xué)生信息表

2.第二范式(2NF)
第二范式是在第一范式的基礎(chǔ)上建立起來(lái)的,即滿足第二范式需要先滿足第一范式。第二范式要求數(shù)據(jù)庫(kù)表中的每個(gè)實(shí)體(即各個(gè)記錄行)可以被唯一地區(qū)分。為區(qū)分各行記錄,通常需要為表設(shè)置一個(gè)區(qū)分列,用以存儲(chǔ)各個(gè)實(shí)體的唯一標(biāo)識(shí)。在學(xué)生信息表中,設(shè)置了“學(xué)號(hào)”列,由于每名學(xué)生的編號(hào)都是唯一的,因此每名學(xué)生可以被唯一地區(qū)分(即使學(xué)生存在重名的情況),那么這個(gè)唯一屬性列被稱為主關(guān)鍵字或主鍵。
第二范式要求實(shí)體的屬性完全依賴于主關(guān)鍵字,即不能存在僅依賴主關(guān)鍵字一部分的屬性,如果存在,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來(lái)形成一個(gè)新的實(shí)體,新實(shí)體與原實(shí)體之間是一對(duì)多的關(guān)系。
例如,這里以員工工資信息表為例,若以員工編碼、崗位為組合關(guān)鍵字(即復(fù)合主鍵),就會(huì)存在如下決定關(guān)系。
(員工編碼、崗位)→(決定)(姓名、年齡、學(xué)歷、基本工資、績(jī)效工資、獎(jiǎng)金)
在上述決定關(guān)系中,還可以進(jìn)一步拆分為如下兩種決定關(guān)系。
(員工編碼)→(決定)(姓名、年齡、學(xué)歷) (崗位)→(決定)(基本工資)
其中,員工編碼決定了員工的基本信息(包括姓名、年齡和學(xué)歷),而崗位決定了員工的基本工資,所以這個(gè)關(guān)系表不滿足第二范式。
對(duì)于上述這種關(guān)系,可以把上述兩張關(guān)系表更改為如下3張表。
員工信息表:employee(員工編碼、員工姓名、年齡、學(xué)歷)。
崗位工資表:quarters(崗位、基本工資)。
員工工資表:pay(員工編碼、崗位、績(jī)效工資、獎(jiǎng)金)。
3.第三范式(3NF)
第三范式是在第二范式的基礎(chǔ)上建立起來(lái)的,即滿足第三范式需要先滿足第二范式。第三范式要求關(guān)系表不存在非關(guān)鍵字列對(duì)任意候選關(guān)鍵字列的傳遞函數(shù)依賴,也就是說(shuō),第三范式要求一張關(guān)系表中不包含已在其他表中包含的非主關(guān)鍵字信息。
所謂傳遞函數(shù)依賴,就是指如果存在關(guān)鍵字段A決定非關(guān)鍵字段B,而非關(guān)鍵字段B決定非關(guān)鍵字段C,則稱非關(guān)鍵字段C傳遞函數(shù)依賴于關(guān)鍵字段A。
例如,這里以員工信息表(employee)為例,該表中包含員工編碼、員工姓名、年齡、部門(mén)編碼、部門(mén)經(jīng)理等信息,該關(guān)系表的關(guān)鍵字為“員工編碼”,因此存在如下決定關(guān)系。
(員工編碼)→(決定)(員工姓名、年齡、部門(mén)編碼、部門(mén)經(jīng)理)
上述這種關(guān)系表是符合第二范式的,但它不符合第三范式,因?yàn)樵撽P(guān)系表內(nèi)部隱含著如下決定關(guān)系。
(員工編碼)→(決定)(部門(mén)編碼)→(決定)(部門(mén)經(jīng)理)
上述關(guān)系表存在非關(guān)鍵字段“部門(mén)經(jīng)理”對(duì)關(guān)鍵字段“員工編碼”的傳遞函數(shù)依賴。對(duì)于上述這種關(guān)系,可以把這張關(guān)系表(即employee)更改為如下兩張關(guān)系表。
員工信息表:employee(員工編碼、員工姓名、年齡、部門(mén)編碼)。
部門(mén)信息表:department(部門(mén)編碼、部門(mén)經(jīng)理)。
對(duì)于關(guān)系型數(shù)據(jù)庫(kù)的設(shè)計(jì),理想的設(shè)計(jì)目標(biāo)是按照“規(guī)范化”原則存儲(chǔ)數(shù)據(jù)的,因?yàn)檫@樣做能夠消除數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。
- Practical UX Design
- Learning C++ Functional Programming
- 人臉識(shí)別原理及算法:動(dòng)態(tài)人臉識(shí)別系統(tǒng)研究
- Mastering Swift 2
- R Data Analysis Cookbook(Second Edition)
- Node.js:來(lái)一打 C++ 擴(kuò)展
- 劍指大數(shù)據(jù):企業(yè)級(jí)數(shù)據(jù)倉(cāng)庫(kù)項(xiàng)目實(shí)戰(zhàn)(在線教育版)
- 區(qū)塊鏈技術(shù)與應(yīng)用
- Scratch·愛(ài)編程的藝術(shù)家
- 實(shí)戰(zhàn)Java高并發(fā)程序設(shè)計(jì)(第2版)
- Deep Learning with R Cookbook
- C指針原理揭秘:基于底層實(shí)現(xiàn)機(jī)制
- 單片機(jī)原理及應(yīng)用技術(shù)
- OpenCV Android開(kāi)發(fā)實(shí)戰(zhàn)
- Python面試通關(guān)寶典