官术网_书友最值得收藏!

1.5 關系數據庫的基本知識

關系數據庫采用人們熟悉的二維表格來描述實體及實體之間的聯系,一經問世,就贏得了用戶的廣泛青睞和數據庫開發商的積極支持,使其迅速成為繼層次數據庫、網狀數據庫后的一種嶄新的數據庫,并后來居上,在數據庫技術領域占據統治地位。

1.5.1 關系數據庫的基本概念

關系模型的基本數據結構是關系,即我們平時所說的二維表格,在E-R模型中對應于實體集,而在數據庫中關系又對應于表,因此二維表格、實體集、關系、表指的是同一概念,只是使用的場合不同而已。

1. 關系

通常可將一個沒有重復行、重復列,并且每個行列的交叉點只有一個基本數據的二維表格看成一個關系。二維表格包括表頭和表中的內容,相應地,關系包括關系模式和記錄的值,表包括表結構(記錄類型)和表的記錄,而滿足一定條件的規范化關系的集合,就構成了關系模型。

盡管關系與二維表格、傳統的數據文件有相似之處,但它們之間又有著重要的區別。嚴格地說,關系是一種規范化了的二維表格。在關系模型中,對關系做了種種規范性限制,關系具有以下6條性質。

① 關系必須規范化,每一個屬性都必須是不可再分的數據項。規范化是指關系模型中每個關系模式都必須滿足一定的要求。最基本的要求是關系必須是一個二維表格,每個屬性必須是不可分割的最小數據單元,即表中不能再包含表。例如,表1-2就不能直接作為一個關系,因為該表的“教師人數”列有4個子列,這與每個屬性不可再分割的要求不符。只要去掉“教師人數”項,而將“助教人數”“講師人數”“副教授人數”“教授人數”直接作為基本的數據項就可以了。

表1-2 不能直接作為關系的表格示例

0

② 列是同質的,即每一列中的分量是同一類型的數據,來自同一個域。

③ 在同一關系中不允許出現相同的屬性名。

④ 關系中不允許有完全相同的元組。但在大多數關系數據庫產品中,如Access、Visual FoxPro、Oracle等,如果用戶沒有定義有關的約束條件,它們都允許關系表中存在兩個完全相同的元組。

⑤ 在同一關系中,元組的次序無關緊要。也就是說,任意交換兩行的位置并不影響數據的實際含義。

⑥ 在同一關系中,屬性的次序無關緊要。也就是說,任意交換兩列的位置并不影響數據的實際含義,不會改變關系模式。

以上是關系的基本性質,也是衡量一個二維表格是否構成關系的基本要素。在這些基本要素中,屬性不可再分割是關鍵,這構成了關系的基本規范。

在關系模型中,數據結構簡單、清晰,同時有嚴格的數學理論作為指導,為用戶提供了較為全面的操作支持,所以關系數據庫成為當今數據庫應用的主流。

2. 元組

二維表格的每一行在關系中稱為元組(Tuple),相當于表的一條記錄(Record)。二維表格的一行描述了現實世界中的一個實體。例如,在表1-1中,每行都描述了一個教師的基本信息。在關系數據庫中,行是不能重復的,即不允許兩行的全部元素完全對應相同。

3. 屬性

二維表格的每一列在關系中稱為屬性(Attribute),相當于記錄中的一個字段(Field)或數據項。每個屬性都有一個屬性名,一個屬性在其每個元組上的值稱為屬性值,因此,一個屬性包括多個屬性值,只有在指定元組的情況下,屬性值才是確定的。同時,每個屬性都有一定的取值范圍,即該屬性的值域,如表1-1中的第3列,屬性名是“性別”,取值是“男”或“女”,不是“男”或“女”的數據應被拒絕存入該表,這就是數據約束條件。同樣,在關系數據庫中,列是不能重復的,即關系的屬性不允許重復。屬性必須是不可再分的,即屬性是一個基本的數據項,不能是幾個數據的組合項。

