Sybase 公司PowerDesigner上海研发中心 余亚,王晓昀
概 述 从80年代中期开始,随着C++语言的成功,面向对象语言已经成为软件开发中的主导语言。现在很多商用软件,尤其是企业信息系统,都是使用面向对象语言进行开发的。应用面向对象方法,我们通过类来抽象不同类别的实体,属性来表示实体的静态特征,关联来抽象实体间的联系,继承来抽象类别的包含关系。
很多的应用程序都需要进行数据存储,关系型数据库是最常用的数据管理系统。在关系型数据库中,表、列和外键是抽象数据的基本元素。关系型数据库是建立在关系计算和布尔代数基础之上的,SQL是数据库的操作语言,通过关系运算,连接、联合等,来操作数据。
我们很容易的看出,面向对象模型和关系模型是不完全匹配的。比如 1. 对象可以存储到多张表,表也可以存储多个类的对象。 2. 对象之间的关系是双向的,而表之间的关系是单向的。 3. 对象之间有继承关系,表之间没有。
为了解决这种不匹配,人们定义了很多映射模式来建立两种模型间的对应关系。这些映射模式逻辑上解决了模型间的不匹配,使得面向对象程序能够正确地和关系关系型数据库进行交互,但是对于程序的开发,仍然有很多问题需要解决。
问 题
对于设计人员来说,他们需要找到并且描述这两种模型元素间的映射关系,以便编程人员能够正确地实现数据的存储和查询。现在很多建模工具仅提供其中一种模型的支持,比如Together仅支持对象建模,ERWin仅支持数据建模。即使同时支持两种模型,这种支持也很不完整,比如Rose中的数据建模功能。分析设计人员常常需要两种不同的工具来进行建模,如果他们想描述这两种模型元素间的对应关系,他们只能通过文档或者表格的形式。这很容易产生错误,并且如果模型发生改变,这些文档需要手工更改,容易造成不一致,维护起来很困难。
对于编码人员,他们需要应用某种技术来实现模型的这种对应关系。如果通过语言提供的数据库访问接口,比如Java的JDBC或者.Net的ADO.Net,对于每一个对象的每一个存储操作,编码人员需要编写存取操作的SQL,数据库控制和访问代码,这是一项繁琐、重复性的劳动。即使应用O/R 映射的框架,比如Hibernate, EJB 3.0或者.Net平台的NHibernate,他们需要编写映射文件或者通过标记来定义O/R映射框架所需要的映射元数据。这些映射元数据只不过是我们在设计阶段定义的映射关系另外一种表现方式,转换成XML或者标记的方式,无疑这种转换增加了错误的可能性和维护的难度。
PowerDesigner解决之道
PowerDesigner提供对于多达8种模型的支持,其中包括面向对象模型和关系数据模型。作为一个集成的企业建模工具,PowerDesigner并不是简单的将几种模型工具罗列在一起。各种模型相互之间可以建立关联,通过这种关联,它提供了企业模型统一、一致的视图。其中模型间的映射和自动生成是建立模型间关联重要的手段。
模型可以描述系统的静态特征和动态特征,而静态特征可以用来表述系统的持久状态,比如面向对象模型中的实体类,数据库模型的表,XML模型中的元素节点等。在PowerDesigner中,我们可以在各种可以描述持久状态模型间建立映射,比如XML模型到面向对象模型间的映射,面向对象模型到关系数据模型的映射等。下面我们就来看一下,PowerDesigner是如何支持面向对象模型到关系模型的映射的。
对象/关系映射
下表列出了PowerDesigner中面向对象元素和关系模型元素间的对应关系:
OOM 元素
|
PDM 元素
|
域
|
域
|
类
|
表
|
接口
|
无
|
属性
|
列
|
标识符
|
键
|
操作(具有存储过程范型)
|
存储过程
|
操作(具有存储功能范型)
|
存储功能
|
关联
|
外键或者表
|
关联类
|
表和两个指向关联的类所生成表的外键
|
继承
|
表或者外键
|
依赖
|
无
|
实现
|
无
|
引用
|
无
|
表1
在PowerDesigner中,我们可以通过三种方式来建立面向对象模型和关系模型间的映射: ? 手工建立映射。 ? 自动模型生成。
它们分别适用于不同的开发需求,下面我们就来看如何通过这两种方式来建立映射。
手工建立映射
这种方式适用于以下几种情况:
-
在已经存在的模型间建立映射。企业的信息系统是一个异构的环境,很多应用程序和数据库都是独立开发的,它们具有不同的模型,如果它们之间需要进行数据交互,则需要建立它们之间的映射,比如新的ERP系统中和企业原有的数据库间的映射。
-
数据库和程序由不同的组负责设计。大型的企业应用程序可能包含很多业务子系统,每个业务子系统只考虑如何实现它自己的业务需求,而数据库设计要从整体出发,考虑整个应用程序的需求。对于每个业务模块,需要定义它的逻辑模型和数据库模型间的映射。
在建立映射之前,我们需要给面向对象模型创建数据源,然后添加要映射的数据库模型。表1中可以映射的面向对象元素都有一个映射的定义窗口,比如下图所示的类的映射属性页。通过这个映射属性页,用户可以添加或者删除对应的数据库模型元素,这些元素只能是表1中该元素对应的类型。
像其他模型的元数据一样,PowerDesigner会把映射元数据存储在模型中,映射元数据通过快捷方式来记录对应的模型元素。如果对应的模型发生改变,比如表的名称发生改变,对于映射元数据没有影响。当用户需要得到对应元数据的属性的时候,PowerDesigner会解析快捷方式,找到目标元素,用户得到的是当前元素的信息,对比于文档或者表格,这种方式提高了一致性和可维护性。而且PowerDesigner提供了变更影响分析视图,它可以帮助用户在变更之前分析可能产生的影响,比如在改变列的类型之前,用户可以了解到是否会造成映射到此列的属性类型的不匹配。
也许用户认为这种操作方式太复杂,用户需要切换到每个面向对象的窗口来定义它的映射。从PowerDesigner 12开始,用户可以通过另外一种更加便捷的方式,映射编辑器,来定义元素间的映射关系。映射编辑器提供了一种All-In-One的操作方式,通过元模型和目标模型的树状视图,用户可以方便的通过托拽的方式来定义所有的映射。
模型自动生成
在很多时候我们要开发一个全新的系统,而数据库仅仅考虑这个系统的数据管理需求,或者开发新的应用程序访问已有的数据库。采用面向对象方法的软件开发通常采用自顶向下的开发过程,先建立企业的应用模型,然后再进行数据库设计。用户也可以采用自底向上的开发过程,也就是以数据为中心的开发过程,先进行数据库设计,或者应用已有的数据库模型,再设计应用程序模型。
既然我们定义了模型间映射模式,如果有了一种模型,为什么不能自动生成另外一模型,并且建立它们间的映射。PowerDesigner就提供了这种模型的自动生成功能,使得用户能够重用现有的模型,方便的生成目标模型。对于面向对象模型和数据库模型来说,这种自动生成功能是双向的,即可以通过面向对象模型来生成数据库模型,也可以通过数据库模型来生成面向对象模型。
自动生成数据库模型
这种模式适合于自顶向下的开发过程,即先建立应用程序模型,再设计数据库。我们可以应用PowerDesigner提供的转换模式,将应用程序模型中描述持久信息的面向对象元素,实体类、关联、继承,生成数据库模型对应的元素。
根据已经被证明的映射模式,PowerDesigner提供了一些缺省的转换模式,用户也可以定制转换模式来控制生成过程
基本转换模式
用户可以通过类的持久属性和生成类型来控制类的自动转换,PowerDesigner仅会自动转换持久的类。转换的类型有表、迁移列和抽象数据类型,其中表和抽象数据类型都容易理解,迁移列主要控制继承中类的转换,我们会在继承转换中详细讨论它的用法。用户还可以指定生成表的名称。
如果持久类的生成类型不是抽象数据类型,PowerDesigner会将该类中的持久属性转换成表的列。PowerDesigner提供了一些缺省的转换模式,比如数据类型的对应关系。用户可以定制转换的过程,他可以定义生成列的一些属性,名称、类型、长度等。
持久类的标识符会被转换成表的键,主标识符会被转换成主键。
如果持久类的操作具有存储过程或者存储函数的范型,相应的存储过程或者存储函数会被生成。
关联转换
PowerDesigner会根据关联生成外键和表,支持所有的关联映射模式。
关联
|
转换规则
|
一对一
|
对于单向的关联,一个外键会生成,外键的方向和关联的方向一致,父表的主键会迁移到子表中作为外键。对于双向的关联,两个外键会被生成,用户需要手动删除其中的一个
|
一对多
|
不管单项还是双向,只有一个外键被生成,多端持久类生成的表为子表,父表的主键会迁移到子表中作为外键
|
一对多迁移主键
|
这是一对多关联的变体,如果一对多关联具有组合并且由一端包含多端,那么被迁移到子表的列同时又会是主键的一部分
|
多对多
|
会生成一个中间关联表和两个外键,其中两端持久类的表的主键会迁移到关联表中作为主键和外键,两个外键由中间关联表分别指向它们
|
用户可以通过端点的度来控制外键是否为必需的,如果子表对应的持久类端的最小度为1,那么外键为必需的,即子表的外键列是非空的;如果为0,那么外键为可选的。
继承转换
PowerDesigner会将继承转换成表和关联,用户通过基本映射中提到的生成类型来控制转换,生成类型表表示对于该持久类单独的表会生成,生成类型迁移列表示该类属性生成的列会存在于其他类生成的表中,没有单独的表会被生成。
映射模式
|
说明
|
设定
|
继承层次到单表映射
|
整个继承层次会被转换成一张表,通过表中的分类列来区分不同的类
|
根类生成类型为表,其他所有子类的生成类型为迁移列,根类需要设置主标识符
|
每类一表映射
|
对于继承层次中的每一个类,单独的表会被生成,子类的表和父类的表通过外键关联,外键的列同时作为子类表的主键
|
所有类的生成类型为表,根类需要设置主标识符
|
每具体类一表映射
|
只有继承层次中的叶子节点类会被转换成表,每一个非叶子节点类属性生成的列会被迁移到叶子类的表
|
所有非叶子节点子类的生成类型为迁移列,叶子节点的生成类型为表,根类需要设置主标识符
|
PowerDesigner也支持混合映射模式的转换,不过这种转换并不常用,用户可以参考PowerDesigner的文档查看详细用法。
其他映射模式的支持
PowerDesigner还可以通过嵌入来支持细粒度的转换。比如,在员工信息类中,我们有一个属性家庭住址,该属性是对象类型,类型为地址类。我们不想为地址类单独生成表,只想把它嵌入到员工信息表中。在PowerDesigner中,我们可以通过,设置属性的类生成类型为嵌入来实现这一点。
自动生成面向对象模型
PDM到OOM的转换适合于自底向上的开发过程,对于以数据为中心的应用系统或者访问已有数据库上的应用系统,这种转换是非常有用的。PDM到OOM的转换类似于OOM到PDM转换的逆过程,PowerDesigner会把PDM中的元素转换成OOM中对应的元素。但是其中继承的转换是不可逆的,因为PDM中没有子类的概念,所以用户需要手工更改生成后的对象模型。
模型和并
PowerDesigner提供了模型合并功能,支持迭代式的模型自动转换。自动生成的目标模型并不一定完全满足我们的需要,我们常常要对它进行修改,但是源模型也发生了改变,有时我们既想同步目标模型和源模型,又想保持我们对目标模型所作的修改,这时模型的合并显得非常重要。通过PowerDesigner的模型合并窗口,用户可以了解到重新生成的模型和当前的目标模型的差异,从而可以根据自己的需要,选择是否保持或者覆盖以前的模型。
用户还可以通过PowerDesigner的流体模型了解源模型和目标模型间的转换关系。
自动代码生成
从上面可以看到,通过PowerDesigner,设计人员可以方便的完成应用程序的设计、数据库设计以及O/R映射定义,那么编程人员通过编码实现这些设计。对于O/R映射的实现,我们可以看到,不管使用什么技术,编码人员都需要进行大量的工作。
我们知道MDA的目标就是把现有的以代码为中心的开发模式转换成以模型为中心的开发模式,让模型生成代码,把开发人员从繁琐的编码工作中解放出来,从而专注于系统的架构和业务逻辑上。PowerDesigner通过其可扩展性提供了对于MDA的支持。在PowerDesigner中,所有的模型都是通过元模型进行描述的,可以通过GTL(通用模板语言)和VBScript来访问这些元模型。那么我们可以通过元模型的信息来做他想要做的事,包括自动代码生成。
PowerDesigner已经提供了对于主要持久化技术的支持,Hibernate、EJB 3、NHibernate、ADO.Net等,用户可以直接使用这些扩展模型。除了O/R映射实现代码,这些扩展模型还可以生成测试代码,方便用户对生成的代码进行测试。用户只需要添加相应的扩展模型,并且通过扩展属性设置特定扩展模型所需的信息,就可以实现自动代码生成。下图是应用Hibernate扩展模型生成映射文件的预览窗口。
用户也可以对这些扩展模型进行定制或者开发他自己的扩展模型,以满足自己的需要。关于如何扩展PowerDesigner,可以参阅PowerDesigner用户文档和高级使用手册。
结论
我们可以看出,通过PowerDesigner的模型映射,设计人员可以很方便的定义O/R映射,不管是手工的方式还是通过自动模型转换。O/R映射元数据同模型保存在一起,保证了一致性,方便的和模型同步,提高了可维护性。通过自动代码生成,编码人员不再需要进行繁琐、重复性的劳动,提高了开发的生产率。
|
相关推荐
本书系统地介绍了业务建模、数据建模和应用程序建模的方法和过程,通过PowerDesigner的实现,使读者全面掌握软件分析建模的思想,是软件工程师学习软件分析、建模的入门教材。PowerDesigner 12.5集中体现了软件分析...
PowerDesigner中的对象与关系映射建模... 15 使用PowerDesigner 12.0创建Web服务... 22 开发人员应该如何使用PowerDesigner. 26 使用SQL Server时最容易忽略的21个问题... 27 使用PowerDesigner 建立企业知识库....
PowerDesigner中的对象与关系映射建模... 15 使用PowerDesigner 12.0创建Web服务... 22 开发人员应该如何使用PowerDesigner. 26 使用SQL Server时最容易忽略的21个问题... 27 使用PowerDesigner 建立企业知识库....
在PowerDesigner中,你可以通过实体、属性、关系来定义业务对象及其相互关系,为后续的逻辑和物理建模打下基础。 2. **逻辑数据模型(LDM)**:LDM进一步细化了CDM,考虑了数据库系统的特定需求,如数据类型、主键...
PowerDesigner 12.0 精彩荟萃 PowerDesigner UML 建模简介(一) PowerDesigner UML 建模简介(二) PowerDesigner中的对象与关系映射建模 全面数据资产建模与管理 使用PowerDesigner 建立企业知识库
《PowerDesigner系统分析与建模(第2版)》是一本深入探讨数据库设计与建模的专业书籍,旨在帮助读者掌握使用PowerDesigner这一强大的数据建模工具进行系统分析和设计的方法。PowerDesigner是一款由Micro Focus公司...
本书系统地介绍了业务建模、数据建模和应用程序建模的方法和过程,通过PowerDesigner的实现,使读者全面掌握软件分析建模的思想,是软件工程师学习软件分析、建模的入门教材。PowerDesigner 12.5集中体现了软件分析...
PowerDesigner系统分析与建模是IT系统设计和开发过程中不可或缺的工具之一,它可以辅助软件工程师、系统分析师和企业架构师进行高效的数据管理和架构设计。 知识点一:PowerDesigner的基础概念 PowerDesigner包含的...
PowerDesigner整合了UML(统一建模语言)和数据建模的CASE(计算机辅助软件工程)工具,不仅支持系统设计与开发的多个阶段,如系统需求分析、对象分析、对象设计、数据库设计及程序框架设计等,而且能够绘制数据流程图...
通过访问CDM中关系的“Detail”选项卡,可以精细控制这些参数,从而更准确地反映业务逻辑和数据结构。 #### 7. **报告语言与格式化** 为了生成易于理解和分享的设计文档,PowerDesigner支持多种报告语言和格式化...
PowerDesigner是一款强大的数据库设计与建模工具,广泛应用于软件开发过程中的数据建模阶段。它提供了全面的数据建模功能,包括概念数据模型(CDM)、逻辑数据模型(LDM)和物理数据模型(PDM)。然而,标题所提及的...
本书系统地介绍了业务建模、数据建模和应用程序建模的方法和过程,通过PowerDesigner的实现,使读者全面掌握软件分析建模的思想,是软件工程师学习软件分析、建模的入门教材。PowerDesigner 12.5集中体现了软件分析...
PowerDesigner是一款强大的数据库设计和建模工具,它在IT行业中广泛应用于系统分析、数据库设计以及数据仓库的构建。通过PowerDesigner,开发人员可以进行概念数据模型(CDM)、逻辑数据模型(LDM)和物理数据模型...
8. **高级功能**:PowerDesigner 还提供了诸如对象/关系映射以及模型之间的链接和同步等高级功能,确保模型的一致性和准确性。 #### 三、PowerDesigner 10 新特性 1. **商业流程建模能力**:PowerDesigner 10 强化...
PowerDesigner中的概念模型使用实体-关系(E-R)图来表示业务对象和它们之间的关系。在这里,你可以定义实体、属性和联系,帮助理解业务逻辑。实体代表现实世界中的对象,属性是实体的特性,联系则描述了实体间的...
面向对象模型(OOM)在PowerDesigner中特指使用UML(统一建模语言)来创建应用程序模型,这涉及到软件工程中的类、接口、组件、部署等概念。UML模型可以帮助软件开发者梳理和文档化系统设计,使得软件的设计结构更加...
用户需要定义哪些PowerDesigner的对象(如类、实体)和链接对象(如关系)将被导出,并指定它们在Troux中的对应组件或关系。此外,还需设定PowerDesigner属性如何映射到Troux的属性。 **3. 添加Metaclass至导出扩展...
7. **元数据集成**:PowerDesigner在一个基于资源库的环境中提供了多种建模技术的元数据集成,无论是技术层面还是非技术层面,都能通过对象/关系映射和链接同步技术实现实时更新,保持各模型之间的一致性。...
PowerDesigner是一款由Sybase公司推出的强大的建模工具,广泛用于数据建模、业务流程建模和对象建模等。本次教程主要涉及以下几个方面: 1. PowerDesigner 16.5的新特性概述:PowerDesigner 16.5相对于之前的版本,...