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

1.4.3 E-R模型的設(shè)計流程

復(fù)雜的數(shù)據(jù)庫系統(tǒng)一般按照自底向上的設(shè)計策略,分模塊進行設(shè)計。E-R模型的設(shè)計流程是先設(shè)計局部應(yīng)用的局部E-R模型,然后把所有局部E-R模型合并為完整的數(shù)據(jù)庫系統(tǒng)的全局E-R模型,最后把全局E-R模型優(yōu)化為基本E-R模型,如圖1-24所示。

圖1-23 超類與子類示例

圖1-24 E-R模型設(shè)計流程圖

1. 局部E-R模型設(shè)計

局部E-R模型設(shè)計的工作內(nèi)容是基于對局部應(yīng)用的需求分析結(jié)果,運用分類、聚集、概括等數(shù)據(jù)抽象方法,把一個局部應(yīng)用抽象為實體、屬性、標(biāo)識實體的關(guān)鍵屬性,并確定實體之間的聯(lián)系及聯(lián)系的類型。

局部E-R模型設(shè)計的難點是把現(xiàn)實世界的對象抽象為實體還是屬性。實體和屬性是相對而言的,往往要根據(jù)實際情況進行必要的調(diào)整。基本的判斷依據(jù)有三個。一是屬性要足夠簡單,復(fù)合屬性需要升級為實體,或直接被其子屬性替代。二是簡化E-R模型的處理,現(xiàn)實世界中的事物凡能夠作為屬性對待的,應(yīng)盡量作為屬性。如果一個實體只有一個屬性,則應(yīng)該降級為屬性。三是屬性是對實體組成部分的描述,是實體的一部分,不允許屬性與其他實體發(fā)生聯(lián)系。例如,校園卡對于商戶的經(jīng)營管理而言是屬性,他們只關(guān)注校園卡的卡號。但對于學(xué)生而言,除了卡號,還有卡的密碼、余額等屬性需要關(guān)注,校園卡應(yīng)該抽象為包含多個屬性的實體。

例1-1 如圖1-25a)所示,局部E-R模型中的工資是職工的屬性,工資構(gòu)成包含崗位工資、薪級工資、績效工資和津貼補貼四部分。這種設(shè)計方法是否合適?

不合適。因為工資不僅是派生屬性,而且是包括四個子項的復(fù)合屬性。處理方法有兩種:一是用崗位工資、薪級工資、績效工資、津貼補貼替代工資屬性,如圖1-25b)所示;二是把工資作為實體,如圖1-25c)所示。

圖1-25 局部E-R模型設(shè)計示例

2. 全局E-R模型設(shè)計

將局部E-R模型合并為全局E-R模型,首先要識別各局部E-R模型中的公共實體,然后從公共實體開始進行兩兩合并,直到所有有關(guān)聯(lián)的局部E-R模型合并為一個整體,最后加入獨立的局部E-R模型后得到全局E-R模型。

對于較大的數(shù)據(jù)庫系統(tǒng),局部E-R模型很多,而且現(xiàn)實世界的同一個對象在不同的局部E-R模型中可能被給予了不同的抽象,將局部E-R模型合并為全局E-R模型時難免會出現(xiàn)沖突。檢查并消除沖突是設(shè)計全局E-R模型的重要工作內(nèi)容。常見的沖突有三種,分別是結(jié)構(gòu)沖突、命名沖突和屬性沖突。

(1)結(jié)構(gòu)沖突。

結(jié)構(gòu)沖突是指同一對象在不同應(yīng)用中具有不同的抽象。

第一類結(jié)構(gòu)沖突是同一對象在不同的局部應(yīng)用中分別被抽象為實體和屬性。調(diào)整的原則是能用屬性表示的對象就不要用實體表示,但是當(dāng)對象的屬性難以用簡單屬性表示時,就要在整個系統(tǒng)范圍內(nèi)把該對象用實體表示。例如,校園卡在一個局部應(yīng)用中作為屬性,在另一個局部應(yīng)用中可以是有多個屬性的實體,則我們在合并局部E-R模型時應(yīng)該把校園卡作為實體。

第二類結(jié)構(gòu)沖突是同一對象在不同的局部E-R模型中都被抽象為實體,但是實體的屬性并不完全相同或?qū)傩缘呐帕写涡虿⒉煌耆嗤R驗閿?shù)據(jù)庫要滿足所有用戶的數(shù)據(jù)處理需求,因此實體的屬性應(yīng)該取各局部E-R模型中該實體屬性的并集,再按照由主到次的順序調(diào)整屬性的順序。例如,校園卡在一個局部應(yīng)用中有卡號、開卡日期、注銷日期、密碼、狀態(tài)等屬性,在另一個局部應(yīng)用中有卡號、密碼、余額等屬性,兩個局部E-R模型合并后,校園卡實體的屬性是二者的并集:卡號、密碼、余額、開卡日期、注銷日期、狀態(tài)。

