浙林龙哥

   :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
摘要:本文是介绍 Microsoft Visual Studio .NET Enterprise Architect 中基于 Visio 的数据库建模组件系列文章中的第一篇,重点介绍该工具提供的对象角色建模 (ORM) 支持。

简介

Microsoft® Visio® Enterprise 2000 中的数据建模解决方案为使用对象角色模型 (ORM) 进行概念性信息分析,以及使用关系、IDEF1X、Crowsfoot 和对象关系表示法进行逻辑数据库建模提供了基本的支持。ORM 架构可以通过实施正向工程获得逻辑数据库架构,从中可以生成用于多种数据库管理系统 (DBMS) 的物理数据库架构。对物理数据库的结构实施反向工程可以获得逻辑数据库架构或 ORM 架构。最新发布的 Microsoft Visio 2002 产品只包含 Standard 版和 Professional 版,Professional 版包含了以前单独的 Technical 版,但不包含 Enterprise 版。虽然 Visio 2002 Professional 包含 ORM 模具,但仅用于绘图,因为它的 ORM 图表无法映射到逻辑数据库架构,并且无法通过实施反向工程从物理数据库获得。Visio 2002 Professional 包含数据库建模解决方案,用于定义新的逻辑数据库架构或从现有数据库对其实施反向工程,但是不能实施正向工程获得物理数据库架构。


Microsoft 曾经一度在其 Visual Studio 产品范围内支持数据库设计和程序代码设计(使用 UML)。在收购了 Visio Corporation 之后,Microsoft 有两种独立的产品(Visio Enterprise 和 Visual Studio)都支持数据库设计和 UML,从而在功能上有明显的重复。为了统一这些产品功能,首先 Visio Enterprise 内原有的深层建模解决方案已被增强并转移到 Microsoft 新产品 Visio for Enterprise Architects (VEA) 中(该产品包含在 Microsoft® Visual Studio® .NET Enterprise Architect 中)。这些基于 Visio 的建模解决方案都包含在 Visual Studio .NET Enterprise 的 Beta 2 中,随后发布的最终版本也会包括这些方案。VEA 中的深层 ORM 解决方案与 Visio Professional 中简单的 ORM 绘图模具完全不同,并且二者不能互相转换。不过,VEA 中的数据库建模解决方案可以从 Visio Professional 中导入,然后对其实施正向工程,获得 DDL 脚本或物理数据库架构。


本系列文章简单介绍了如何在 VEA 内使用数据库建模解决方案。Microsoft Corporation 已获得文中各方面信息(例如,公司名、产品名、用户界面)的商标权、版权或专利权。本文主要介绍 ORM 解决方案的基本内容,假定本文的读者已经熟悉 ORM 和关系数据库建模。ORM 的概述可从网上下载 [参考书目 1 和参考书目 2]。ORM 的深层处理和数据库建模将在我最新出版的书 [参考书目 3] 中讨论。


创建新的 ORM 模型

基于 Visio 的建模工具在 Visual Studio .NET Enterprise Architect 中作为独立的解决方案运行。打开该工具时,Beta 版的打开屏幕如图 1 所示。选择 Database (数据库)作为绘图类型,然后选择相关 ORM 模板。如果用户所在地为美国,通常选择 ORM Source Model (US units),如下所示(默认的页面大小为 Letter,默认的度量单位为英寸)。将光标悬停在模板图标上时,图标将突出显示并在左侧显示工具提示。Visio 提供美国版本和国际(公制)版本两种模板。如果选择不带 (US units) 的 ORM Source Model,默认的页面大小为 A4,默认单位为公制。


注意:在最终的版本中,除非选择其他版本,否则仅安装适用于用户所在国家/地区的标准单位系统。

选择 ORM 源模型模板时,将显示如图 2 所示的屏幕。除了位于顶部的菜单和图标外,还有一个 ORM 模具、一个 Drawing(绘图)窗口和一个用于显示 Business Rules 编辑器、数据库属性表以及可能打开的其他窗口(例如,Verbalizer(描述器))的区域。


图 1:选择使用 ORM Source Model(ORM 源模型)


图 2:ORM 模具、Drawing(绘图)窗口和 Business Rules(业务规则)窗口

