2017/4/17 第 5 章 關聯式資料模型與關聯式資料庫的限制
學習重點 關聯式模型的觀念 非正式的定義 正式的定義 關聯的特徵 鍵值限制 候選鍵與主鍵 實體完整性與參考完整性限制 其他類型的限制 關聯的更新運算動作 資料庫管理
關聯式模型的觀念 關聯式模型(relational model):將資料庫表示成一個由「關聯」(relation)所組成的集合 每個關聯就好像一個「表格」(table),裡面有資料值 表格名稱與欄位名稱是用來說明每一列的值所代表的意義 關聯是一種數學觀念,其理論基礎是集合論 資料庫管理
非正式的定義 關聯 (Relation):由資料值所組成的表格 關聯可視為是一組橫列 (row) 的集合 關聯也可以視為是一組直欄 (column) 的集合 每個橫列是對應到某個真實世界的實體或關係 每個直欄通常是以它的欄位名稱、欄位標題或屬性名稱來稱呼 每一橫列(row)有一或多個項目的值能讓此橫列被唯一辨識出來 這一或多個項目被稱為鍵值(key) 例如,圖5.1中,Ssn即是鍵值(key) 資料庫管理
Student關聯的屬性和值組 資料庫管理
正式的定義─綱要(schema) 關聯式模型術語的正式定義 關聯的綱要 範例 關聯(relation):表格 值組(tuple):每一列 屬性(attribute):欄位的標題 定義域(domain):每一欄內所能合法出現的數值 關聯的綱要 被表示成R (A1, A2, .....An) R是關聯的名稱 A1, A2, .....An 皆是關聯的屬性 範例 CUSTOMER (Cust-id, Cust-name, Address, Phone#) CUSTOMER是關聯名稱 4個屬性Cust-id、Cust-name、Address、Phone# 資料庫管理
正式的定義─值組(tuple) 值組 (tuple):一組值的有序集合 (ordered set) 範例:在CUSTOMER關聯中 每個值都是從適當的定義域中取得 範例:在CUSTOMER關聯中 每一列可以稱作一筆值組,其中含有4個值 例如 ,<632895, “John Smith”, “101 Main St. Atlanta, GA 30332”, “(404) 894-2000”> 是其中一筆值組 一個關聯可以稱作一組值組 (tuple) 的集合 關聯的向度(degree):關聯綱要的屬性個數 資料庫管理
正式的定義─定義域(domain) 定義域(domain):由一組不可分割的單元值(atomic)所組成的集合 可以被指定某種資料型態或資料格式 USA_phone_numbers定義域的資料型態可宣告為(ddd)-ddd-dddd,其中的d是代表一個10進位數字 日期的資料格式有多種,如yyyy-mm-dd或dd mm,yyyy 組成定義域的所有值可以由這個資料型態中取得 定義域會指定名稱、資料型態或格式,另外可能指定其他額外的資訊 例如,Person_weights需要指定其測量單位(磅or公斤) 屬性Ai的定義域,被表示成dom(Ai) 資料庫管理
|dom (A1)| × |dom (A2)| × .... × |dom(An)| 正式的定義─狀態(state) 關聯狀態(relation state):關聯R(A1, A2, ..., An)的狀態是由n值組所組成的集合 r={t1, t2, ..., tm} 表示成 r(R) 每個n值組(n-tuple) t 都是由n個vi所組成的有序串列 實際上, t = {v1, v2, ..., vn},每個vi都是dom (Ai)的一個元素或是個特殊的空值(NULL) 關聯狀態的數學化正式定義 由定義域的卡氏積 (cartesian product) 所形成的 卡氏積會產生由定義域所衍生出來所有可能值的組合 r(R) dom (A1) × dom (A2) × .... × dom(An) 卡內積中的值組總個數為 |dom (A1)| × |dom (A2)| × .... × |dom(An)| |dom (Ai)|代表定義域dom (Ai)內資料值的總個數 資料庫管理
{<0,a>, <0,b>, <1,c>} 定義域的範例 假設R(A1, A2) 是一個關聯綱要 令 dom(A1) = {0,1} 且 dom(A2) = {a,b,c} 則 dom(A1) × dom(A2) 是所有可能值的組合,如下所示 {<0,a> , <0,b> , <0,c>, <1,a>, <1,b>, <1,c> } 通常 r(R) dom(A1) × dom(A2) 例如,在資料庫中的關聯狀態 r(R) 可能只有三組資料,如下所示 {<0,a>, <0,b>, <1,c>} 資料庫管理
名詞定義對照表 正式的關連式術語 非正式的相等用語 關連(relation) 表格(table) 值組(tuple) 橫列或記錄(row or record) 基數(cardinality) 橫列個數(number of rows) 屬性(attribute) 直欄或欄位(column or field) 定義域(domain) 合法值群(Values in a column) 向度(degree) 直行個數(number of columns) 主鍵(primary key) 唯一識別字(unique identifier) 資料庫管理
關聯的特徵 (1/4) 關聯 r(R)中值組的順序: 關聯中的值組是沒有任何特定順序的 圖5.1與圖5.2所表示的關聯被視為完全相等 要求值組有順序有時候反而造成麻煩: 順序本身也是一種資訊,須小心維護其順序 系統必須提供「在第 n 與第 n+1 筆間加入一筆」或 「請刪除第 6 筆」的運算 要以那一個屬性做為排順序的依據?或是以加入的時間來排順序? 通常的應用中,是查詢後對結果下排序命令(order by) 資料庫管理
關聯的特徵 (2/4) 資料庫管理
關聯的特徵 (3/4) 關聯綱要R中屬性的順序 (及值組中資料值的順序) 定義在R(A1, A2, ..., An) 中的屬性,還有在 t=<v1, v2, ..., vn> 裡的值是有順序的 (ordered) 在一般化的關聯定義,不需要限制屬性的順序 事實上,屬性與其資料值的順序並非那麼重要 只要能夠維持屬性及其資料值間的對映即可 圖5.3的兩個值組若根據這個定義,則是完全相同的 資料庫管理
關聯的特徵 (4/4) 值組中的資料值: 值組中的空值: 在關聯模型中,值組內的每個資料值都是不可分割的 (atomic)。 表示法: 將值組 t 的成分值以 t[Ai] = vi 來表示 (值組 t 的屬性Ai 的值) t[Au, Av, ..., Aw] 是代表 t 的子值組,裡面分別包括屬性Au, Av, ..., Aw 的值 值組中的空值: 空值 (null) 是用來表示屬性值是未知的,或者是不適用於該值組 資料庫管理
關聯式模型的限制 所謂的限制 (constraint) 是指在所有有效的關聯實例上都要成立的那些條件 (condition)。這裡的限制主要分成3種: 鍵值限制 (key constraint) 實體完整性限制 (entity integrity constraint) 參考完整性限制 (referential integrity constraint) 定義域限制 (domain constraint) 每個屬性A的值必須是該屬性定義域dom(A)內的一個不可分割的單元值 此限制通常是隱含的限制 資料庫管理
鍵值限制 (1/2) 鍵值限制(key constraint): 鍵值(key): 超鍵(superkey): 鍵值(記作K)是最小的超鍵(superkey),也就是說 它如果從K移除了任何屬性後,所形成的新集合K’不再是關聯綱要R的超鍵 超鍵(superkey): 關聯綱要R的超鍵,代表R中一些屬性的集合(記作SK),且滿足下列條件 在合法的關聯狀態r(R)中,沒有任何兩個SK值組內的屬性資料值是相同的。可寫成 任兩個r(R)中不同的值組 t1 及 t2 t1[SK]≠ t2[SK] 資料庫管理
鍵值限制 (2/2) 範例:考慮CAR關聯綱要 結論 CAR(State, Reg#, SerialNo, Make, Model, Year) 假設CAR有兩個鍵值 (key) Key1 = {State, Reg#} Key2 = {SerialNo} Key1 及 Key2 都是CAR 的超鍵 (superkey) {SerialNo, Make}是CAR的超鍵,但不是鍵值 結論 任何鍵值是超鍵 (反之,則不然) 任何包含鍵值的屬性集合一定是超鍵 最小的超鍵也是鍵值 資料庫管理
候選鍵與主鍵 (1/2) 候選鍵(candidate key): 主鍵(primary key): 一個關聯綱要可能有一個以上的鍵值,這種情況下,每個鍵值都被稱為候選鍵 在圖5.4中,CAR關聯有兩個候選鍵 License_number 及 Engine_serial_number 候選鍵的值會被用來識別關聯中的不同值組 主鍵(primary key): 候選鍵其中之一會被指定為此關聯的主鍵 通常會選擇所含屬性的個數愈小越好,最好只有一個屬性 主鍵通常會被加上底線 應選擇較不會改變其值的屬性當主鍵。如學號、身份証號碼 確保不會有空值(null)的屬性 資料庫管理
候選鍵與主鍵 (2/2) 資料庫管理
關聯式資料庫綱要 關聯式資料庫綱要(schema) 關聯式資料庫狀態(state) 圖5.5是一個關聯式資料庫綱要範例 一個關聯式資料庫綱要S,是一組關聯綱要的集合,S = {R1, R2 …, Rm},加上一組完整性限制(integrity constraint) IC 關聯式資料庫狀態(state) S的關聯式資料庫狀態DB,是一組關聯狀態的集合,DB = {r1, r2 …, rm},其中每一個ri 都是Ri 的狀態,且ri 滿足IC中的完整性限制 圖5.5是一個關聯式資料庫綱要範例 共有六個關聯 每個關聯綱要中畫底線的屬性代表主鍵 資料庫管理
關聯式資料庫綱要的範例 資料庫管理
關聯式資料庫狀態的範例 資料庫管理
實體完整性及參考完整性限制 (1/2) 實體完整性限制(entity integrity constraint) 主鍵的值不可以等於空值 (NULL) 參考完整性限制(referential integrity constraint) 一個關聯R1參考到另一個關聯R2時, R1裡的外來鍵的值必須滿足外來鍵的定義 鍵值限制與實體完整性限制:指定在個別關聯上 參考完整性限制:指定在兩個關聯之間,用來保持兩個關聯值組間的一致性 資料庫管理
實體完整性及參考完整性限制 (2/2) 外來鍵(foreign key): 在外來鍵的定義中 參考完整性限制的圖形表示法 在關聯綱要R1裡的一組屬性集合FK滿足以下規則,則稱FK為R1參考R2的外來鍵 在FK中的屬性與R2的主鍵屬性PK有相同的定義域 在目前狀態r1(R1)的t1值組中,FK的值不是出現在r2(R2)的某個值組t2中的PK值,就是空值 在外來鍵的定義中 R1稱為參考關聯 (referencing relation) R2稱為被參考關聯 (referenced relation) 參考完整性限制的圖形表示法 從外來鍵畫出一條有箭頭的線到它所參考的關聯上 資料庫管理
參考完整性限制範例 資料庫管理
其他類型的限制 語意完整性限制 (Semantic Integrity Constraint) 根據應用本身的語意,無法由模型本身來表達 例如,「員工在所有計畫上工作的每週最大時數為56」就算是這類限制 這類限制是利用一種限制指定語言 (constraint specification language) 來表達 所使用的機制被稱為觸發 (trigger) 或宣示(assertion) SQL-99有 CREATE ASSERTION命令可使用 資料庫管理
關聯的更新運算動作 (1/2) 在關聯上有三種基本的更新運算 注意: 插入 (INSERT) 用來插入一或多筆新的值組 刪除 (DELETE) 用來刪除值組 更新 (UPDATE) 用來改變值組中的某些屬性值 注意: 在進行更新運算時,原本指定的完整性限制仍然不應該違反 有時可能需要將數個更新運算組合在一起 更新運算可能會傳播(propagate)而自動引發其他的更新運算。 為了維持完整性限制可能必須如此 資料庫管理
關聯的更新運算動作 (2/2) 假如發生違反完整性限制的情況,可以採取以下這些措施: 取消(cancel)導致這個違反情況的運算 REJECT 選項 執行(perform)這個運算但通知(inform)使用者有發生違反情況 觸發(trigger)額外的更新動作,來修正這個違反情況 CASCADE選項、SET NULL選項 執行由使用者所定義的錯誤修正程序 資料庫管理
插入(insert)運算 插入運算可能違反的完整性限制 定義域限制 如果被指定的屬性值並未屬於所對應的定義域 鍵值限制 如果新值組的鍵值已經存在於關聯中的另一個值組裡 實體完整性限制 如果新值組的主鍵等於NULL 參考完整性限制 如果新值組的任何外來鍵參考了某個不在被參考關聯中的值組 資料庫管理
插入運算─範例 (1/2) 將 <‘Cecilia’, ‘F’, ‘Kolonsky’, null, ‘1960-04-05’, ‘6357 Windy Lane, Katy, TX’, F, 28000, NULL, 4> 插入到EMPLOYEE 中 拒絕(Reject):因為此插入運算的主鍵Ssn 是NULL,違反「實體完整性限制」 詢問使用者:提供一個有效的Ssn值 將 <‘Alicia’, ‘J’, ‘Zelaya’, ‘999887777’, ‘1960-04-05’, ‘6357 Windy Lane, Katy, TX’, F, 28000, ‘987654321’, 4>插入到EMPLOYEE 中 拒絕(Reject):因為此插入運算的主鍵Ssn 的值 ‘999887777’已存在於EMPLOYEE中,違反「鍵值限制」 資料庫管理
插入運算─範例 (2/2) 將 <‘Cecilia’, ‘F’, ‘Kolonsky’, ‘677678989’, ‘1960-04-05’, ‘6357 Windswept, Katy, TX’, F, 28000, ‘987654321’, 7> 插入到EMPLOYEE 中 詢問使用者:因為此插入運算的外來鍵Dno 值 7,違反「參考完整性限制」(在DEPARTMENT中沒有Dnumber=7) 將 <‘Cecilia’, ‘F’, ‘Kolonsky’, ‘677678989’, ‘1960-04-05’, ‘6357 Windy Lane, Katy, TX’, F, 28000, NULL, 4>插入到EMPLOYEE 中 接受(Accept):因為此插入運算滿足所有的限制 資料庫管理
刪除(delete)運算 (1/2) 刪除運算只可能會違反參考完整性限制 範例: 刪除Essn=‘999887777’與Pno=10的WORKS_ON值組 接受(Accept):會剛好刪除一個值組 刪除Ssn=‘999887777’的EMPLOYEE值組 不可接受(Not Accept):因為WORKS_ON中有值組參考到此值組,若執行刪除會違反參考完整性限制 刪除Ssn=‘333445555’的EMPLOYEE值組 不可接受(Not Accept):因為EMPLOYEE, DEPARTMENT, WORKS_ON與DEPENDENT等關聯的值組都參考到該值組 資料庫管理
刪除(delete)運算 (2/2) 刪除運算導致違反限制時,有三種可能的處理方式 拒絕(Reject)刪除 連鎖(Cascade)刪除:將會參考到被刪除值組的值組也刪除 修改(update)屬性值:修改那些會導致違反情況的參考屬性值,將它的值設定成NULL,或改成參考到另外一個有效的值組 通常DBMS會讓使用者指定在限制被違反時,該使用上述的那一種處理方式 資料庫管理
更新(Update)運算 (1/2) 將Ssn=‘999887777’的EMPLOYEE值組內的Salary屬性修改為28000 可接受(Acceptable) 將Ssn=‘999887777’的EMPLOYEE值組內的Dno屬性修改為1 將Ssn=‘999887777’的EMPLOYEE值組內的Dno屬性修改為7 不可接受(Unacceptable):違反參考完整性限制 將Ssn=‘999887777’的EMPLOYEE值組內的Ssn屬性修改為’987654321’ 不可接受(Acceptable):與另一個值組的主鍵值重複,違反主鍵限制 其他值組也參考到Ssn的現存值,違反參考完整性限制 資料庫管理
更新(Update)運算 (2/2) 討論: 更新一個既「非主鍵」,也不是「外來鍵」的屬性,通常不會有問題 只需檢查並確認新資料值是否為正確的資料型態和定義域即可 若修改「主鍵」,就必須特別小心 因為主鍵是用來識別值組的,不可有重覆值 且可能發生插入與刪除運算時的相同問題 若修改「外來鍵」,要確定新的資料值在被參考關聯中存在(或是NULL) 資料庫管理