摘要本文是介绍 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(主席)关联的 EmployeeCommittee(雇员委员会)对的集合必须是成员身份关联集合的子集也就是说每个担任委员会主席的人必须是所属委员会的成员
图 角色对之间的子集约束
要添加此子集约束请先在图表窗口中添加两个事实类型在选择谓词时按住 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(删除)可以将其删除如果两个约束都单独出现则选择其中一个约束并将其拖到另一个约束上可以将它们合并为救生圈符号
图 异或约束等于分离性强制约束加上排斥约束