为了减少图 2 所占用的空间,我已经对其显示的大小作了最大程度的调整。通常 Drawing 窗口将占据大部分屏幕。默认情况下,ORM 模具中的三种形状显示在同一水平行中。通过减少 ORM 模具的宽度使三种形状垂直排列,可以为 Drawing 窗口提供更多空间,如此处所示。要调整模具宽度,请将光标悬停在模具和绘图窗口之间的边框上,光标变为调整大小光标时,将边框向左侧拖动。


使用 Fact Editor(事实编辑器) 添加句子类型

通过将 Object Type(对象类型)和 Predicate(谓词)形状从模具拖到 Drawing 窗口,可以将句子类型(事实类型或引用类型)添加到 ORM 模型中。另外,还可以使用 Fact Editor(事实编辑器)添加句子类型。现在,让我们使用 Business Rules 编辑器来进行此操作。将光标移到 Business Rules(业务规则)窗口中的 Fact Types(事实类型)窗格的底端行(在本例中只有一行)。输入事实类型或按 F2 键。显示 Fact Editor(事实编辑器)。还可以通过从屏幕顶部的 Database(数据库)菜单中选择 Database|View|Fact Editor (数据库|视图|事实编辑器)来调用 Fact Editor(事实编辑器)。默认情况下,Fact Editor (事实编辑器)的输入样式是 Guided(导向),如图 3 所示。


图 3:使用 Guided (导向)输入样式窗口的 Fact Editor(事实编辑器)

可以输入二元关系,提供正向阅读(例如,Employee works for Department[雇员就职于部门])和反向阅读(例如,Department employs Employee [部门雇用雇员])方式。如果需要,可以从二元中选择不同的设置更改关系中的数量(角色数目)。Object 窗格允许用户将对象类型分为实体类型、值类型或外部对象类型。如果实体类型具有简单的标识方案,则可以添加其引用模式(例如,雇员编号和部门代码)。


熟悉 Fact Editor(事实编辑器) 后,您可能希望将其输入样式更改为 Freeform(自由绘制),这样就可以通过使用正式语法更加快捷地输入句子类型。要将输入样式更改为 Freeform,可以使用选项按钮,还可以通过以下步骤使 Freeform 成为默认类型:转到屏幕顶部的 Database(数据库) 菜单,选择 Database | Options | Modeling...(数据库 | 选项 | 建模...),然后打开 Fact Editor (事实编辑器)窗格并将首选模式设置为 Freeform,如图 4 所示。在许多语言中,通过首字母大写命名对象类型,将其名称假设为一个词语(例如 Employee [雇员] 和 VicePresident [副总统]),可以很方便地标识对象类型。对于不适于使用这种方法的语言,或当名称由以空格分隔的多个词语组成时,应该选择括号模式:将对象类型名称用方括号括起来(例如,[employee]、[vice president])。


图 4:将 Fact Editor(事实编辑器) 的默认输出样式设置为 Freeform

在 Freeform 模式中,引用模式显示在对象类型名称后面的括号中。如果应用了反向阅读,则使用反斜杠 (/) 来区分正向阅读和反向阅读。


图 5 为一个示例。


图 5:使用 Freeform 输出样式的 Fact Editor(事实编辑器)(单击图像以查看大图片)


为实体类型提供引用方案后,就不需要在以后指定事实类型时重复引用方案了。与实体类型不同,值类型(例如,EmployeeName [雇员姓名]、RoomNr [房间号])没有引用方案,由于其实例仅为文字常数(例如,用于命名或引用实体的字符串或数字),因此它们可以标识其自身。在 Freeform 模式中,值类型通过附加空括号 [()] 来标识。下面提供了使用正式的、自由绘制语法的某些事实类型的示例:


Employee(empNr) works for / employs Department(code)

Employee has EmployeeName()

Employee has MobileNr()

Employee drives / is driven by Car(regNr)


现在,使用 Fact Editor (事实编辑器)输入这些事实类型(使用 Guided 或 Freeform 输入)。单击前三个事实类型后面的 Apply(应用) 按钮添加事实类型。输入第四个事实类型后,单击 OK(确定)。此操作将添加最后一个事实类型,并关闭 Fact Editor(事实编辑器)。这些事实类型尚未显示在绘图窗口中,但是现在已列在 Business Rules 编辑器中了。如果将光标移到其中一个 Fact Editor (事实编辑器)上,其右侧将显示一个 Edit(编辑) 按钮(参阅图 6)。如果单击 Edit(编辑) 按钮,将弹出 Fact Editor(事实编辑器),显示要编辑的事实类型。此操作提供了一种在 Fact Editor(事实编辑器) 中添加基本约束和示例的方法。

