PowerDesigner使用教程 —— 概念資料模型(CDM模型)
概念資料模型也稱資訊模型,它以實體-聯絡(Entity-RelationShip,簡稱E-R)理論為基礎,並對這一理論進行了擴充。它從使用者的觀點出發對資訊進行建模,主要用於資料庫的概念級設計。
通常人們先將現實世界抽象為概念世界,然後再將概念世界轉為機器世界。換句話說,就是先將現實世界中的客觀物件抽象為實體(Entity)和聯絡 (Relationship),它並不依賴於具體的計算機系統或某個DBMS系統,這種模型就是我們所說的CDM;然後再將CDM轉換為計算機上某個 DBMS所支援的資料模型,這樣的模型就是物理資料模型,即PDM。
CDM是一組嚴格定義的模型元素的集合,這些模型元素精確地描述了系統的靜態特性、動態特性以及完整性約束條件
1)資料結構表達為實體和屬性;
2)資料操作表達為實體中的記錄的插入、刪除、修改、查詢等操作;
3)完整性約束表達為資料的自身完整性約束(如資料型別、檢查、規則等)和資料間的參照完整性約束(如聯絡、繼承聯絡等);
二、實體、屬性及識別符號的定義
實體(Entity),也稱為例項,對應現實世界中可區別於其他物件的“事件”或“事物”。例如,學校中的每個學生,醫院中的每個手術。每個實體都有用來描述實體特徵的一組性質,稱之為屬性,一個實體由若干個屬性來描述。如學生實體可由學號、姓名、性別、出生年月、所在系別、入學年份等屬性組成。
實體集(Entity Set)是具體相同型別及相同性質實體的集合。例如學校所有學生的集合可定義為“學生”實體集,“學生”實體集中的每個實體均具有學號、姓名、性別、出生年月、所在系別、入學年份等性質。
實體型別(Entity Type)是實體集中每個實體所具有的共同性質的集合,例如“患者”實體型別為:患者{門診號,姓名,性別,年齡,身份證號.............}。實體是實體型別的一個例項,在含義明確的情況下,實體、實體型別通常互換使用。實體型別中的每個實體包含唯一標識它的一個或一組屬性,這些屬性稱為實體型別的識別符號(Identifier),如“學號”是學生實體型別的識別符號,“姓名”、“出生日期”、“信址”共同組成“公民”實體型別的識別符號。有些實體型別可以有幾組屬性充當識別符號,選定其中一組屬性作為實體型別的主識別符號,其他的作為次識別符號。
三、實體、屬性及識別符號的表達
四、新建概念資料模型
1)選擇File-->New,彈出如圖所示對話方塊,選擇CDM模型(即概念資料模型)建立模型。
2)完成概念資料模型的建立。以下圖示,對當前的工作空間進行簡單介紹。(以後再更詳細說明)
3)選擇新增的CDM模型,右擊,在彈出的選單中選擇“Properties”屬性項,彈出如圖所示對話方塊。在“General”標籤裡可以輸入所建模型的名稱、程式碼、描述、建立者、版本以及預設的圖表等等資訊。在“Notes”標籤裡可以輸入相關描述及說明資訊。當然再有更多的標籤,可以點選 "More>>"按鈕,這裡就不再進行詳細解釋。
五、定義實體
1、建立實體
1)在CDM的圖形視窗中,單擊工具選項版上的Entity工具,再單擊圖形視窗的空白處,在單擊的位置就出現一個實體符號。點選Pointer工具或右擊滑鼠,釋放Entitiy工具。如圖所示
2)雙擊剛建立的實體符號,開啟下列圖示視窗,在此視窗“General”標籤中可以輸入實體的名稱、程式碼、描述等資訊。
Name:是用來在模型中標識一個實體,一般用於模型在介面中的顯示(這個可以通過更改選項設定進行改變)。在一個模型當中,實體的名字不能重複。
Code:在模型轉化時一般作為物件的物理名稱,比如把實體屬性的Code轉化為資料庫中的列名,當然我們現在不必為了這個實體將來叫什麼而費神,一般採取與Name一致即可。
Generate:預設是選擇狀態,如果取消,則在轉化為其他模型時,會忽略這個實體。
2、新增實體屬性1)在上述視窗的“Attribute”選項標籤上可以新增屬性,如下圖所示。
注意:
資料項中的“新增屬性”和“重用已有資料項”這兩項功能與模型中Data Item的Unique code 和Allow reuse選項有關。
P列表示該屬性是否為主識別符號;D列表示該屬性是否在圖形視窗中顯示;M列表示該屬性是否為強制的,即該列是否為空值。
如果一個實體屬性為強制的,那麼, 這個屬性在每條記錄中都必須被賦值,不能為空。
按“Crtl+U”撥出“定製列過濾器”的視窗,可以根據自己的喜好和實際需要選擇那些列出現在視窗中,那些隱藏。使用快捷鍵 “Crtl+E”可以允許或者禁止當前過濾器。
2)在上圖所示視窗中,點選插入屬性按鈕,彈出屬性對話方塊,如下圖所示。
1)定義屬性的標準檢查
標準檢查約束是一組確保屬性有效的表示式。在實體屬性的特性視窗,開啟如圖所示的檢查選項卡。
在這個選項卡可以定義屬性的標準檢查約束,視窗中每項的引數的含義,如下
引數 | 說明 |
Minimum | 屬性可接受的最小數 |
Maximum | 屬性可接受的最大數 |
Default | 屬性不賦值時,系統提供的預設值 |
Unit | 單位,如公里、噸、元 |
Format | 屬性的資料顯示格式 |
Lowercase | 屬性的賦值全部變為小寫字母 |
Uppercase | 屬性的賦值全部變為大寫字母 |
Cannot modify | 該屬性一旦賦值不能再修改 |
List Of Values | 屬性賦值列表,除列表中的值,不能有其他的值 |
Label | 屬性列表值的標籤 |
2)定義屬性的附加檢查
當Standard checks 或Rules 不能滿足檢查的要求時,可以在Additional Checks選項卡的Server子頁上,通過SQL語句中使用%MINMAX%、%LISTVAL%、%RULES%、%UPPER%、%LOWER% 幾個變數來定義Standard和Rule,如圖所示
%MINMAX%、%LISTVAL%、%UPPER%、%LOWER%
在Standard Check中定義的Minimum 和Maximum、List values 、uppervalues、lowervalues
%RULES%
在Rules特性視窗Expression選項卡中定義的有效性規則表示式
六、識別符號
識別符號是實體中一個或多個屬性的集合,可用來唯一標識實體中的一個例項。要強調的是,CDM中的識別符號等價於PDM中的主鍵或候選鍵。每個實體都必須至少有一個識別符號。如果實體只有一個識別符號,則它為實體的主識別符號。如果實體有多個識別符號,則其中一個被指定為主識別符號,其餘的識別符號就是次識別符號了。
1、定義主、次識別符號
1)選擇某個實體雙擊彈出實體的屬性對話方塊。在Identifiers選項卡上可以進行實體識別符號的定義。如下圖所示
2)選擇第一行“主識別符號”,點選屬性按鈕或雙擊第一行“主識別符號”,彈出屬性對話方塊,如圖所示
3)選擇"Attributes"選項卡,再點選“Add Attributes”工具,彈出如圖所示視窗,選擇某個屬性作為識別符號就行了。
資料項(Data Item)是資訊儲存的最小單位,它可以附加在實體上作為實體的屬性。
注意:模型中允許存在沒有附加至任何實體上的資料項。
1、新建資料項
1)使用“Model”---> Data Items 選單,在開啟的視窗中顯示已有的資料項的列表,點選 “Add a Row”按鈕,建立一個新資料項,如圖所示
2)當然您可以繼續設定具體資料項的Code、DataType、Length等等資訊。這裡就不再詳細說明了。
2、資料項的唯一性程式碼選項和重用選項
使用Tools--->Model Options->Model Settings。在Data Item組框中定義資料項的唯一性程式碼選項(Unique Code)與重用選項(Allow Reuse)。
注意:
如果選擇Unique Code複選框 ,每個資料項在同一個名稱空間有唯一的程式碼,而選擇Allow reuse ,一個數據項可以充當多個實體的屬性。
3、在實體中新增資料項
1)雙擊一個實體符號,開啟該實體的屬性視窗。
2)單擊Attributes選項卡,開啟如下圖所示視窗
注意:
Add a DataItem 與 Reuse a DataItem的區別在於
Add a DataItem 情況下,選擇一個已經存在的資料項,系統會自動複製所選擇的資料項。如果您設定了UniqueCode選項,那系統在複製過程中,新資料項的Code會自動生成一個唯一的號碼,否則與所選擇的資料項完全一致。
Reuse a DataItem情況下,只引用不新增,就是引用那些已經存在的資料項,作為新實體的資料項。
八、 聯絡
聯絡(Relationship)是指實體集這間或實體集內部例項之間的連線。
實體之間可以通過聯絡來相互關聯。與實體和實體集對應,聯絡也可以分為聯絡和聯絡集,聯絡集是實體集之間的聯絡,聯絡是實體之間的聯絡,聯絡是具有方向性的。聯絡和聯絡集在含義明確的情況之下均可稱為聯絡。
按照實體型別中例項之間的數量對應關係,通常可將聯絡分為4類,即一對一(ONE TO ONE)聯絡、一對多(ONE TO MANY)聯絡、多對一(MANY TO ONE)聯絡和多對多聯絡(MANY TO MANY)。
1、 建立聯絡
在CDM工具選項板中除了公共的工具外,還包括如下圖所示的其它物件產生工具。
在圖形視窗中建立兩個實體後,單擊“實體間建立聯絡”工具,單擊一個實體,在按下滑鼠左鍵的同時把游標拖至別一個實體上並釋放滑鼠左鍵,這樣就在兩個實體間建立了聯絡,右鍵單擊圖形視窗,釋放Relationship工具。如下圖所示
在兩個實體間建立了聯絡後,雙擊聯絡線,開啟聯絡特性視窗,如圖所示。
2、 四種基本的聯絡
即一對一(ONE TO ONE)聯絡、一對多(ONE TO MANY)聯絡、多對一(MANY TO ONE)聯絡和多對多聯絡(MANY TO MANY)。如圖所示
3、 其他幾類特殊聯絡
除了4種基本的聯絡之外,實體集與實體集之間還存在標定聯絡(Identify Relationship)、非標定聯絡(Non-Identify RelationShip)和遞迴聯絡(Recursive Relationship)。
標定聯絡:
每個實體型別都有自己的識別符號,如果兩個實體集之間發生聯絡,其中一個實體型別的識別符號進入另一個實體型別並與該實體型別中的識別符號共同組成其識別符號時,這種聯絡則稱為標定聯絡,也叫依賴聯絡。反之稱為非標定聯絡,也叫非依賴聯絡。
注意:
在非標定聯絡中,一個實體集中的部分例項依賴於另一個例項集中的例項,在這種依賴聯絡中,每個實體必須至少有一個識別符號。而在標定聯絡中,一個實體集中的全部例項完全依賴於另個實體集中的例項,在這種依賴聯絡中一個實體必須至少有一個識別符號,而另一個實體卻可以沒有自己的識別符號。沒有識別符號的實體用它所依賴的實體的識別符號作為自己的識別符號。
換句話來理解,在標定聯絡中,一個實體(選課)依賴 一個實體(學生),那麼(學生)實體必須至少有一個識別符號,而(選課)實體可以沒有自己的識別符號,沒有標識別符號的實體可以用實體(學生)的識別符號作為自己的識別符號。
遞迴聯絡:
遞迴聯絡是實體集內部例項之間的一種聯絡,通常形象地稱為自反聯絡。同一實體型別中不同實體集之間的聯絡也稱為遞迴聯絡。
例如:在“職工”實體集中存在很多的職工,這些職工之間必須存在一種領導與被領導的關係。又如“學生”實體信中的實體包含“班長”子實體集與“普通學生”子實體集,這兩個子實體集之間的聯絡就是一種遞迴聯絡。建立遞迴聯絡時,只需要單擊“實體間建立聯絡”工具從實體的一部分拖至該實體的別一個部分即可。如圖
3、 定義聯絡的特性
雙擊關係(Relationship)的符號,進入關係的屬性頁,在Detail專案中,我們可以對兩個實體的關係進行詳細的定義,如下圖:
- General 專案
一般最好為關係取一個貼切的名字,本例的業務關係描述如下:一個部門有多個員工,我們使用“Has”作為這個關係的名字。
同樣的我們也可以描述為:多個員工屬於一個部門,可不可以使用“Belong to”作為關係名字呢?一般不推薦這樣做,在概念圖中有一個約定,關係的名字採用從“1,n”中“1”所在的方向向“n”所在一方進行讀取的語義。本例即 “1”在部門一方,從部門一方向僱員一方讀取語義,即:部門有(Has)多個員工。
- Detail 專案
假定對於實體部門(Department)和僱員(Employee),具有如下關係:
- 一個部門可以有多個僱員,新成立的部門也可以暫時沒有任何僱員;
- 一個僱員必須屬於一個部門,並且同時只能屬於一個部門;
根據以上關係,我們修改屬性頁,部門-僱員的方向採用預設的0,n,僱員-部門的方向修改為強制約束(Mandatory),或者從下拉框中選擇“1,1”,如下圖:
最後定義完成的關係(Relationship)在概念圖中表示如下:
注:在Power Designer中,關係符號靠近實體端的一個“橫線”代表強制性約束,“空心圓圈”代表無強制約束,即這一方可以無物件關聯;“非分岔”線代表為“1” 的關係,“分岔”線代表“多”的關係。以上四個符號共可以組合出16種關係(包含反向)。其中“多對多”的關係一般通過給出一箇中間實體來進行分解,所以在許多概念圖中,是看不到實際的“多對多”的關係存在的。
另外在關係的屬性中還有兩項:Dominant role 和Dependent,可以表示更復雜的關係,會在後面講到。
使用依賴關係(Dependent)
還是使用上面的例子,我們假定這樣的業務描述:僱員享有假期,僱員每次休假,需要記錄僱員休假的起始日與結束日,假期以天為單位,一個僱員和一個開始日唯一確定一個假期。根據這個業務描述,我們知道,對於假期而言,其必須依存於實體“Employee”而存在,即一個休假,必定有一個主體僱員。我們在上一個模型的基礎之上,新增一個實體,名稱是“Holiday”,定義假期的屬性開始日與結束日,這裡並不需要重複定義一個僱員編號,而是替代的,使用依賴關係,來表示實體“Holiday”依賴於實體“Employee”,關係定義如下圖:
在實體“Holiday”中,我們需要設定開始日為主鍵識別符號,開始日與其依賴實體中的僱員編號一起作為實體“Holiday”的識別符號,用來唯一確定一個假期。這種依賴關係在概念圖中表現如下:
從途中可以看出,在實體“Holiday”一端多了一個朝外的三角▲箭頭,這個含義就是這個實體“的依賴於三角箭頭所指的另外一個實體,在轉化出來的物理模型當中,實體“Employee”的empNo,在Holiday實體中不僅會作為一個外來鍵,還同時會作為主鍵出現(與startData一起作為複合主鍵)。
使用Dominant role
當兩個實體之間的關係是1..1 時(儘管這種關係比較少見,常見於面向物件的設計方法當中,依賴實體中的主鍵通常與外健重合),你需要明確指定這兩個實體,哪一個是父實體,哪一個是依賴實體,否則,系統在由概念模型轉化為物理模型時,將不能確定需要在哪一端生成外來鍵,這時就需要用到“Dominant role”選項,這個選項只有在1..1 的關係中才允許進行設定。我們假定這樣的業務描述,企業中的部分僱員擁有一個系統帳號,並且是唯一的一個帳號,這些僱員需要儲存一些額外的資訊,比如帳號名稱、密碼等等。我們添加了一個新的實體“User”,其與僱員之間為1..1 的關係,由於一個使用者帳號必定屬於一個僱員,而一個僱員則可能沒有使用者帳號,所以我們定義實體“Employee”支配實體“User”。同時,由於 “User”依賴於“Employee”而存在,所以再定義一個由前者到後者的依賴關係,如下圖:
Dominant role 選項中,箭頭所指的實體為被支配的實體,即作為依賴實體。在模型圖中,支配實體的一方會出現一個用圓括號括起來的大寫字母“D”。
轉化出來的物理模型中,表User中,empNo作為單獨的主鍵,同時也是引用Employee表的一個外來鍵。
處理多對多(n..n)的關係
在概念模型中,一般很少看見兩個實體之間是直接的n..n 的關係,一般這種情況下我們會增加一箇中間實體,在Power Designer中,提供了一個專門的符號來對應,叫做“Association”。請考慮以下的情形:
企業中擁有帳號的僱員在系統中具有不同的操作許可權,這通過使用者角色來進行管理,許可權已經分配給了多個不同的角色,一個使用者帳號至少屬於一個角色,並且可能會同時屬於多個角色,一個角色可以包含0個或多個使用者帳號。根據以上描述,我們新增一個實體“Role”,它與實體“User”之間是n..n 的關係,為了表達這種關係,我們增加一個“Association”並分別使用“Association Link”與其他兩個實體建立關係,表示如下:
使用一個普通的實體,合理定義關係,並選擇“Dependent”選項,是可以替代“Association”的,但使用 “Association”更方便、直觀,使模型更容易理解,並可以減少因不謹慎而可能導致的錯誤。