enterprise|visual|資料|資料庫
Terry Halpin
Microsoft Corporation
2001年11月
摘要:本文是介紹 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 的概述可從網上下載 [參考書目] 1 和參考書目 2],有關 ORM 和資料庫建模的處理方式的資訊,在我最新出版的書 [參考書目 ]3] 中進行了詳細的討論。有關本系列文章的前兩篇,請參閱參考書目 4 和參考書目 5。
集合比較約束
如果兩個角色由同一物件類型擔當,或角色的兩個物件類型共用公用的父類型,則可以說它們“相互相容”,並且比較它們包含的內容是很有意義的。對於角色序列(已排序的角色列表)來說,也同樣適用上述規則。對於資料庫來說,僅有三個相關的集合比較子:子集運算子 ()、等同運算子 (=) 和互斥運算子 ()。
從源角色序列至目標角色序列的子集約束規定:源角色序列中的成員(一組執行個體)必須始終作為目標角色序列成員的子集。該約束的圖形顯示為帶圈的 "",由虛線箭頭串連,從源角色序列指向目標角色序列(樣本請參閱圖 1)。在以前的 ORM 工具版本中,虛線箭頭本身就指定子集約束。在 VEA 中,帶圈的子集符號始終顯式顯示。這便闡明了約束標記法的含義,並支援源角色和目標角色屬於同一關聯時的極少數情況,還允許在其他直接約束(例如,≤,可能要在以後對其添加圖形約束標記法)中使用虛線箭頭。
圖 1:單一角色間的子集約束
最簡單的角色序列就是單一角色。在圖 1 中,兩個單一角色之間的子集約束意味著擁有第二個名字的一組患者必須是擁有第一個名字的一組患者的子集。換句話說,如果某個患者擁有第二個名字,那麼他或她也必須擁有第一個名字。
要在 VEA 中添加該子集約束,首先輸入兩種事實類型(例如,將它們添加到商務規則編輯器中,然後再拖到繪圖視窗中)。在選擇相關謂詞的同時按住 Shift 鍵,單擊滑鼠右鍵並從捷徑功能表中選擇
Add Constraints(添加約束)。當顯示
Add Constraints(添加約束)對話方塊時,請在 Constraint type(約束類型)欄位中選擇 Subset(子集),然後選擇該約束的源角色和目標角色。在該對話方塊中選擇多個角色框時,它們會按照選擇的順序編號為 1、2、3 等。如果使用者正確執行了該操作,則將顯示如圖 2 所示的對話方塊。在該對話方塊的下部地區自動描述該約束。如果這是您希望立刻應用於那些事實類型的唯一約束,請單擊
OK(確定)。如果現在要向這些事實類型的一個或多個類型添加其他約束,請單擊
Apply(應用),然後添加其他約束。
圖 2:選擇子集約束類型,再選擇源角色 [1],然後選擇目標角色 [2](單擊映像以查看大圖片)
請注意,謂詞“has first-”(擁有第一個)和“has second-”(擁有第二個)中連字號的用法。在描述那些謂詞的約束時,連字號將形容詞“first”(第一個)和“second”(第二個)綁定到 GivenName(名字),以便使用者在形容詞之前而不是之後插入關鍵字(例如,“some”[一些])。例如,如果當前樣本中省略了連字號,則描述資訊顯示為“If Patient p has second some GivenName then Patient p has first some GivenName”(如果病人 p 擁有第二個一些名字則病人 p 擁有第一個一些名字),這種描述令人難以理解。
圖 3 說明了角色對之間的子集約束(每一角色序列包含兩個角色)。這裡,如果一對角色是連續的,則約束將串連到這兩個角色的交叉點。該約束意味著,執行個體化 Chairperson(主席)關聯的 Employee-Committee(僱員-委員會)對的集合必須是成員資格關聯集合的子集。也就是說,每個擔任委員會主席的人必須是所屬委員會的成員。
圖 3:角色對之間的子集約束
要添加此子集約束,請先在圖表視窗中添加兩個事實類型,在選擇謂詞時按住 Shift 鍵,單擊滑鼠右鍵,並從捷徑功能表中選擇
Add Constraints(添加約束)。當顯示
Add Constraints (添加約束)對話方塊時,在 Constraint type (約束類型)欄位中選擇
Subset(子集)。請注意對話方塊下部地區中的提示:如果約束的兩端都有多個角色,請添加指示的“Number of roles at each end”(每一端的角色數)以表明這種情況。預設情況下,約束兩端的角色數目均設定為 1。由於該約束每端有兩個角色,所以將此設定更改為 2(如圖 4 所示)。
現在請選擇源角色對,然後選擇目標角色對,為每一對中的角色排序使其與另一對中的相應角色匹配。在該對話方塊中選擇多個角色框時,它們會按照選擇的順序編號為 1.1、1.2、2.1、2.2。編號的第一部分表示角色序列,第二部分表示在角色序列中的位置。如果上述操作執行正確,將顯示如圖 4 所示的對話方塊。在該對話方塊的下部地區自動描述該約束。單擊
OK(確定)接受該約束並將其添加到圖表中。
圖 4:在角色對之間添加子集約束(單擊映像以查看大圖片)
角色序列之間的“等同約束”表明它們的集合必須始終相等。等同約束顯示為一個帶圈的“=”,由一條虛線串連至角色序列。早期的 ORM 工具使用的是兩端各帶一個箭頭的虛線,以此來反映等同約束和一對子集約束的兩個方向之間的等同關係,現在不再支援這種舊的標記法。
圖 5:兩個單一角色之間的等同約束
要添加此等同約束,請先在圖表視窗中添加兩個事實類型,在選擇這兩個謂詞時按住 Shift 鍵,單擊滑鼠右鍵,並從捷徑功能表中選擇
Add Constraint(添加約束)。當顯示
Add Constraint(添加約束)對話方塊時,在 Constraint type (約束類型)欄位中選擇
Equality(等同),然後選擇角色序列(在此樣本中,每個序列僅包含一個角色)。如果上述操作執行正確,將顯示如圖 6 所示的對話方塊。實際上,等同約束中角色序列的順序並不重要,因為等同是對稱的(與子集不同)。在此對話方塊的下部地區中對該約束進行了描述。使用類似的方法,可以添加較長的角色序列之間的等同約束。
圖 6:在角色之間添加簡單的等同約束(單擊映像以查看大圖片)
角色序列之間的“排斥約束”表明它們的集合必須始終不相交(相斥)。排斥約束顯示為一個帶圈的“X”,由一條虛線串連至角色序列。圖 7 包含對排斥約束(沒有人可以編寫並審閱同一本書)和簡單排斥約束(沒有書可以同時被推薦閱讀和禁止閱讀)。
圖 7:對排斥約束和簡單排斥約束
要快速添加這些排斥約束,請先在繪圖視窗中添加四個事實類型,在選擇這四個謂詞時按住 Shift 鍵,單擊滑鼠右鍵,並從捷徑功能表中選擇
Add Constraints(添加約束)。當顯示
Add Constraints(添加約束)對話方塊時,在 Constraint type(約束類型)欄位中選擇
Exclusion(排斥),然後選擇推薦的角色和禁止的角色(如圖 8 所示)。單擊
Apply(應用)接受並顯示該約束,將對話方塊保持開啟狀態,以便添加其他排斥約束。
圖 8:添加簡單的排斥約束(單擊映像以查看大圖片)
在 Constraint type(約束類型)欄位中選擇
Exclusion(排斥),將每一端的角色數目增加到 2,然後選擇編寫和審閱事實類型中的角色對(如圖 9 所示)。單擊
OK(確定)接受該約束並退出此對話方塊。
圖 9:添加對排斥約束(單擊映像以查看大圖片)
異或約束
在 ORM 中,“異或約束”只是分離性強制(或)約束和排斥約束的正交組合。預設情況下,這兩個約束是重疊的,如圖 10 中的左圖所示,將帶圈的點(分離性強制)和帶圈的“X”(排斥)疊加就形成救生圈符號。要建立該樣本,請在圖表視窗添加兩個事實類型,選定它們,單擊滑鼠右鍵開啟
Add Constraint(添加約束)對話方塊,添加第一個約束,然後將另外一個約束也添加到相同的角色中;添加完第一個約束後單擊
Apply(應用),添加完第二個約束後單擊
OK(確定)。
如果要直觀地將構成分離性強制限制式的兩個約束分離,請在救生圈符號上單擊滑鼠右鍵並選擇
Split X/OR constraint(拆分 X/OR 限制式)選項。該約束將單獨顯示(如圖 10 中的右圖所示)。現在可以單獨處理任一約束,例如,選定其中一個約束並單擊
Delete(刪除)可以將其刪除。如果兩個約束都單獨出現,則選擇其中一個約束並將其拖到另一個約束上,可以將它們合并為救生圈符號。
圖 10:異或約束等於分離性強制限制式加上排斥約束(單擊映像以查看大圖片)
總結
除了子類型以外,已經講述了許多有關重新建立該產品出廠時所附帶的樣本 Employee ORM 來源模型的資訊。後面的兩篇文章將討論子類型和其他 ORM 約束(頻率約束、環式約束和索引約束)以及相關問題(如約束圖層)。如果您對本文有任何建設性的反饋意見,請給我寄送電子郵件(TerryHa@microsoft.com)。
參考書目
- Halpin, T. A. Object Role Modeling: An Overview(英文),MSDN,2001(也可以訪問 www.orm.net,1998)。
- Halpin, T.A. “Object Role Modeling (ORM/NIAM)”,Handbook on Architectures of Information Systems 的第四章,P. Bernus, K. Mertins 和 G. Schmidt 編(Heidelberg:Springer-Verlag,1998),也可以訪問 www.orm.net(英文)。
- Halpin, T.A.“Information Modeling and Relational Databases”(San Francisco:Morgan Kaufmann Publishers,2001),也可以訪問 http://www.mkp.com/books_catalog/catalog.asp?ISBN=1-55860-672-6(英文)。
- Halpin, T.A. Visual Studio .NET Enterprise Architect 中基於 Visio 的資料庫建模:第一部分,MSDN,2001。
- Halpin, T.A. Visual Studio .NET Enterprise Architect 中基於 Visio 的資料庫建模:第二部分,MSDN,2001。
(本文最初發表在 InConcept, Inc. 的 The Journal of Conceptual Modeling。)