图 6:事实类型列在 Business Rules 编辑器中,并且可以编辑

使用 Fact Editor(事实编辑器)添加基本内部约束

如果约束仅应用到一个谓词,则为内部约束,否则为外部约束。使用 Fact Editor(事实编辑器) 可以声明以下内部约束:内部唯一性、简单强制、内部频率和环式约束,但不能指定内部集合比较约束(例如,同一谓词的两个角色之间的排斥约束)、外部约束(例如,外部唯一性约束或两个谓词之间的集合比较约束)或值约束(例如,将 Sexcode [性别代码] 值限制为 {M, F})。实际上,Fact Editor(事实编辑器) 中声明的约束最好限制为简单内部唯一性约束和简单强制约束。要声明其他类型的约束,有一个快捷方法(请参阅此系列文章的第二部分)。


要向 Fact Editor(事实编辑器)中显示的事实类型添加约束,请选择 Constraints(约束)选项卡。默认情况下,constraints(约束)窗格将唯一性和强制性约束组合在一起,以便更快地对其做出指定。例如,在图 7 中,选择“exactly one”(恰好为一)表示“at least one”(至少一个,强制)和“at most one”(至多一个,唯一)两种情况。约束符号和描述信息将自动显示,以帮助用户查看选择的结果。如果不想使用默认的快捷方式,请打开 Database Modeling Preferences(数据库建模首选参数)对话框(图 4),并取消选中指示组合了唯一性和强制性的选项 (UM)。


图 7:在 Fact Editor(事实编辑器) 中添加约束

请添加以下约束,练习使用 Fact Editor(事实编辑器)添加约束。在当前版本的工具中,在最终的约束中使用“some”(某些)取代“the same”(同一),表示“drives”(拥有)关系是可选的并且是多对多的关系。


Each Employee works for some Department

Each Employee works for at most one Department

Each Employee has some EmployeeName

Each Employee has at most one EmployeeName

Each Employee has at most one MobileNr

It is possible that the same Employee drives more than one Car and that

the same Car is driven by more than one Employee


在事实类型中添加示例

最好为所有事实类型包含示例。要向 Fact Editor(事实编辑器) 中显示的事实类型添加约束,请单击 Examples(示例)选项卡,然后输入足够的示例以阐明相关约束。例如,图 8 显示了 Employee works for Department(雇员就职于部门)事实类型的三个事实示例。此处,雇员 101 和 102 就职于销售部门 (SLS),而雇员 103 就职于市场部门 (MKTG)。这种填充与我们的解决方案一致,即每个雇员就职于至多一个部门(第一列中的值是唯一的),但是同一部门可以雇用一些雇员(SLS 在第二列中是重复的)。


图 8:为 Employee works for Department (雇员就职于部门)添加示例事实实例

可以使用 Analyze(分析) 按钮来请求工具,减少示例中的约束,或者检查数据和约束规范之间是否存在不一致。自己试一试。此功能对于验证约束十分有用。


保存模型

要保存模型,请从 File (文件)菜单中选择 File | Save(文件 | 保存),或单击 Save (保存)图标。将会打开 SaveAs (另存为)对话框。选择要保存模型的文件夹,为模型添加文件名,在对话框中单击 Save(保存)按钮,然后在 properties 对话框中单击 OK(确定)。保存的文件将使用扩展名 .vsd(Visio 文档)。


在绘图上显示句子类型

要在图表中显示使用 Fact Editor(事实编辑器) 输入的句子类型,请在 Business Rules 编辑器中找到感兴趣的事实类型。要选择一系列连续的事实类型,请按住 Shift 键,并选择该系列的第一个和最后一个事实类型。所有事实类型(除第一个类型外)将突出显示。然后,将事实类型拖到绘图页面上所需的位置。


现在,请尝试对模型中的四个事实类型执行此操作。默认情况下,显示的图表如图 9 所示,您可以通过来回移动谓词文本和对象类型来优化显示。


