摘要:本文是介绍 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 和关系数据库建模。
如果两个角色由同一对象类型担当,或角色的两个对象类型共享公用的父类型,则可以说它们“相互兼容”,并且比较它们包含的内容是很有意义的。对于角色序列(已排序的角色列表)来说,也同样适用上述规则。对于数据库来说,仅有三个相关的集合比较运算符:子集运算符 ()、等同运算符 (=) 和互斥运算符 ()。
从源角色序列至目标角色序列的子集约束规定:源角色序列中的成员(一组实例)必须始终作为目标角色序列成员的子集。该约束的图形显示为带圈的 "",由虚线箭头连接,从源角色序列指向目标角色序列(示例请参阅图 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 约束(频率约束、环式约束和索引约束)以及相关问题(如约束图层)。