設計過程概覽
1. 設計階段
·最初階段:刻畫未來數據庫用戶的數據需求,產品為用戶需求規格說明;
·概念設計階段(conceptual-design phase):(關注描述抽象數據及其聯系,通常使用實體-聯系模型)
概念模式:定義數據庫中表示的實體、實體的屬性、實體之間的聯系以及實體和聯系上的約束。
概念設計階段需要完成
1. 選擇數據模型,并采用所選數據模型的概念將需求轉化為數據庫的概念模式
2. 指明企業的功能需求,完善概念模式:在功能需求規格說明(specification of functional requirement)中描述在數據上進行的各類操作/事務。
設計者檢查概念模式確保功能需求滿足、所有數據需求都滿足且互相不沖突;
·邏輯設計階段(logical-design phase):將(通常以實體-聯系模型定義)高層概念模式映射到數據庫系統的(通常為關系數據模型的)實現數據模型上。
·物理設計階段(physical-design phase):指明數據庫的物理特征(包括文件組織格式和索引結構的選擇)。
?
2. 設計選擇
設計數據庫模式時必須避免兩個主要缺陷:
·冗余:重復存儲信息;
·不完整
?
?
實體-聯系模型
數據庫的設計主要涉及數據庫模式的設計。E-R數據模型是一個廣泛用于數據庫設計的數據模型,提供了一個方便的圖形化表示方法以查看數據、聯系和約束。
實體-聯系(entity-relationship, E-R)模型采用三個基本概念:實體集、聯系集、屬性。
1. 實體集
數據庫包括一組實體集,每個實體集包括任意數量的相同類型的實體。
實體是在現實世界中存在并且區別于其他對象的對象。我們通過把每個實體痛描述該實體的一組屬性相關聯來表示區別。相同類型的實體的集合為實體集。
實體(entity):現實世界中可區別于所有其他對象的一個”事物“或”對象“。每個實體有一組性質,其中一些性質的值可以唯一地標識一個實體。實體可以是實在或抽象的。
實體集(entity set):相同類型(具有相同性質/屬性)的一個實體集合。(e.g. 一所給定大學的所有教師的集合定義為實體集instructor)
實體集不必互不相交。(e.g. 一個person實體可以是instructor實體、或student實體、或既是instructor實體又是student實體、或都不是。)
外延(extension):實體集的外延指術語實體集的實體的實際集合。(e.g. 大學中實際教師的集合構成了實體集instructor的外延)
?
屬性(attribute):實體集中每個成員所擁有的描述性性質。
實體通過一組屬性來表示;
為某實體集指定一個屬性表明數據庫為該實體集中每個實體存儲相似的信息,但每個實體在每個屬性上都有各自的值(value)。
?
2. 聯系集
聯系是多個實體間的關聯。相同類型的聯系的集合為聯系集。
聯系(relationship):多個實體間的相互關聯。
聯系集(relationship set):相同類型聯系的集合。
聯系集是n≥2個(可能相同的)實體集上的數學關系。聯系集R是
{ (e1, e2, …, en) | e1∈E1, e2∈E2, …, en∈En } 的一個子集,其中E1, E2, …, En為實體集,(e1, e2, …, en)為一個聯系。
參與:實體集之間的關聯。(e.g. 實體集E1, E2, …, En參與(participate)聯系集R。)
相同的實體集可能會參與到多于一個聯系集中。
二元(binary)聯系集:設計兩個實體集的聯系集。數據庫系統中的大部分聯系集都是二元的,有時聯系集會涉及多于兩個實體集。
度(degree):參與聯系集的實體集的數目稱為聯系集的度。(e.g. 二元聯系集的度為2,3元聯系集的度為3。)
角色(role):實體在聯系中扮演的功能稱為實體的角色。(隱含,一般并不指定。)
在自環(recursive,i.e. 同樣的實體集以不同角色參與一個聯系集多于一次)聯系集中,有必要使用顯式的角色名指明實體是如何參與聯系實例的。
聯系也可具有描述性屬性(descriptive attribute)。(e.g. 實體集instructor和student之間的聯系集advisor,可將屬性date作為描述性屬性與該聯系關聯。)
聯系實例(relationship instance):E-R模式中的一個聯系實例表示所在建模的現實世界企業中命名實體的一個關聯。(e.g. 一個教師ID為45565的instructor實體Katz和一個學生ID為12345的student實體Shankar參與到advisor的一個聯系實例中)
給定的聯系集中的一個聯系實例必須是由其參與實體唯一標識的(不必使用描述屬性)。
?
3. 屬性
域(domain)/值集(value set):每個屬性都有的一個可取值的集合。
實體集的屬性是將實體集映射到域的函數,每個實體可以用一組(屬性,數據值)對來表示。
?
E-R模型中的屬性可進行如下劃分:
·簡單(simple)屬性/復合(composite)屬性:
簡單屬性不能劃分為更小的部分;
復合屬性可以劃分為更小的部分(其他屬性)。(e.g. 屬性name可設計為一個包括first_name、middle_initial和last_name的復合屬性) 復合屬性可以有層次,子屬性可進一步劃分。
·單值(single-alued)屬性/多值(mutivalued)屬性:
單值屬性對一個特定的實體都只有單獨的一個值;
多值屬性對一個特定的實體有對應的一組值。用花括號表示屬性是多值的。(e.g. instructor實體集可有{ phone_number }屬性,每個教師可以有0到多個電話號碼。) 可對多只屬性的取值數目設置上、下界。
·派生(derived)屬性:可從別的相關屬性或實體派生出來。(e.g. instructor實體集可有屬性student_advised表示一個教師指導了多少個學生,可通過統計與一個教師相關聯的所有student實體的數目來得到該屬性的值) 派生屬性的值不進行存儲,而是在需要時計算出來。
基屬性:存儲的屬性
?
?
約束
1. 映射基數
映射基數(mapping cardinality)/基數比率:表示一個實體通過一個聯系集能關聯的實體的個數。(可用于描述二元聯系集和涉及多于兩個實體集的聯系集)
對于實體A和B之間的二元聯系集R,映射基數必然是以下情況之一:
·一對一(one-to-one):A中的一個實體至多與B中的一個實體相關聯,B中的一個實體也至多與A中的一個實體相關聯;
·一對多(one-to-many):A中的一個實體可與B中任意數目(0到多個)實體相關聯,B中的一個實體至多與A中的一個實體相關聯;
·多對一(many-to-one):A中的一個實體至多與B中的一個實體相關聯,B中的一個實體可與A中任意數目實體相關聯;
·多對多(many-to-many):A中的一個實體可與B中任意數目實體相關聯,B中的一個實體可與A中任意數目實體相關聯。
?
2. 參與約束
如果實體集E中的每個實體都參與到聯系集R的至少一個聯系中,實體集E在聯系集R中的參與稱為全部的(total);
如果實體集E中只有部分實體參與到聯系集R的聯系中,實體集E到聯系集R的參與稱為部分的(partial)。
?
3. 碼
一個實體的屬性值必須可以唯一標識該實體。(在一個實體集中不允許兩個實體對于所有屬性都具有完全相同的值)
碼:實體的碼是一個足以區分每個實體的屬性集。(關系模式匯總的超碼、候選碼、主碼同樣適用于實體集)
術語超碼(superkey)、候選碼(candidate key)以及主碼(primary key)同適用于關系模式一樣適用于實體集合聯系集。
碼也可用于唯一地標識聯系。
設一個涉及實體集E1, E2, …, En的聯系集R,primary-key(Ei)代表構成實體集Ei的主碼的屬性集合(假設實體集中所有主碼屬性名互不相同)。
a. 如果R沒有屬性與之相關聯,則屬性集合
primary-key(E1)∪primary-key(E1)∪…∪primary-key(En)
描述了集合R中的一個聯系;
b. 如果R有屬性a1, a2, …, am與之相關聯,則屬性集合
primary-key(E1)∪primary-key(E1)∪…∪primary-key(En)∪{ a1, a2, …, am }
描述了集合R中的一個聯系。
在以上兩種情況中,屬性集合
primary-key(E1)∪primary-key(E1)∪…∪primary-key(En)
構成了聯系集的一個超碼。(如果實體集中主碼屬性名有重名情況可重命名構成唯一名稱以區分。)
?
聯系集的主碼結構依賴于聯系集的映射基數。
e.g. 考慮實體集instrutor、student和具有屬性date的聯系集advisor。
a. 假設聯系集是多對多的,則advisor的主碼由instructor和student的主碼的并集組成;
b. 如果聯系是從student到instructor多對一的,則student的主碼就是advisor的主碼;
c. 如果聯系是從instructor到student多對一的,則instructor的主碼就是advisor的主碼;
d. 如果聯系集是一對一的,則兩個候選碼中的任意一個可用作主碼。
?
4. 從實體集中刪除冗余屬性
建立實體間的聯系集,可能會導致不同實體集中的屬性冗余,則需要將冗余的屬性從原始實體集中刪除,用E-R設計中的聯系代替冗余的屬性。
e.g.
關系模式設計:
實體集instructor (ID, name, dept_name, salary);
實體集department (dept_name, building, budget);
分析:
屬性dept_name在實體集instructor中冗余,移除。
實體-聯系設計:
實體集instructor (ID, name, salary);
實體集department (dept_name, building, budget);
聯系集inst_dept關聯instructor和department。
類似,實體集student中不需要dept_name屬性,聯系集student_dept關聯student和department。
?
e.g.
關系模式設計:
實體集section (course_id, sec_id, semester, year, building, room_number, time_slot_id);
實體集time_slot (time_slot_id, { (day, start_time, end_time) } );
實體集classroom (building, room_number, capacity);
分析:
屬性time_slot_id在實體集section中冗余,移除。
屬性{ building, room_number}在實體集section中冗余,移除。
實體-聯系設計:
實體集section (course_id, sec_id, semester, year);
實體集time_slot (time_slot_id, { (day, start_time, end_time) } );
實體集classroom (building, room_number, capacity);
聯系集sec_time_slot關聯section和time_slot;
聯系集sec_class關聯section和class。
?
實體-聯系圖
E-R模型主要用于數據庫設計過程,它的發展是為了幫助數據庫設計,這是通過允許定義企業模式(enterprise schema)實現的。這種企業模式代表數據庫的全局邏輯結構,該全局結構可用E-R圖(E-R diagram)圖形化地表示。
E-R圖(E-Rdiagram)可圖形化表示數據庫的全局邏輯結構。
?
1. 基本結構
E-R圖的主要構件:
·分割為兩部分的矩形:代表實體集。第一部分(有陰影)包含實體集的名字,第二部分包含實體集中所有屬性的名字;
·菱形:代表聯系集;
·未分割的矩形:代表聯系集的屬性。構成主碼的屬性以下劃線標明;
·線段:將實體集連接到聯系集;
·虛線:將聯系集屬性連接到聯系集;
·雙線:顯示實體在聯系集中的參與度;
·雙菱形:代表連接到弱實體集的標志性聯系集。
e.g.?
?
?
?
?
2. 映射基數
二元聯系集可以是一對一、一對多、多對一或多對多的,聯系集和實體集之間畫箭頭或線段以區分這些類型。
·一對一:當實體集A中的一個實體最多只能與實體集B中的一個實體關聯,并且實體集B中的一個實體也最多只能與實體集A中的一個實體關聯時,從聯系集向實體集A和B各畫一條箭頭;
·一對多:當實體集A中的一個實體可與實體集B中任意數目的實體關聯,但實體集B中的一個實體最多只能與實體集A中的一個實體關聯時,從聯系集向實體集A畫一條箭頭,向實體集B畫一條線段;
·多對一:當實體集A中的一個實體最多只能與實體集B中的一個實體關聯,但實體集B中的一個實體可與實體集A中任意數目的實體關聯時,從聯系集向實體集A畫一條線段,向實體集B畫一條箭頭;
·多對多:當實體集A中的一個實體可與實體集B中任意數目的實體關聯,實體集B中的一個實體也可與實體集A中任意數目的實體關聯時,從聯系集向實體集A和B各畫一條線段。
e.g.
(一對多:一名教師可以指導多名學生,但一名學生可以至多有一位導師。)
?
?
E-R圖提供描述“每個實體參與聯系集中聯系的次數約束”的方法:
實體集和二元聯系集之間的一條邊可以有一個關聯的最大和最小的映射基數,用l..h表示。其中l為最小映射基數,h為最大映射基數。
l=1時表示這個實體集在該聯系集中全部參與(每個實體在聯系集中的至少一個聯系中出現);
h=1時表示這個實體參與至多一個聯系;
最大值為*,表示沒有限制。
e.g. 約束每個學生必須有且僅有一個導師,教師可以有零個或多個學生。
(從instructor到student的一對多聯系,student在advisor聯系中的參與是全部的。)
另一種畫法:在基數約束的位置畫一條從student到advisor的雙線,以及一條從advisor到instructor的箭頭。
?
3. 復合屬性、多值屬性、派生屬性的表示
e.g.?
實體集instructor包含:
復合屬性name,由子屬性first_name、middle_initial和lastname組成;
復合屬性address,由子屬性street、city、state和zipcode組成,其中street也是符合屬性,其子屬性為street_number、street_name和apartment_number;
多值屬性phone_number,由{ phone_number }表示;
簡單屬性date_of_birth;
派生屬性age,由{ aget( ) }表示。
?
4. 角色
通過在菱形和矩形之間的連線上進行標注來表示角色。
e.g. course實體集合prereq聯系集之間的角色標識course_id和prereq_id
?
5. 非二元聯系集
e.g. 三個實體集instructor、student和project通過聯系集proj_guide相關聯。
在非二元聯系集中可表示某些類型的多對一聯系。(e.g. 假設一個student在每個項目上最多只能有一位導師,可用從project_guide的邊指向instructor的箭頭表示。)
在一個非二元聯系集外包含兩個或更多箭頭的E-R圖可有兩種解釋:
(假設實體集A1, A2, …, An之間有聯系集R,并且只有指向實體集Ai+1, Ai+2, …, An的邊是箭頭。)
a. 來自A1, A2, …, Ai的實體的一個特定組合可以與至多一個來自Ai+1, Ai+2, …, An的實體組合相關聯。因此聯系R的主碼可用A1, A2, …, Ai的主碼的并集來構造。
b. 對于每個實體集AK, i<k≤n, 來自其他實體集的實體的每個組合可以和來自AK的至多一個實體相關聯。因此對于i<k≤n,每個集合{ A1, A2, …, Ak-1, Ak+1, …, An }構成一個候選碼。
因為以上兩種解釋在不同的書/系統中使用,為避免混淆,我們規定在一個非二元聯系集外只允許有至多一個箭頭。
?
6. 弱實體集
弱實體集(weak entity set):不具有足夠的屬性構成主碼的實體集。
有主碼的實體集則稱作強實體集(strong entity set)。
e.g.
情況:
實體集section由course_id, semester, year, sec_id唯一標識;
實體集course 由course_id唯一標識;
(i.e. 不同course的section可能會有相同的sec_id、year和semester。)
聯系集sec_course關聯section和course。
分析:
因為section已有屬性course_id,sec_course中信息冗余。
如果刪除聯系sec_course會使section和course的聯系隱含于一個屬性中,不合適。
如果刪除section中的屬性course_id,則剩下的屬性不足以唯一標識一個指定的section實體;
處理方法:
刪除section中的屬性course_id,標志性聯系sec_course關聯弱實體集section與其標識實體集course,
給唯一標志的section實體提供額外信息course_id。
?
標識實體集(identifying entity set)/屬主實體集(owner entity set):一個弱實體集必須與一個標識實體集關聯才有意義。每個弱實體集必須和一個標識實體關聯。
弱實體集存在依賴(existence dependent)于標識實體集,標識實體集擁有(own)它所標識的弱實體集。
?
標志性聯系(identifying relationship):將弱實體集與其標識實體集相聯的聯系。
標志性聯系是從弱實體集到標識實體集多對一的,弱實體集在聯系中參與是全部的。
標志性實體集不應該有任何描述性屬性。
?
分辨符(discriminator):弱實體集的分辨符,也成為弱實體集的部分碼,是用于區分依賴于特定強實體集的弱實體集中的實體的屬性集合。
e.g. 弱實體集section的分辨符{ sec_id, year, semester },對每個course來說,該屬性集唯一標識了該course對應的一個section。(用于區分同一course的不同section實體)
弱實體集的主碼由標識實體集的主碼加該弱實體集的分辨符構成。
e.g. 弱實體集section的主碼{ course_id, sec_id, year, semester }由標識實體集course的主碼course_id加其分辨符{ course_id, sec_id, year, semester }構成。
?
E-R圖中,弱實體集以矩形表示(類似強實體集),其分辨符以虛下劃線標明,關聯弱實體集和標識性強實體集的聯系集以雙菱形表示。雙線表示參與是全部的。
e.g. 弱實體集section通過聯系集sec_course依賴于強實體集course,弱實體集section在聯系sec_course中的參與是全部的,每次section與單門course相關聯。
弱實體集可以參與標識性聯系以外的其他聯系;
弱實體集可以作為屬主與另一個弱實體集參與一個標識性聯系;
一個弱實體集可能與不止一個標識實體集關聯(i.e. 一個特定的弱實體將被一個實體的組合標識,其中每個標識實體集有一個實體在該組合中,弱實體集的主碼則由標識實體集的主碼的并集加弱實體集的分辨符組成)。
?
如果弱實體集只參與標識性聯系,并且屬性不多,則建模時適合將其表示為屬主實體集的一個多值復合屬性;
如果若實體集參與到標識性聯系以外的聯系中,或屬性較多,則建模時適合將其表示為弱實體集。
?
E-R圖轉換為關系模式
對于每個實體集/聯系集,都有唯一的關系模式與之對應,關系模式名為相應的實體集或聯系集的名稱。所以,一個符合E-R數據庫模式的數據庫可表示為一些關系模式的集合。
?
1. 具有簡單屬性的強實體集的表示
設E為只具有n個簡單描述性屬性的強實體集,則用具有n個不同屬性的關系模式E表示。
關系中的每個元組都對應于實體集中的一個特定實體。
如果實體集為強實體集,則其轉換得到的關系模式的主碼就是強實體集的主碼。
?
2. 具有復雜屬性的強實體集的表示
如果強實體集具有復合屬性,關系模式中不為復合屬性自身創建一個單獨的屬性,而為復合屬性的每個子屬性創建一個單獨的屬性。
e.g.
對于復合屬性name,模式包括first_name, middle_initial, lastname,沒有單獨的屬性表示name;
對于復合屬性address,模式包括street, city, state, zip_code,因為street是一個復合屬性,將其替換為子屬性street_number, street_name, apt_number。
?
多值屬性不能直接映射到相應關系模式的屬性上,需要為多值屬性創建新的關系模式。
對于實體集的一個多值屬性M,構建關系模式R,該模式包含一個對應于M的屬性A以及對應于M所在的實體集或聯系集的主碼的屬性。
R的主碼由其所有屬性組成。
R上外碼約束:由M所在實體集的主碼所生成的屬性參照M所在實體集所生成關系。
e.g. 實體集Instructor主碼為ID,包含多值屬性phone_number。為phone_number構建關系模式:
instructor_phone(ID, phone_number)。Instructor_phone關系上有外碼約束:屬性ID參照instructor關系。
特殊情況:實體集只有兩個屬性,一個主碼B和一個多值屬性M。則該實體集的關系模式只包含一個屬性(主碼屬性B)。也可刪掉該關系,保留具有屬性B和對應M的屬性A的關系模式。)
e.g. 實體集time_slot含主碼time_slot_id和多值復合屬性{day, start_time, end_time},可生成關系模式time_slo t(time_slot_id, day, start_time, end_time)。
?
派生屬性不在關系模式中顯示表示,可在類似對象-關系數據模型的其他數據模型中表示為方法。
?
3. 弱實體集的表示
設A為具有屬性a1, a2, …, am的弱實體集,B為A所依賴的強實體集,B的主碼包括屬性b1, b2, …, bn。則:關系模式A的每個屬性對應集合{ a1, a2, …, am }∪{ b1, b2, …, bn }的一個成員;
該模式的主碼由B的主碼與A的分辨符組成;
關系A上建立外碼約束:屬性b1, b2, …, bn參照關系B的主碼。(保證弱實體的每隔元組都有一個表示相應強實體的元組與之對應)。
可添加外碼約束上的級聯刪除規范,如果弱實體集A依賴的強實體集B中的一個實體被刪除,那么所有與它關聯的A實體也被刪除。
?
4. 聯系集的表示
設R為聯系集,a1, a2, …, am為所有參與R的實體集的主碼的并集構成的屬性集合,b1, b2, …, bn為R的描述性屬性。則關系模式R的每個屬性對應集合{ a1, a2, …, am }∪{ b1, b2, …, bn }的一個成員。
二元聯系集關系模式主碼的選擇:
·多對多:參與實體集的主碼屬性的并集;
·一對一:任意一個實體集的主碼;
·多對一或一對多:聯系集中“多”的那一方實體集的主碼。
n元聯系集關系模式主碼的選擇(聯系集外至多允許一個箭頭):
·邊上沒有箭頭:所有參與實體集的主碼屬性的并集;
·邊上有一個箭頭:不在“箭頭”側的實體集的主碼屬性;
?
對于每個與聯系集R相關的實體集Ei,建立一個關系模式模式R上的外碼約束:R中來自Ei主碼屬性的那些屬性參照關系模式Ei的主碼。
?
模式的冗余
連接弱實體集與其所依賴的強實體集的聯系集比較特殊,一般情況下其關系模式冗余,在基于E-R圖的關系數據庫設計中不必給出。
?
模式的合并
設從實體集A到實體集B的一個多對一聯系集AB,構建三個關系模式A、B、AB。如果A在該聯系中的參與是全部的(i.e. 實體集A中的每個實體都參與到聯系AB中),則可將模式A和模式AB合并為單個包含兩個模式所有屬性并集的模式。合并后模式的主碼為被合并的那個實體集的主碼。
e.g.
從instructor到department的聯系集inst_dept。
instructor { ID, name, salary };
department { dept_name, building, budget };
inst_dept {ID, dept_name };
模式instructor可與模式Inst_dept合并,得到模式instructor{ ID, name, dept_name, salary }。
即使實體集A在聯系中的參與是部分的,也可使用控制來進行模式的合并。(e.g. 例中如果instructor在inst_dept部分參與,可為沒有相關聯的department的instructor在屬性dept_name中存放空值。)
合并后,舍棄聯系集上參照實體集A的外碼約束,將參照實體集B的外碼約束加到合并后的關系模式中。(e.g. 例中將原inst_dept上dept_name屬性參照department的外碼約束加到合并后的insructor關系中。)
如果聯系是一對一的,聯系集的關系模式可以跟參與聯系的任何一個實體集的關系模式合并。
?
?
實體-聯系設計問題
1. 用實體集還是用屬性
e.g. 給instructor增加phone的兩種方法
?
如果希望保存電話的額外信息(位置、類型、共享改電話的所有的人等),將電話看做實體的建模方式根據有通用性。
常見錯誤1:用一個實體集的主碼作為另一個實體集的屬性,而不是用聯系。×
應當明確表示出實體集之間的關系,而不是將關系隱含在屬性中。
e.g.
將student的ID作為instructor的屬性(即使一對一)×
將advisor聯系代表student和instructor之間的關聯。√
?
常見錯誤2: 將相關實體集的主碼屬性作為聯系集的屬性。×
因為在聯系集中已經隱含了這些主碼屬性。
注意:當從E-R模式創建關系模式時,這些屬性可能會出現在聯系集的關系模式中,但不應該出現在E-R模式的聯系集中。
e.g.
將student的ID和instructor的ID作為advisor聯系的屬性。 ×
?
2. 用實體集還是聯系集
原則:當描述發生在實體間的行為時采用聯系集。
e.g. 用實體集registration代表課程-注冊記錄,替代student和section之間的聯系集takes。
?
一般使用聯系集takes更緊湊可取。如果課程-注冊記錄與其他信息相關聯則適合作為實體集。
?
3. 二元還是n元聯系集
一個n元(n>2)的聯系集總能用一組不同的二元聯系集替代。
E.g. 用實體集E和聯系集RA、RB、RC替代三元聯系集R。【可推廣到n元聯系集】
?
如果聯系集R有屬性,則將這些屬性賦給實體集E,并為E創建一個特殊的標識屬性(用于區分E中的各個實體)。
針對聯系集R中的每個聯系(ai, bi, ci)在實體集E中創建一個新的實體ei。
在三個聯系集中插入聯系:在RA中插入(ei, ai);在RB中插入(ei, bi);在RC中插入(ei, ci)。
在概念上可以限制E-R模型只包含二元聯系集,但這種做法也存在一些劣勢:
·對為表示聯系集而創建的實體集,必須創建一個標志屬性,增加了設計的復雜程度和對存儲空間的需求;
·n元聯系集可以更清晰地表示幾個實體集參與單個聯系集;
·有些三元聯系集上的約束不能轉變為二元聯系上的約束。
?
4. 聯系屬性的布局
一個聯系的映射基數的比率會影響聯系屬性的布局:
·一對多的聯系集的屬性可以從聯系集中移除,放到參與聯系的“多”方的實體集中;
·一對一的聯系集的屬性可以從聯系集中移除,放到任意一個參與聯系的實體集中。
e.g. 設從實體集instructor到實體集student一對多的聯系集advisor,其屬性date可放在student實體集中(與原先放在advisor中具有相同含義)。
設計時將描述性屬性作為聯系集的屬性還是實體集的屬性,取決于被建模企業的特點。(e.g. 例中也可選擇保留date作為advisor的屬性以顯式表明指導關系的日期。)
(多對多)當一個屬性是由參與的實體集聯合確定,而不是由單獨某個實體集確定時,該屬性就必須放在多對多聯系集中。
?
?
擴展的E-R特性
特化和概化定義了一個高層實體集和一個或多個低層實體集之間的包含關系。特化是取出高層實體集的一個子集來形成一個低層實體集。概化是用兩個或多個不想交的(低層)實體集的并集形成一個高層實體集。高層實體集的屬性被低層實體集繼承。
1. 特化
特化(specialization):在實體集內部進行分組的過程。
e.g. 實體集person可進一步特化為employee類和student類,特化實體集用一個包括實體集person的所有屬性和可能的附加屬性的屬性集來描述。(employee實體可進一步用屬性salary描述;student實體可進一步用屬性tot_cred描述。)
一個實體集可以根據多個可區分的特征進行特化。當一個實體集形成了多于一種特化時,某個特定實體集可能同時屬于多個特化實體集。
e.g. 實體集employee可根據從事工作特化,也可根于工作任期特化,因此一個特定的employee可以既是temporary_employee又是secretary_employee。
E-R圖中用從特化實體指向另一方實體的空心箭頭表示特化,稱為ISA關系,代表”is a”。(e.g. instructor “ is a” employee.)
重疊特化(overlapping specialization):一個實體集可能屬于多個特化實體集。對于一個重疊特化(e.g. student和employee作為person的特化),分開使用兩個箭頭。
不相交特化(disjoint specialization):一個實體集必須屬于至多一個特化實體集,對于一個不相交特化(e.g. instructor和secretary作為employee的特化),使用一個箭頭。
特化關系可能形成超類-子類(superclass-subclass)聯系。
高層和低層實體集按普通實體集表示(包含實體集名稱的矩形)。
?
2. 概化
概化(generalization):高層實體集與一個或多個低層實體集間的包含關系。低層實體集間存在共性(包含相同的屬性),這些屬性被賦予相同的名字并由高層實體集表示。
高層與低層實體集也分別稱作超類(superclass)和子類(subclass)。
概化不是特化的逆過程。特化和概化的區別在于出發點和總體目標:
特化:從單一實體集出發,通過創建不同的低層實體集來強調同一實體集中不同實體間的差異。低層實體集可以有不適用于高層實體集中所有實體的屬性,也可以參與到不適用于高層實體集中所有實體集的聯系中。
概化:基于“一定數量的實體集共享一些共同特征(用相同的屬性描述,且參與到相同的聯系集中)”。在這些實體集共性的基礎上將它們總和成一個高層實體集,用于強調低層實體集間的相似性并隱藏差異。
(概化使共享屬性不重復出現,表達簡潔。)
?
3. 屬性繼承
屬性繼承(attribute inheritance):由特化和概化所產生的高層實體和低層實體的一個重要特性,高層實體集的屬性被低層實體集繼承(inherit)。
屬性繼承適用于所有低層實體集。
e.g.
實體集person用屬性ID、name和address描述;
實體集student繼承person的屬性,用屬性ID、name和adress,以及附加屬性tot_cred描述;
實體集employee繼承person的屬性,用屬性ID、name和address,以及附加屬性salary描述;
employee的子類instructor和secretary從person繼承屬性ID、name和address,又從employee繼承屬性salary。
參與繼承:低層實體集(子類)也同時繼承地參與其高層實體集(超類)所參與的聯系集。參與繼承也適用于所有低層實體集。
e.g.
實體集person和department參與person_dept聯系集;
person的子類student、employee、instructor和secretary也都和department隱式地參與到person_dept聯系中。
對于E-R圖的一個給定部分(無論是通過特化還是概化得到的),都具有以下性質:
·高層實體集所關聯的所有屬性和聯系適用于它所有的低層實體集;
·低層實體集特有的性質僅適用于特定的低層實體集。
?
在實體集的層次結構中:
如果一個實體集作為低層實體集只參與到一個ISA聯系中,則稱這個實體集只具有單繼承(single inheritance);
如果一個實體集作為低層實體集參與到多個ISA聯系中,則稱這個實體集具有多繼承(multiple inheritance),且產生的結構稱為格(lattice)。
?
4. 概化上的約束
可在特定概化上設置三類約束。
a. 涉及”判定哪些實體能成為給定低層實體集的成員”的約束。成員資格可以是下列其中一種:
·條件定義的(condition-defined):在條件定義的低層實體集中,成員資格的確定基于實體是否滿足一個顯式的條件或謂詞。
e.g.
設高層實體集student具有屬性student_type,所有student實體都根據student_type屬性進行評估;
滿足條件student_type=”graduate”的實體屬于graduate低層實體集;
滿足條件student_type=”undergraduate”的實體屬于undergraduate低層實體集。
·用戶定義的(user-defined):在用戶定義的低層實體集中,由數據庫用戶將實體指派給某個實體集。
(負責決策的用戶根據個人觀點進行分配,執行將一個實體加入某個實體集的操作。)
b. 涉及”在一個概化中一個實體是否可以屬于多個實體集“的約束。低層實體集可以是下列其中一種:
·不相交(disjoint):要求一個實體至多屬于一個低層實體集。
·重疊(overlapping):同一實體可以同時屬于同一概化中的多個實體集。
使用分開的箭頭表示重疊概化,單個箭頭表示不相交概化。
e.g.
一個person可以既是employee又是student,使用分開的箭頭表示重疊概化。一個箭頭從employee指向person,一個箭頭從student指向person;
一個employee不能既是instructor又是secretary,使用單個箭頭表示不相交概化,從instructor和secretary指向employee。
?
c. 對概化的完全性約束(completeness constraint)。定義高層實體集中的一個實體是否必須至少屬于該概化/特化的一個低層實體集。此類約束可以是下列其中之一:
·全部概化(total generalization)或特化(specialization):每個高層實體必須屬于一個低層實體集。
·部分概化(partial generalization)或特化(specialization):允許一些高層實體不屬于任何低層實體集。
默認情況下為部分概化。如果需要表示全部概化,可在E-R圖中加入關鍵詞total,并畫一條從關鍵詞到相應空心箭頭(表示不相交概化)的虛線,或畫一條到空心箭頭集合(表示重疊概化)的虛線。
?
完全性約束和不相交約束彼此沒有依賴關系。
對給定概化或特化使用約束帶來某些插入和刪除需求。
?
5. 聚集
聚集是一種抽象。其中聯系集(和跟它們相關的實體集一起)被看作高層實體集,并且可以參與聯系。
聚集(aggregation):將聯系視為高層實體的一種抽象。高層實體集可像對任何其他實體集一樣處理。
e.g.
三元聯系集proj_guide關聯實體集Instrucotor、student和project。四元聯系集eval_for關聯實體集evaluation和instructor、student、project和evaluation。
?
分析:
聯系集proj_guide和eval_for不能合并,因為一些(instructor, student, project)組合可能沒有相關聯的evaluation;
存在冗余信息,eval_for中的每個(instructor, student, project)組合一定也在proj_guide中,但E-R模型存在局限,不能表達聯系間的聯系;
可將evaluation可作為proj_guide的一個多值屬性,但如果evaluation需要和其他實體關聯時不可行。
處理方法:
使用聚集,將聯系集proj_guide(關聯實體集instructor、student和project)看做一個名為proj_guide的高層實體集;
在高層實體集proj_guide和evaluation創建二元聯系eval_for,表示某個evaluation對應哪個(student, project, instructor)組合。
?
?
6. 將擴展E-R特性轉換為關系模式
1)概化
方法一 一般采用:
為高層實體集創建關系模式,屬性對應高層實體集的屬性;為低層實體集創建關系模式,屬性對應高層實體集主碼屬性和低層實體集的屬性。
高層實體集的主碼屬性既是高層實體集的主碼屬性,也是所有低層實體集的主碼屬性。
在低層實體集上建立外碼約束,其主碼屬性參照創建自高層實體集的關系的主碼。
e.g.
person (ID, name, address);
employee (ID, salary);
student (ID, tot_cred);
方法二 如果概化不相交且完全(不存在同時屬于兩個同級低層實體集的實體,且高層實體集的任何實體也都是某個低層實體集的成員),則采用:
不需要為高層實體集創建任何模式;只為每個低層實體集創建一個模式,模式中的屬性包括高層實體集的屬性和低層實體集的屬性;
高層實體集的主碼屬性作為低層實體集的主碼屬性。
缺點:定義外碼屬性時可能存在問題,如果有與高層實體集相關的聯系集,當從該聯系集創建關系模式時需要建立參照高層實體集的外碼約束,無法參照單一的一個關系。
e.g.
employee (ID, name, address, salary);
student (ID, name, address, tot_cred);
2)聚集
?將聚集A看做整個實體集,將關聯聚集與另一對應實體集B的聯系集C轉換為關系模式。關系模式C包含:實體集B的主碼屬性、定義該聚集的聯系集A‘的主碼屬性、聯系集C的任意描述性屬性(如果存在)。
根據已有規則,將聚集A中的實體集和聯系集A’轉換為關系模式;
將聚集A看做整個實體集,根據已有規則,在于聚集A關聯的聯系集C上創建主碼和外碼約束;
只需從定義該聚集的聯系集A’創建的關系模式,不需要單獨的關系表示聚集A。
?
?
數據建模的其他表示法
?
1. E-R圖的其他表示法
?
實體屬性可放入與表示實體的方框所連接的橢圓中,主碼屬性以下劃線標明;
聯系屬性可放入與表示聯系的菱形所連接的橢圓中;
聯系上的基數約束可用在聯系外面標記*和1表示;
聯系集可用實體集之間的連線表示(只能表示二元聯系)。“鴉爪形”表示基數約束,連線兩側是否使用鴉爪決定聯系為一對一/一對多/多對一/多對多,對側為豎線表示全部參與,對側為圓圈表示部分參與;
概化可用三角形代替空心箭頭表示;
?
2. 統一建模語言UML
UML是一種常用的建模語言。UML類圖廣泛用于對類建模以及一般的數據建模。
統一建模語言(Unified Modeling Language, UML):為建立軟件系統的不同部分的規范定義而提出的一個標準。組成部分包括
·類圖(class diagram):類似ER圖;
·用況圖(use case diagram):說明用戶和系統之間的交互,特別是用戶所執行任務中的每一步操作;
·活動圖(activity diagram):說明系統不同部分之間的任務流;
·實現圖(implementation diagram):在軟件構件層和硬件構件層說明系統的各組成部分以及它們之間的聯系。
對象:UML類圖為對象建模,對象類似實體,包含屬性和方法。類圖可以說明對象的屬性和方法。
方法:UML類圖中另外提供的一組函數,可在對象屬性的基礎上調用以計算值,或更新對象本身。
UML類圖不支持復合或多值屬性,派生屬性與不帶參數的函數等價;
UML類圖支持封裝,允許函數和屬性帶有前綴”+”、”-“或”#”,分別表示公共、私有以及受保護的訪問。私有屬性只能在類的方法中使用,受保護的屬性只能在類和它的子類的方法中使用。
關聯(association):在UML類圖中聯系集稱為關聯。通過畫一條線段連接實體集表示二元聯系集,聯系集的名稱寫在線段附近。可用以下兩種方式說明聯系集:
a. 可將角色名稱寫在靠近實體集的線段上,說明聯系集中一個實體集的角色;
b. 可將聯系集的名字和屬性一起寫在方框里,用虛線將該方框連接到表示聯系集的連線上。該方框可看作一個實體集,可與其他實體一起參與聯系。
從UML1.3開始,UML支持菱形表示法表示非二元聯系。即使對于二元聯系,UML也允許使用菱形表示法,但大部分設計者使用線段表示法。
?
UML中使用l..h形式表示基數約束,i表示參與聯系的實體的最小個數,h表示最大個數。但約束位置與E-R圖中正好相反。
e.g.
E2邊上的約束0..*和E1邊上的0..1表示每個E2實體可以參與至多一個聯系,而每個E1實體可以參與任意多的聯系,即該聯系是從E2到E1多對一的。
可將單個值(如1或*)卸載邊上,單個值1等價1..1,單個值*等價0..*。
?
UML類圖支持概化,與E-R圖基本相同,包括不想交概化和重疊概化的表示方式。
?
UML類圖還包含一些與E-R表示法并不對應的表示法。
e.g. 連接兩個實體的一條線的一端有一個小菱形,表示菱形這一端的實體集包含另一個實體集(e.g. 一個車輛實體可能包含一個發動機實體)。(包含關系在UML中稱為”聚合“,注意不應與E-R圖中的聚合的含義混淆。)
UML類圖還提供表示面向對象語言的特征的表示法(e.g. 接口)。
?
數據庫設計的其他方面
除模式設計外,數據庫設計還包含其他組成部分。
1. 數據約束和關系數據庫設計
?
2. 使用需求:查詢、性能
數據庫處理效率的兩個主要度量方法:(兩個度量并不等價)
·吞吐量(throughput):每單位時間里能夠處理的查詢或更新(通常指事務)的平均數量。
以批量方式處理大量事務的系統(e.g. 大多數商用數據庫系統)通常關注于達到高吞吐量。高吞吐量的目的在于獲得系統部件的高利用率,但可能會導致某些事務延遲。
·響應時間(response time):單個事務從開始到結束所需的平均時間或最長時間。
與人交互或時間苛刻的系統(e.g. 基于Web的應用和電信信息系統的用用)通常關注與響應時間。
?
涉及連接的查詢比不涉及連接的查詢需要更多的資源用以計算,可選擇創建索引以加快連接的計算;
對于查詢(不論是否涉及連接),可創建索引以加速頻繁出現在查詢中的選擇謂詞(where子句)的計算;
因為更新會為維護索引的準確性而強制帶來額外工作,當一個索引加速查詢的同事也可能減緩更新的速度。
?
3. 授權需求
?
4. 數據流、工作流
工作流:表示一個流程中的數據和任務的組合。
當工作流在用戶間移動以及用戶執行他們在工作流中的任務時,工作流會與數據庫系統交互。
數據庫可以存儲工作流操作的數據和工作流自身的數據(構成工作流的任務、在用戶之間移動的路徑)。
?
5. 數據庫設計的其他問題
注意區分預期持久的基本約束和預期要改變的約束,盡量避免或最小化由預計或可能發生的改變帶來的改動。
?