另一种便捷的方法是,打开 Business Rules(业务规则)窗口中的 Object Types(对象类型)窗格,拖出一个或多个相关的对象类型,然后使用 Show Relationships(显示关系)关系选项。例如,如果将 Employee(雇员)对象类型拖到绘图页面上,用鼠标右键单击 Employee (雇员)并从快捷菜单中选择 Show Relationships(显示关系),则在该页上将显示 Employee(雇员)所具有的所有关系。这个 ShowRelationships(显示关系)功能在架构浏览和反向工程中非常有用,它是以前在 VisioModeler 或 Visio Enterprise 中未提供的许多新功能之一。


图 9:通过从 Business Rules(业务规则)编辑器中拖动四种事实类型而形成的图表


将 ORM 模型映射到逻辑数据库模型

要将 ORM 模型映射到逻辑数据库模型,首先将 ORM 模型添加到数据库模型项目中,然后生成它。从 File(文件)菜单中,选择 File | New | Database | Database Model Diagram (US units)(文件 | 新建 | 数据库 | 数据库模型图表 (US 单位)),打开逻辑数据库建模解决方案。如果要使用公制模板,请选择不带 (US units) 的 Database Model Diagram(数据库模型图表)。此时的屏幕如图 10 所示,只是绘图窗口的大小已被我明显缩小了。可以使用 Entity Relationship 模具来从头创建逻辑数据库模型,但是现在,我们将从 ORM 模型中导出数据库模型。


图 10:逻辑数据库建模解决方案(单击图像以查看大图片)


要创建数据库模型项目,请从 Database(数据库)菜单中选择 Database | Project | Add existing document(数据库 | 项目 | 添加现有文档)。将显示 Add Document to Project(将文档添加到项目中)对话框。使用 Look in: 字段浏览到保存的 ORM 模型,然后单击 Open(打开) 按钮。在项目窗口中将列出 ORM 模型(此处的模型名为 JCM1.vsd)。单击主菜单上的 Save(保存) 图标,并给出文件名(我选择了 ProjJCM1)来保存项目文件。项目文件的扩展名也是 .vsd。当前模型的名称和页面始终列在屏幕顶部的标题栏中。图 11 显示了此时应显示的屏幕。


图 11:包含 ORM 源模型的数据库项目

现在,从 Database(数据库) 菜单中选择 Database | Project | Build(数据库 |项目 | 生成),来创建逻辑模型。关系架构自动生成,并且在屏幕左侧的 Tables and Views (“表和视图”)窗口中显示结果表方案(参阅图 12)。


图 12:通过映射 ORM 模型建立的两个表方案(单击图像以查看大图片)


要在图表上查看这些表方案,请将其拖到绘图页面中。结果如图 13 所示,有两个表方案,方案之间由一个外键连接。每个表的名称以阴影标题显示,标题的下方列出了各列。主键带下划线,用“PK”标记,并显示在该列的顶格中。强制(非空)列以粗体表示。外键列标记为 FKn,其中 n 是表外键的编号。本例中只有一个外键,指向 Employee 表的主键。外键连接其实就是从外键到目标键的箭头。


图 13:从 ORM 模型映射的关系架构


在本例中,表和列的名称将在默认情况下自动生成。在实际应用中,通常我们会重命名其中的许多名称,并且更改已选择的许多默认的数据类型。有多种配置选项,可用来控制表和列的名称的生成方式。在实际应用中,最好在 ORM 模型上设置数据类型,在该模型上,对象类型对应于概念上的域。然后,正确的数据类型将自动基于这些域传播所有属性。本文对此类问题不加详述。


生成物理数据库架构

在 Database(数据库)菜单中单击 Database | Generate(数据库 | 生成),可以生成所选目标 DBMS 的内部架构。生成架构时,用户可以选择生成 DDL 脚本,而不是使用工具建立表。通常最好先生成 DDL 脚本,以便以后在所选的 DBMS 中执行。请遵循生成向导中的步骤:选择驱动程序(例如 Microsoft® SQL Server 2000),输入数据库名称(例如 mydb),接受下一屏幕中的默认设置,选择 Yes(是) 以查看生成的 DDL 脚本,然后将 DDL 脚本保存为文本文件。
摘要:本文是介绍 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 的约束中。
摘要:本文是介绍 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:异或约束等于分离性强制约束加上排斥约束
posted on 2004-07-27 10:53  浙林龙哥  阅读(4220)  评论(0编辑  收藏  举报