有了屬性的概念后,可以這樣定義關系模式和關系模型:關系模式是屬性名及屬性值域的集合,關系模型是一組相互關聯的關系模式的集合。

4. 關鍵字

關系中能唯一區分、確定不同元組的單個屬性或屬性組合,稱為該關系的一個關鍵字。關鍵字又稱鍵或碼(Key)。單個屬性組成的關鍵字稱為單關鍵字,多個屬性組成的關鍵字稱為組合關鍵字。需要強調的是,關鍵字的屬性值不能取“空值”,因為“空值”無法唯一地區分、確定元組。所謂“空值”就是“不知道”或“不確定”的值。

在如表1-1所示的關系中,“性別”屬性無疑不能充當關鍵字,“職稱”屬性也不能充當關鍵字,從該關系現有的數據分析,“編號”和“姓名”屬性均可單獨作為關鍵字,但“編號”屬性作為關鍵字會更好一些,因為可能會有教師重名的現象,而教師的編號是唯一的、是不會相同的。這也說明,某個屬性能否作為關鍵字,不能只對現有數據進行歸納確定,還應根據該屬性的取值范圍進行分析判斷。

關系中能夠作為關鍵字的屬性或屬性組合可能不是唯一的。凡在關系中能夠唯一區分、確定不同元組的屬性或屬性組合,稱為候選關鍵字(Candidate Key)。例如,表1-1所示關系中的“編號”和“姓名”屬性都是候選關鍵字(假定沒有重名的教師)。

在候選關鍵字中選定一個作為關鍵字,稱為該關系的主關鍵字或主鍵(Primary Key)。關系中主關鍵字的取值是唯一的。

5. 外部關鍵字

如果關系中某個屬性或屬性組合是另一個關系的關鍵字,則稱這樣的屬性或屬性組合為本關系的外部關鍵字或外鍵(Foreign Key)。在關系數據庫中,用外部關鍵字表示兩個表之間的聯系。例如,在表1-1的教師關系中,增加“部門代碼”屬性,則“部門代碼”屬性就是一個外部關鍵字,該屬性是部門關系的關鍵字,該外部關鍵字描述了教師和部門兩個實體之間的聯系。

1.5.2 關系運算

在關系模型中,數據是以二維表格的形式存在的,這是一種非形式化的定義。由于關系是屬性個數相同的元組的集合,因此可以從集合論的角度對關系進行集合運算。

利用集合論的觀點,關系是元組的集合,每個元組包含的屬性數目相同,其中,屬性的個數稱為元組的維數。通常,元組用圓括號括起來的屬性值表示,屬性值間用逗號隔開,如(T1,趙琳琳,女,09/24/56,教授,3 200,軟件工程)是7元組。

假設A1,A2,…,An是關系R的屬性,通常可用RA1,A2,…,An)來表示這個關系的一個框架,也稱為R的關系模式。屬性的名字唯一,屬性Ai的取值范圍Dii=1,2,…,n)稱為值域。

將關系與二維表進行比較可以看出兩者存在簡單的對應關系,關系模式對應一個二維表的表頭,而關系的一個元組就是二維表的一行。在很多時候,甚至不加區別地使用這兩個概念。例如,表1-1所示的教師關系可以寫成元組集合的形式,教師關系={(T1,趙琳琳,女,09/24/56,教授,3 200,軟件工程),(T2,黃理科,男,11/27/73,講師,1 960,數據庫技術),(T3,童天福,男,12/23/81,助教,1 450,網絡技術),(T4,安勤熙,男,01/27/63,副教授,2 100,信息系統),(T5,李丹思,女,07/15/79,助教,1 600,信息安全),(T6,劉穆奮,男,09/21/65,教授,3 500,數據庫技術)}。

在關系運算中,并(Union)、交(Intersection)、差(Difference)運算是從元組(表格中的一行)的角度來進行的,沿用了傳統的集合運算規則,也稱為傳統的關系運算;連接(Selection)、投影(Projection)、選擇(Join)運算是關系數據庫中專門建立的運算規則,不僅涉及行而且涉及列,因此稱為專門的關系運算。

