摘要
本文是介紹 Microsoft Visual Studio
NET Enterprise Architect 中基於 Visio 的數據庫建模組件系列文章中的第三篇
第一部分討論了如何創建基本對象角色建模 (ORM) 源模型
如何將其映射到邏輯數據庫模型
以及如何生成物理數據庫架構的 DDL 腳本
第二部分討論了如何使用描述器
將對象類型標記為獨立類型
對象化關聯以及將其他一些 ORM 約束添加到 ORM 源模型中
第三部分將闡述如何添加集合比較約束(子集約束
等同約束和排斥約束)
以及如何通過組合排斥約束和分離性強制約束來獲得異或約束
簡介
本文是介紹 Microsoft Visio for Enterprise Architects (VEA) 中數據庫建模解決方案系列文章中的第三篇
VEA 包含在 Visual Studio
NET 的 Enterprise Architect 版本中
本文討論如何將集合比較約束添加到對象角色建模 (ORM) 源模型中
以及如何通過組合排斥約束和分離性強制約束來形成異或約束
假定本文的讀者已經熟悉 ORM 和關系數據庫建模
ORM 的概述可從網上下載 [參考書目
和參考書目
]
有關 ORM 和數據庫建模的處理方式的信息
在我最新出版的書 [參考書目
] 中進行了詳細的討論
有關本系列文章的前兩篇
請參閱參考書目
和參考書目
集合比較約束
如果兩個角色由同一對象類型擔當
或角色的兩個對象類型共享公用的父類型
則可以說它們
相互兼容
並且比較它們包含的內容是很有意義的
對於角色序列(已排序的角色列表)來說
也同樣適用上述規則
對於數據庫來說
僅有三個相關的集合比較運算符
子集運算符 ()
等同運算符 (=) 和互斥運算符 ()
從源角色序列至目標角色序列的子集約束規定
源角色序列中的成員(一組實例)必須始終作為目標角色序列成員的子集
該約束的圖形顯示為帶圈的
由虛線箭頭連接
從源角色序列指向目標角色序列(示例請參閱圖
)
在以前的 ORM 工具版本中
虛線箭頭本身就指定子集約束
在 VEA 中
帶圈的子集符號始終顯式顯示
這便闡明了約束表示法的含義
並支持源角色和目標角色屬於同一關聯時的極少數情況
還允許在其他直接約束(例如
≤
可能要在以後對其添加圖形約束表示法)中使用虛線箭頭
圖
單一角色間的子集約束
最簡單的角色序列就是單一角色
在圖
中
兩個單一角色之間的子集約束意味著擁有第二個名字的一組患者必須是擁有第一個名字的一組患者的子集
換句話說
如果某個患者擁有第二個名字
那麼他或她也必須擁有第一個名字
要在 VEA 中添加該子集約束
首先輸入兩種事實類型(例如
將它們添加到業務規則編輯器中
然後再拖到繪圖窗口中)
在選擇相關謂詞的同時按住 Shift 鍵
單擊鼠標右鍵並從快捷菜單中選擇 Add Constraints(添加約束)
當顯示 Add Constraints(添加約束)對話框時
請在 Constraint type(約束類型)字段中選擇 Subset(子集)
然後選擇該約束的源角色和目標角色
在該對話框中選擇多個角色框時
它們會按照選擇的順序編號為
等
如果用戶正確執行了該操作
則將顯示如圖
所示的對話框
在該對話框的下部區域自動描述該約束
如果這是您希望立刻應用於那些事實類型的唯一約束
請單擊 OK(確定)
如果現在要向這些事實類型的一個或多個類型添加其他約束
請單擊 Apply(應用)
然後添加其他約束
圖
選擇子集約束類型
再選擇源角色 [
]
然後選擇目標角色 [
]
請注意
謂詞
has first
(擁有第一個)和
has second
(擁有第二個)中連字符的用法
在描述那些謂詞的約束時
連字符將形容詞
first
(第一個)和
second
(第二個)綁定到 GivenName(名字)
以便用戶在形容詞之前而不是之後插入關鍵字(例如
some
[一些])
例如
如果當前示例中省略了連字符
則描述信息顯示為
If Patient p has second some GivenName then Patient p has first some GivenName
(如果病人 p 擁有第二個一些名字則病人 p 擁有第一個一些名字)
這種描述令人難以理解
圖
說明了角色對之間的子集約束(每一角色序列包含兩個角色)
這裡
如果一對角色是連續的
則約束將連接到這兩個角色的交叉點
該約束意味著
實例化 Chairperson(主席)關聯的 Employee
Committee(雇員
委員會)對的集合必須是成員身份關聯集合的子集
也就是說
每個擔任委員會主席的人必須是所屬委員會的成員
圖
角色對之間的子集約束
要添加此子集約束
請先在圖表窗口中添加兩個事實類型
在選擇謂詞時按住 Shift 鍵
單擊鼠標右鍵
並從快捷菜單中選擇 Add Constraints(添加約束)
當顯示 Add Constraints (添加約束)對話框時
在 Constraint type (約束類型)字段中選擇 Subset(子集)
請注意對話框下部區域中的提示
如果約束的兩端都有多個角色
請添加指示的
Number of roles at each end
(每一端的角色數)以表明這種情況
默認情況下
約束兩端的角色數目均設置為
由於該約束每端有兩個角色
所以將此設置更改為
(如圖
所示)
現在請選擇源角色對
然後選擇目標角色對
為每一對中的角色排序使其與另一對中的相應角色匹配
在該對話框中選擇多個角色框時
它們會按照選擇的順序編號為
編號的第一部分表示角色序列
第二部分表示在角色序列中的位置
如果上述操作執行正確
將顯示如圖
所示的對話框
在該對話框的下部區域自動描述該約束
單擊 OK(確定)接受該約束並將其添加到圖表中
圖
在角色對之間添加子集約束(單擊圖像以查看大圖片)
角色序列之間的
等同約束
表明它們的集合必須始終相等
等同約束顯示為一個帶圈的
=
由一條虛線連接至角色序列
早期的 ORM 工具使用的是兩端各帶一個箭頭的虛線
以此來反映等同約束和一對子集約束的兩個方向之間的等同關系
現在不再支持這種舊的表示法
圖
兩個單一角色之間的等同約束
要添加此等同約束
請先在圖表窗口中添加兩個事實類型
在選擇這兩個謂詞時按住 Shift 鍵
單擊鼠標右鍵
並從快捷菜單中選擇 Add Constraint(添加約束)
當顯示 Add Constraint(添加約束)對話框時
在 Constraint type (約束類型)字段中選擇 Equality(等同)
然後選擇角色序列(在此示例中
每個序列僅包含一個角色)
如果上述操作執行正確
將顯示如圖
所示的對話框
實際上
等同約束中角色序列的順序並不重要
因為等同是對稱的(與子集不同)
在此對話框的下部區域中對該約束進行了描述
使用類似的方法
可以添加較長的角色序列之間的等同約束
圖
在角色之間添加簡單的等同約束
角色序列之間的
排斥約束
表明它們的集合必須始終不相交(相斥)
排斥約束顯示為一個帶圈的
X
由一條虛線連接至角色序列
圖
包含對排斥約束(沒有人可以編寫並審閱同一本書)和簡單排斥約束(沒有書可以同時被推薦閱讀和禁止閱讀)
圖
對排斥約束和簡單排斥約束
要快速添加這些排斥約束
請先在繪圖窗口中添加四個事實類型
在選擇這四個謂詞時按住 Shift 鍵
單擊鼠標右鍵
並從快捷菜單中選擇 Add Constraints(添加約束)
當顯示 Add Constraints(添加約束)對話框時
在 Constraint type(約束類型)字段中選擇 Exclusion(排斥)
然後選擇推薦的角色和禁止的角色(如圖
所示)
單擊 Apply(應用)接受並顯示該約束
將對話框保持打開狀態
以便添加其他排斥約束
圖
添加簡單的排斥約束
在 Constraint type(約束類型)字段中選擇 Exclusion(排斥)
將每一端的角色數目增加到
然後選擇編寫和審閱事實類型中的角色對(如圖
所示)
單擊 OK(確定)接受該約束並退出此對話框
圖
添加對排斥約束
異或約束
在 ORM 中
異或約束
只是分離性強制(或)約束和排斥約束的正交組合
默認情況下
這兩個約束是重疊的
如圖
中的左圖所示
將帶圈的點(分離性強制)和帶圈的
X
(排斥)疊加就形成救生圈符號
要創建該示例
請在圖表窗口添加兩個事實類型
選定它們
單擊鼠標右鍵打開 Add Constraint(添加約束)對話框
添加第一個約束
然後將另外一個約束也添加到相同的角色中
添加完第一個約束後單擊 Apply(應用)
添加完第二個約束後單擊 OK(確定)
如果要直觀地將構成分離性強制約束的兩個約束分離
請在救生圈符號上單擊鼠標右鍵並選擇 Split X/OR constraint(拆分 X/OR 約束)選項
該約束將單獨顯示(如圖
中的右圖所示)
現在可以單獨處理任一約束
例如
選定其中一個約束並單擊 Delete(刪除)可以將其刪除
如果兩個約束都單獨出現
則選擇其中一個約束並將其拖到另一個約束上
可以將它們合並為救生圈符號
圖
異或約束等於分離性強制約束加上排斥約束
From:http://tw.wingwit.com/Article/program/net/201311/12983.html