摘要:本文是介绍 Microsoft Visual Studio Enterprise Architect 中基于 Visio 的数据库建模组件系列文章中的第二篇。第一部分讨论了如何创建新的对象角色建模 (ORM) 源模型,如何在 fact editor(事实编辑器)中添加句子类型、基本内部约束及示例,如何将事实类型从 business rules editor(业务规则编辑器)拖到绘图窗口中,以及如何保存模型。还说明了如何通过创建数据库模型项目、添加 ORM 源模型、然后构建逻辑模型,将 ORM 模型映射到逻辑数据库模型。最后介绍了如何通过选择目标 DBMS 和生成 DDL 脚本来从逻辑模型生成物理数据库模型。第二部分将讨论如何使用描述器,将对象类型标记为独立类型、对象化关联以及将其他一些 ORM 约束添加到 ORM 源模型中。
Microsoft® Visio® for Enterprise Architects (VEA) 包含在 Visual Studio® .NET 的 Enterprise Architect 版本中,当前为 Beta 2。发布 Beta 2 后,已经对产品做出了许多增强以及错误修正。VEA 的最终版本将成为 Microsoft Visio Professional 2002 的超集版本。同样,该产品将包含 Visio Professional 中的简单对象角色建模 (ORM) 图形解决方案,以及可以提供到/自物理数据库架构的正向/反向工程的深层 ORM 源模型解决方案。本产品的帮助文件引用简单绘图模具作为 ORM 制图器,引用深层建模解决方案作为 ORM 源模型。ORM 源模型可以用于制图和工程,而且是本系列文章中讨论的唯一 ORM 解决方案。Bate 版中通常不包括帮助文件,不过目前这些文件可以从 Web 上下载。
本系列文章简单介绍了如何在 Visual Studio Enterprise Architect 中使用基于 Visio 的数据库建模解决方案。本文重点介绍 ORM 解决方案中的描述器、对象独立、嵌套以及其他约束。假定本文的读者已经熟悉 ORM 和关系数据库建模。ORM 的概述可从网上下载 [参考书目 1 和参考书目 2],有关 ORM 和数据库建模的处理方式,在我最新出版的书 [参考书目 3] 中进行了详细的讨论。
上一篇文章讨论了如何创建简单的 ORM 模型,以及如何先将该模型映射到逻辑数据库架构,再将其映射到物理数据库架构 [参考数目 4]。我在那篇文章中指出,所有 Visio 模具和模板都具有 U.S. 单位和公制单位两种版本。在最终版本中,默认情况下只安装适用于用户所在地区的版本(U.S. 或公制)。如果要同时安装两个版本,应当选择自定义安装选项并指出还需要其他版本的解决方案。
ORM 源模型和数据库逻辑模型解决方案都能自动描述所选模型的任何部分,包括用户可能输入的任何示例。在与非技术领域专家交流模型的意义时,此功能非常有用。为了说明此功能,请打开随产品提供的 Employee ORM 源模型示例,方法是:选择 File | New | Browse Sample Drawings(文件 | 新建 | 浏览绘图示例),然后选择 Database(数据库)文件夹和 Employee ORM 源示例文件,并单击 Open(打开)按钮(参阅图 1)。
图 1:打开 ORM 源模型示例(单击图像以查看大图片)
此时应显示 Employee 源模型的 Employee 页。完整的模型包括三页:Employee、Project 和 Room。当前显示页的名称显示在绘图窗口下方的选项卡中。默认情况下,在绘图窗口下方仅显示 Database Properties(数据库属性)和 Business Rules(业务规则)窗口。要打开描述器窗口,请从主菜单中选择 Database | View | Verbalizer(数据库 | 视图 | 描述器)。此时,应在绘图窗口下方显示描述器。现在,使用鼠标选择所要描述的模型的一部分。在图 2 中,我选择了主要的外部唯一性约束。在描述器窗口中将显示其描述。
图 2:对主要的外部唯一性约束的描述(单击图像以查看大图片)
要选择单个模型元素,直接单击该元素即可。要选择所要描述的模型区域,请按住鼠标左键,并沿这一区域的对角线拖动光标。描述器将描述该区域中模型的各个方面(如果添加了事实示例,还包含这些示例)。描述器窗口保持打开状态,直到您将它关闭,但我通常开着此窗口。通过选择已显示窗口底部的相关选项卡,可以随时选择在制图器下方显示哪个窗口,例如 Database Properties (数据库属性)窗口、Business Rules(业务规则)窗口或 Verbalizer(描述器)窗口。
在图 2 中,二元关联 Employee took Course(雇员接受培训)已经对象化为 Coursework(培训工作)。由此讨论范围 (UoD),我们可以知道某个雇员接受了给定的培训课程,但她/他不知道在培训中获得的最终等级。因此,无论这些雇员是否扮演 UoD 中的其他角色,培训工作的实例都可以独立存在。因此,培训工作被标记为“independent”(独立),显示时名称后带有“!”。指定该对象类型为独立时,工具将自动输入此标记。
要将某对象类型指定为独立,请选择该对象类型,并在其数据库属性表中输入一个条目。如果当前正在显示数据库属性表,您只需单击对象类型以查看其属性。或者,双击该对象类型显示其属性表。
上一篇文章中讨论了如何使用 Fact Editor(事实编辑器)指定单个句子类型的基本方面。使用数据库属性表可以执行使用 Fact Editor 能够执行的全部操作,还可以执行更多的高级任务。其附加功能之一是带有指定某对象类型是否独立的复选框(参阅图 3)。此处显示此表的 Definition 窗格。只需在 Categories 列表上选择属性表的其他窗格,即可显示该窗格。
图 3:在数据库属性表中指定培训工作的独立性(单击图像以查看大图片)
考虑 Employee took Course(雇员接受培训)关联。为了能够记录某雇员接受给定培训的最终等级(如果有),该关联被对象化为培训工作,并添加事实类型 Coursework resulted in Grade(培训工作结果等级)。由于培训工作对象类型中嵌套了一个关联,所以此对象类型被称为嵌套类型。嵌套是使用 Fact Editor 的 Advanced 窗格指定的。如果您刚刚在 Fact Editor 中输入了新的事实类型(例如,Employee plays Sport [雇员参与运动]),而且编辑器保持打开状态,则可以在关闭编辑器前添加嵌套。相反,如果您将对象类型放在要进行对象化的图表中,则先选择事实类型,再打开 Fact Editor,可使用 Database | View | Fact Editor(数据库 | 视图 | 事实编辑器)。然后选择 Advanced(高级)选项卡,并在“Objectify / Nest fact as:”字段中输入已对象化的关联名称。例如,将 Employee plays Sport(雇员参与运动)对象化为 Play。图 4 显示了模型示例中的培训工作关联的嵌套声明。
图 4:使用 Fact Editor(事实编辑器)的 Advanced(高级)窗格指定 Nesting(嵌套)(单击图像以查看大图片)
如果该关联已在绘图窗口中,则单击 Fact Editor(事实编辑器)中的 OK(确定)按钮将会在该关联的周围显示嵌套外框。也可以将嵌套的对象类型从业务规则编辑器中拖出来,以便显示嵌套的对象类型。对象化关联的名称显示在嵌套外框的外面(参阅图 3)。可以选择嵌套的对象类型,然后拖动其控制手柄(显示为黄色小菱形),来调整此名称的位置。拖动其形状手柄(绿色小矩形)还可以竖直调整外框大小。
当前,ORM 需要每个对象化的关联各具有生成的唯一性约束,或是 1:1 的关联。在执行 model error check(模型错误检查)时强制执行此规则。从主菜单中选择 Database | Model Error Check(数据库 | 模型错误检查),可以随时执行基本的模型错误检查。
在创建嵌套对象类型时,工具自动创建此嵌套的对象类型和其定义谓词中涉及的对象类型之间的派生谓词。这提供了从任意对象类型(嵌套的或未嵌套的)浏览到架构的其余部分的统一方法,主要是为了便于概念查询而设计的。默认情况下,派生的谓词称为“involves”(包括)或“is involved in”(包含于)。要重命名这些谓词,可以双击图表窗口中嵌套的对象类型,显示其数据库属性表,然后选择 Nested Roles(嵌套角色)类别并重命名嵌套的角色名称。
第一部分讨论了如何使用 Fact Editor 将内部唯一性及简单强制角色约束添加到单一事实类型中。要声明其他基于角色的约束,最好从绘图窗口选择相关谓词,然后使用快捷菜单中的 Add Constraint(添加约束)对话框,或者从主菜单中选择 Database | Add Constraints(数据库 | 添加约束)。
使用 Employee 示例练习添加约束。先从模型中删除约束(选择约束,然后单击 Delete 键),然后再使用 Add Constraint(添加约束)对话框将它添加回去。
假设图 3 中的外部主要唯一性约束已被删除,可以按以下步骤再将它添加回去:按下 Shift 键,选择 Room is in Building(房间位于大楼)和 Room has RoomNr(房间具有房间号)事实类型,然后单击鼠标右键并选择 Add Constraint(添加约束)选项。Add Constraint(添加约束)对话框打开,并且约束类型被设置为唯一性。选中 Primary 框,表示此约束提供 Room(房间)的主要参考架构,然后选择 Building(大楼)和 RoomNr(房间号)角色(依次单击它们即可,无需按下 Shift 键)。约束描述显示在框的底部(参阅图 5)。如果外部唯一性约束未用于主要参考,请不要选中 Primary(主要)框。
图 5:在 Add Constraint(添加约束)对话框中添加主要的外部唯一性约束(单击图像以查看大图片)
如果单击 OK(确定)按钮,则对话框关闭并在绘图窗口中显示约束。如果将其他约束应用到一个或多个谓词,可以单击 Apply(应用)按钮应用约束,以保持对话框打开,并添加这些谓词的更多约束。
图 3 中的虚线圆是分离性强制角色(或)约束,表示每个雇员都必须有一个手机号或房间(或两者都有)。例如,一个签约人可能拥有手机号但没有房间,而固定雇员可能拥有房间(可能还拥有手机号)。假设此约束已被删除,可以按照以下步骤将它添加回去:选择 Employee has MobileNr(雇员拥有手机号)和 Employee has Room(雇员拥有房间)事实类型;单击鼠标右键选择 Add Constraint 选项;当显示 Add Constraint(添加约束)对话框时,将约束类型改为 Mandatory(强制);单击两个雇员角色(参阅图 6);单击 OK(确定)或 Apply(应用)按钮。
图 6:在 Add Constraint(“添加约束”)对话框中添加分离性强制角色(或)约束(单击图像以查看大图片)
Add Constraint(添加约束)对话框也可以用于指定子集、排斥、等同、频率、环式和索引约束(请参阅第三部分)。
单击(或双击)绘图窗口中的对象类型以显示其属性列表,选择 Value(值)类别,然后输入相关的值和/或值的范围,从而声明对象类型的值约束。在图 3 中,Grade(等级)对象类型被约束为以下可能的字母集合:{'A', 'B', 'C', 'F'}。假设删除了此约束,可以通过在 Value 字段中输入值 A(不包含引号),单击 Add(添加)按钮,然后对 B、C、F 重复此步骤,将它添加回去(参阅图 7)。可以单击 Remove(删除)按钮来删除值。要调整图表上的值约束,请选择对象类型(不要选择约束),然后移动显示的控制手柄(黄色小菱形)。
图 7:在数据库属性表中添加简单的值约束(单击图像以查看大图片)
默认情况下,一个值约束中最多显示五个条目。要更改此设置,请用鼠标右键单击该对象类型,选择 Shape | Custom Properties(形状 | 自定义属性),然后更改自定义属性表中 Value 列表的大小(参阅图 8)。此对话框也可以引入您自己新创建的自定义属性。
图 8:通过自定义属性控制在值约束中显示的条目的最大数目
如果将此数目设置为小于约束中的条目数目,则该显示列表后会附加一个省略号“...”,表示此列表中还包含其他值,只是没有显示出来。当列表非常大时,此项功能非常有用。无论图表中显示了多少值,您在约束中输入的所有值都包含在用于生成 DDL 的约束中。
现在,已经讲述了足够的信息,用来重新创建 Employee ORM 源模型的 Employee 页。作为一项挑战,您可能希望了解是否能够重新生成 Employee 模型的其他部分(如 Project 和 Room 页所示)。第三部分将对上述操作进行详细讨论。如果您对本文有任何建设性的反馈意见,请给我发送电子邮件。
(本文最初发表在 InConcept, Inc. 的 The Journal of Conceptual Modeling。)
本文地址:http://com.8s8s.com/it/it46181.htm