1. 傳統的關系運算

(1)并

RS同為n元關系,且相應的屬性取自同一個域,則RS的并也是一個n元關系,記作RSRS包含了所有分屬于RS或同屬于RS的元組。因為集合中不允許有重復元素,因此,同時屬于RS的元組在RS中只出現一次。

(2)差

RS同為n元關系,且相應的屬性取自同一個域,則RS的差也是一個n元關系,記作R-SR-S包含了所有屬于R但不屬于S的元組。

(3)交

RS同為n元關系,且相應的屬性取自同一個域,則RS的交也是一個n元關系,記作RSRS包含了所有同屬于RS的元組。

實際上,交運算可以通過差運算的組合來實現,如AB=A-(A-B)或B-(B-A)。

(4)廣義笛卡兒積

R是一個包含m個元組的j元關系,S是一個包含n個元組的k元關系,則RS的廣義笛卡爾積是一個包含m×n個元組的jk元關系,記作R×S,并定義:

R×S={(r1r2,…,rj,s1,s2,…,sk)|(r1,r2,…,rj)∈R且{s1,s2,…,sk}∈S}

R×S的每個元組的前j個分量是R中的一個元組,后k個分量是S中的一個元組。

例1-1 設R={(a1b1c1),(a1b2c2),(a2b2c1)},S={(a1b2c2),(a1b3c2),(a2b2c1)},求RSR-SRSR×S

根據運算規則,有如下結果。

RS={(a1b1c1),(a1b2c2),(a2b2c1),(a1b3c2)}

R-S={(a1b1c1)}

RS={(a1b2c2),(a2b2c1)}

R×S={(a1b1c1a1b2c2),(a1b1c1a1b3c2),(a1b1c1a2b2c1),(a1b2c2a1b2c2),(a1b2c2a1b3c2),(a1b2c2a2b2c1),(a2b2c1a1b2c2),(a2b2c1a1b3c2),(a2b2c1a2b2c1)}

R×S是一個包含9個元組的6元關系。

2. 專門的關系運算

(1)選擇

R={(a1,a2,…,an)}是一個n元關系,F是關于(a1,a2,…,an)的一個條件,R中所有滿足F條件的元組組成的子關系稱為R的一個選擇,記作σFR),并定義:

σFR)={(a1,a2,…,an)|(a1,a2,…,an)∈R且(a1,a2,…,an)滿足條件F}

簡言之,對R關系按一定規則篩選一個子集的過程就是對R施加了一次選擇運算。

(2)投影

R=RA1,A2,…,An)是一個n元關系,{i1,i2,…,im}是{1,2,…,n}的一個子集,并且i1<i2<…<im,定義:

π(R)=R1Ai1Ai2,…,Aim

即π(R)是R中只保留屬性Ai1,Ai2,…,Aim的新的關系,稱π(R)是RAi1,Ai2,…,Aim屬性上的一個投影,通常記作000

通俗地講,關系R上的投影是從R中選擇出若干屬性列組成新的關系。

(3)連接

連接是從兩個關系的笛卡爾積中選取屬性間滿足一定條件的元組,記作R000S。其中,AB分別為關系RS上維數相等且可比的屬性組,θ是比較運算符。連接運算從RS的笛卡兒積R×S中選取(R關系)在A屬性組上的值與(S關系)在B屬性組上值滿足比較關系θ的元組。

連接運算中有兩種最為重要也最為常用的連接,一種是等值連接,另一種是自然連接。θ為“=”的連接運算稱為等值連接,它是從關系RS的笛卡兒積中選取AB屬性值相等的那些元組。自然連接是一種特殊的等值連接,它要求在結果中把重復的屬性去掉。一般的連接操作是從行的角度進行運算,但自然連接還需要取消重復列,所以是同時從行和列的角度進行運算。

例1-2 一個關系數據庫由職工關系E和工資關系W組成,關系模式如下。