第三類結(jié)構(gòu)沖突是在不同的局部應(yīng)用中,實體之間的聯(lián)系類型不同。例如,在一個局部應(yīng)用中校園卡與商戶之間是二元聯(lián)系,而在另一個局部應(yīng)用中校園卡、商戶、商品之間是三元聯(lián)系。是二元聯(lián)系合適,還是三元聯(lián)系合適,沒有一定之規(guī),要根據(jù)應(yīng)用語義具體分析,然后對實體之間的聯(lián)系類型進行設(shè)計。調(diào)整的原則是能用二元聯(lián)系表示就不要用三元聯(lián)系表示。例如,校園卡、商戶、商品之間的三元聯(lián)系,可以調(diào)整為校園卡與商戶之間的二元聯(lián)系和商戶與商品之間的二元聯(lián)系。但是并非所有的三元聯(lián)系都可以用多個二元聯(lián)系來表示。

(2)命名沖突。

實體名、屬性名、聯(lián)系名都有可能沖突,其中以屬性的命名沖突尤為常見。命名沖突分為同名異義和同義異名兩種情況。

同名異義是指不同意義的對象在不同的局部應(yīng)用中具有相同的名字,例如,在不用的局部應(yīng)用中都將實體命名為“項目”,一個是指教師承擔(dān)的科研課題,一個是指學(xué)生參加的大學(xué)生創(chuàng)新創(chuàng)業(yè)項目。二者的性質(zhì)、研究內(nèi)容、考核指標(biāo)都是不一樣的,是兩種不同的實體,應(yīng)該用不同的實體名加以區(qū)分。

同義異名是指同一對象在不同的局部應(yīng)用中被定義了不同的名字。例如,同樣是學(xué)生實體,在一個局部應(yīng)用中被命名為“學(xué)生”,而在另一個局部應(yīng)用中又被命名為“學(xué)員”,因此,在合并為全局E-R模型時需要統(tǒng)一。

(3)屬性沖突。

屬性沖突是指同一個屬性的屬性域沖突,或者屬性取值單位沖突。

屬性域包括屬性的數(shù)據(jù)類型和取值范圍。屬性域沖突有可能是同一屬性在不同的局部應(yīng)用中被定義了不同的數(shù)據(jù)類型,或者同一屬性在不同的局部應(yīng)用中數(shù)據(jù)類型相同但是數(shù)據(jù)的取值范圍不同。例如,校園卡的卡號在一個局部應(yīng)用中被定義為整數(shù)類型,而在另一個局部應(yīng)用中被定義為字符類型。又如,學(xué)號在兩個局部應(yīng)用中都被定義為字符類型,但是在一個局部應(yīng)用中學(xué)號的長度為12,在另一個局部應(yīng)用中學(xué)號的長度為10。

屬性取值單位沖突也很常見。例如,商品的規(guī)格屬性在一個局部應(yīng)用中以箱為單位,在另一個局部應(yīng)用中以瓶為單位。

3. 基本E-R模型設(shè)計

基本E-R模型設(shè)計是指在全局E-R模型的基礎(chǔ)上,去掉冗余數(shù)據(jù)和冗余聯(lián)系。冗余數(shù)據(jù)是指可由基本數(shù)據(jù)導(dǎo)出的數(shù)據(jù)。冗余聯(lián)系是指可由其他聯(lián)系導(dǎo)出的聯(lián)系。冗余數(shù)據(jù)和冗余聯(lián)系容易造成數(shù)據(jù)的不一致,增加數(shù)據(jù)庫維護的難度。如果全局E-R模型中存在冗余數(shù)據(jù)和冗余聯(lián)系,則需要對其進行優(yōu)化。優(yōu)化后的全局E-R模型被稱為基本E-R模型。

例如,學(xué)生的平均分是由各科成績加權(quán)平均后得到的數(shù)據(jù),屬于冗余數(shù)據(jù)。又如,發(fā)票的總金額是由發(fā)票中商品的單價和數(shù)量計算得到的數(shù)據(jù),屬于冗余數(shù)據(jù)。

例1-2 如圖1-26所示的E-R模型中是否存在冗余聯(lián)系?如果存在,請你消除冗余聯(lián)系。

圖1-26 冗余聯(lián)系示例

學(xué)生與商戶之間的消費聯(lián)系是一個冗余聯(lián)系,因為該聯(lián)系可以通過學(xué)生持有校園卡和刷卡在商戶消費這兩個聯(lián)系推導(dǎo)出來。消除冗余聯(lián)系后的E-R模型如圖1-27所示。

圖1-27 消除冗余聯(lián)系后的E-R模型

基本E-R模型用盡可能少的實體、屬性、聯(lián)系,準(zhǔn)確、全面地反映用戶功能需求。但這并不意味著數(shù)據(jù)庫中沒有冗余,必要的冗余有時可以提高數(shù)據(jù)查詢的效率。設(shè)計基本E-R模型時,哪些冗余信息要消除,哪些冗余信息允許存在,需要根據(jù)用戶的整體需求來確定。

主站蜘蛛池模板: 汕尾市| 盘山县| 墨竹工卡县| 山东省| 弥勒县| 焉耆| 盘山县| 清徐县| 平阳县| 车致| 东兴市| 襄汾县| 竹北市| 紫阳县| 石门县| 赞皇县| 公安县| 石泉县| 凌海市| 于都县| 云龙县| 平乡县| 那曲县| 滨州市| 尼勒克县| 齐河县| 盈江县| 黑河市| 甘谷县| 都昌县| 泗水县| 巫溪县| 西城区| 菏泽市| 百色市| 杂多县| 新巴尔虎右旗| 韩城市| 绥阳县| 海盐县| 文安县|