E編號,姓名,性別)

W編號,基本工資,標準津貼,業績津貼)

寫出實現以下功能的關系運算表達式。

① 查詢全體男職工的信息。

② 查詢全體男職工的編號和姓名。

③ 查詢全體職工的基本工資、標準津貼和業績津貼。

根據運算規則,寫出關系運算表達式如下。

① 對職工關系E進行選擇運算,條件是“性別='男'”,關系運算表達式是:

σ性別='男'(E)

② 先對職工關系E進行選擇運算,條件是“性別='男'”,這時得到一個男職工關系,再對男職工關系在屬性“編號”和“姓名”上作投影計算,關系運算表達式是:

π(編號,姓名)σ性別='男'E))

③ 先對職工關系E和工資關系W進行連接運算,連接條件是“E.編號=W.編號”,這時得到一個職工工資關系,再對職工工資關系作投影計算,關系運算表達式是:

0

1.5.3 關系的完整性約束

為了防止不符合規則的數據進入數據庫,數據庫管理系統一般提供了一種對數據的監測控制機制,這種機制允許用戶按照具體應用環境定義自己的數據有效性和相容性條件。在對數據進行插入、刪除、修改等操作時,數據庫管理系統自動按照用戶定義的條件對數據實施監測,使不符合條件的數據不能進入數據庫,以確保數據庫中存儲的數據正確、有效、相容。這種監測控制機制稱為數據完整性保護,用戶定義的條件稱為完整性約束條件。在關系模型中,數據完整性包括實體完整性(Entity Integrity)、參照完整性(Referential Integrity)及用戶自定義完整性(User defined Integrity)3種。

1. 實體完整性

現實世界中的實體是可區分的,即它們具有某種唯一性標識。相應地,關系模型中以主關鍵字作為唯一性標識。主關鍵字中的屬性即主屬性不能取“空值”。如果主屬性取“空值”,就說明存在某個不可標識的實體,即存在不可區分的實體,這與現實世界的應用環境相矛盾,因此這個實體一定不是一個完整的實體。

實體完整性就是指關系的主屬性不能取“空值”,并且不允許兩個元組的關鍵字值相同。也就是一個二維表中沒有兩個完全相同的行,因此實體完整性也稱行完整性。

2. 參照完整性

現實世界中的實體之間往往存在某種聯系,在關系模型中實體及實體間的聯系都是用關系來描述的,這樣就自然存在著關系與關系間的引用。

F是關系R的一個或一組屬性,但不是關系R的關鍵字,如果F與關系S的主關鍵字KS相對應,則稱F是關系R的外部關鍵字,并稱關系R為參照關系(Referencing Relation),關系S為被參照關系(Referenced Relation)或目標關系(Target Relation)。

參照完整性規則就是定義外部關鍵字與主關鍵字之間的引用規則,即對于R中每個元組在F上的值必須取“空值”或等于S中某個元組的主關鍵字值。

3. 用戶自定義完整性

實體完整性和參照完整性適用于任何關系數據庫系統。除此之外,不同的關系數據庫系統根據其應用環境的不同,往往還需要一些特殊的約束條件,用戶自定義完整性就是針對某一具體關系數據庫的約束條件,它反映某一具體應用所涉及的數據必須滿足的語義要求,如規定關系中某一屬性的取值范圍。

主站蜘蛛池模板: 鲁山县| 丰县| 武平县| 福清市| 禹城市| 南澳县| 修武县| 大邑县| 华阴市| 靖宇县| 恭城| 泰和县| 溧水县| 宁海县| 方山县| 绍兴市| 同仁县| 新宁县| 台南市| 东明县| 松桃| 富平县| 常州市| 新巴尔虎左旗| 调兵山市| 陇南市| 荣成市| 三原县| 海淀区| 宁阳县| 城口县| 泊头市| 泗水县| 保山市| 中西区| 岢岚县| 晋江市| 郑州市| 河池市| 印江| 六盘水市|