PowerDesigner是一种著名的CASE建摸工具,最开始为数据库建模设计,即物理模型(Physical Data Model)用于生成数据库表结构,还有面向对象模型(Object Oriented Model),用于建立UML模型的结构,可以直接生成CS代码,还有其他的模型等等,不同的模型之间可以相互的转化。我最中意的就是它的物理模型直接设计生成数据库,给我们对数据库的生成升级维护带来极大的方便,下面主要来讲一下它的物理模型设计。
1.使用PowerDesigner物理模型生成数据库
打开PowerDesigner在File里New选择Physical Data Model(物理模型),可在DBMS选项里面选择数据库的类型,新建立模型后PowerDesigner自动创建一个工作空间(Workspace)放在里面,然后模型下面默认会创建一个名PhysicalDiagram_1的物理图表区,这个其实就是用来区分数据库内某一模块的单元区域,我一般是把数据库内有关系的表放在同一块里面,如会员模块就叫MemberDiagrm里面放会员及其相关的表,其他模块就另外新建一个另外放在一起。浮在IDE右上方的Palette就是PowerDesigner里一些常见操作的工具面板,点击选择在图表区新建一个FA_Member会员表,双击表在General里面修改表名描述,这里的Name最好是用中文,然后Code就是数据库的表名用英文,默认是Name to Code mirroring名字会连动的,如果觉得这个功能有点讨厌可在Tools工具栏General Options里Dialog的Name to Code mirroring不选中即可。表的列是在Columns选项卡里面添加的,同样Name最好用中文描述而Code即是表的列名了。 后面的P、F、M选项分别代表主键、外键、强制的(字段不为空),选中主键强制的选项也会选中,外键不可选当字段有外键引用时自动选中。双击字段列可修改字段的一些属性,有描述、字段类型等,字段默认值在Standard Checks选项卡的Values里Default处设置。再新建一个会员类型表FA_MemberType,此时会员表里面的会员类型字段应该是引用会员类型表里面的会员类型编号,在PowerDesigner里表的主外关系建立的方法是:在Palette工具面板里面选择Reference后先点击从表然后再拖向主表,从表一条带箭头实线指向主表以表示主外键引用关系,双击关系名以编辑引用关系属性,建议主外键关系取名为:FK_从表_Reference_主表,但注意这里的Code不是数据库内生成的主外键关系名,而是在Integrity选项卡里Constraint name设置,另外对Insert和Update强制关系级联(Cascade)更新、删除操作(sql2005叫叠层并可以设置为空或默认值)也在此选项卡内设置。Join选项卡里是设置两个主外键表的引用列,PowerDesigner会自动选择主表主键为默认主外键列,如果两个表的列名不一样则需要修改,无论是修改主外键还是表都能在Preview选项卡里面即时预览看到生成的SQL语句。生成整个数据库的SQL语句是在Database工具栏的Generate Database里,建议新建一个sql目录专门放生成的sql语句文件,第一次创建数据库所有表建议取名叫create1.0.sql(因为后面全部是update),Generation type建议选择Script generation生成sql脚本文件,而不要选择下面的Direct generation直接连接数据库执行,因为有时候生成的SQL语句里面会有Warn警告需要稍做修改不然会报错的(如修改表字段类型时候将以前表内数据导入时会有Warn)。Automatic archive自动备份也需要选中,该选项使生成sql语句后将弹出保存当前工程模型的对话框,后缀名为apm(其实内容和工程文件格式pdm是一样的,同样都可以打开),建议新建一个目录叫log里面存所有apm格式的归档记录文件,由于是创建数据库文件所以建议取名叫create1.0.apm,这样能与创建数据库的sql文件一一对应。要创建数据库,找到sql目录里生成的create1.0.sql文件执行即可。
2.使用PowerDesigner升级维护数据库
做项目难免要升级维护之前的数据库,PowerDesigner里的操作稍微比创建时麻烦点,还是继续以上面会员为例子,假如我现在已经创建好了数据库,但是需求的变化我需要在会员表上面增加一个区域编号,并引用新建的区域表,那用PowerDesigner模型该如何操作呢?首先开打pdm工程文件,在以前模型基础上直接进行修改,这里的操作就是新建一个区域表在再会员表添加一个区域字段引用它的外键,所有的修改完成后在Database工具栏Modify Database里面进行生成修改后的SQL语句,仍然建议设置生成sql语句的目录放在之前建立的sql目录下面,但是现在的文件名应该叫update2.0.sql,或者加在后面加上括号简要描述,如update2.0(add area).sql。注意记得指定Backup tables和Automatic archive选项,选中Backup tables将在修改表结构之前把原表改名加个tmp_前缀,创建好新的表结构后再insert into from select tmp_表插入以前表内的数据,起到备份以前表内数据功能,这就是为什么有时候用PowerDesigner升级数据库后会多一些tmp开头的临时表了,Automatic archive是在生成升级sql语句后提示保存当前记录的选项。由于这次修改是针对上创建数据库时候的修改,注意指定Get database schema选项里的Using a archive model文件,这里这个文件的路径应该是log目录下面的create1.0.apm文件,因为这次升级是针对上次创建数据库时的一次升级,PowerDesigner会自动拿当前模型和create1.0.apm之前保存的历史存档模型比较生成升级的sql语句,并显示确切的修改对比变化,很清晰一目了然,如下图:
最后提示保存Archive Model归档记录模型,这里应该叫update2.0.amp(或加上括号简要描述)并保存到log目录下面,同样与update2.0对照,这样命名条理清晰可读性强。以后的升级依此类推,都是相对之前的归档记录进行升级,升级后记得保存当前记录,如果变化不大可以叫update2.1,update2.2依次递增,如果修改较大可以升级一个版本序号叫update3.0,或者后面加上括号和简要的描述等。但是有时候我们修改的地方很少产生的update修改语句可能不会马上去执行,而是要等到下一次有多个修改的地方合起来一起去更新,这样我们的话我们就有可能有多个update语句文件在服务器数据库上还没有执行,但是和以前的update语句却区分不开来到底有没有升级过的,虽然说PowerDesigner产生的升级语句是可以多次执行的,但不建议这么多,因为这样有可能会出错,有个办法就是在每个已经升级过的sql文件名后加个后缀_ed表示已经升级过的,这样我下次升级后就只执行那些没有_ed还没有升级过的sql文件。当我们几次升级数据库后,会发现保存的数据库归档记录文件排列得很整齐。^_^
PowerDesigner的apm归档格式文件也是可以直接打开的,有个时候我们可能需要数据库某个升级版本的结构,那么现在您可以找到那个归档的apm文件用PowerDesigner直接打开,选择Database工具栏的Generate Database选项,那么这时候所产生的sql语句就是那个版本数据库的所有表结构了。
3.使用PowerDesigner的Domain自定义列类型
其实sqlserver数据库里面默认就支持用户定义的数据类型,该功能旨在对数据库字段实现通用和统一性,只要自定义一个数据库列类型,多处可以引用,修改自定义数据类型,所有引用处均自动修改,方便统一管理。PowerDesigner吸收这种自定义数据类型功能到模型里面,使用Domain新建一个用户自定义类型,在模型的列类型Domain处可选择用户自定义类型,最后在生成sql语句的时候PowerDesigner会自动将所有选择用户自定义类型的字段类型替换为用户自定义类型里的字段类型(不是所有的数据库都支持自定义数据类型),一般来说我们至少会把表的主键字段做成一个用户自定义类型autoId,在autoId用户自定义类型里面我们设置它的类型Data type为int然后选中Identity,那么所有的引用表的主键就是int类型并自动增长,假如有一天我们要移植数据库或更换所有的表主键的类型那么只要修改用户自定义类型所有引用的表主键字段便会跟着被修改。还有一些字段为了做到通用性也建议使用用户自定义类型,如表的标识字段flag表示这行记录的状态,建议使用一个int类型的用户自定义类型并可设置默认值,还有当前时间字段也建议新建一个用户自定义类型,在sqlserver数据库里面我们可以设置它的默认值为getdate(),当我们更换成oracle或mysql数据库时候就只需要修改的默认值为SYSDATE或CURDATE()即可。
4.使用PowerDesigner的Reverse反向工程生成模型
我们以前一些项目的数据库可能没有用PowerDesigner进行建模管理,那怎么办呢?没有关系,PowerDesigner的Reverse反向工程帮您重新生成模型,选择Database工具栏Reverse Engineer Database菜单,Using script files是使用sql脚本文件来反向生成模型(不建议使用,如果sql语句太复杂生成的模型可能将与你期待的有所差异,毕竟PowerDesigner也不能全智能来识别),使用下面的Using a data source选项是使用现有的数据库来生成,我们可以先在Configure Connections菜单里面新建立一个数据库连接,选择好要连接的数据库驱动类型,如果是Access数据库则指定本地mdb文件的路径,如果是连mysql数据库需要从网上下载一个ODBC For Mysql的驱动,Oracle和Sqlserver有默认的连接驱动程序,输入正确的数据库用户名和密码后列出数据库内所有表结构如下图:
可以看到我们从数据库反向生成模型的时候可以设置指定生成那些表、视图、用户自定义类型、触发器、存储过程、表主外键关系、索引等等,一般默认值就好,生成后我们可以看到数据库的结构原模原样的被复制到物理模型里面,E-R图如下:
这样,使用PowerDesigner的Reverse反向工程功能便能"同步"到当前的数据库,先保存一份create1.0.amp创建时候的数据库存档,之后在此基础上进行修改操作,生成出来的sql语句就是针对当前服务器上数据库的更新脚本。
当我们创建的是PowerDesigner的面向对象模型(Object Oriented Model)的时候同样也能使用Reverse反向工程功能,选择C#语言则指定cs文件的路径,这里一般为数据库映射的实体模型类,然后PowerDesigner便能生成对应的面向对象模型。
5.使用PowerDesigner的物理模型生成不同的数据库和转换成OOM模型生成CS实体类代码
PowerDesigner的物理模型保存的文件是用XML来描述模型结构的格式,所以它不会受任何数据库类型的影响。假如我们刚开始的例子是使用sql2000数据库创建的物理模型,那么现在使用PowerDesigner能马上生成一份Oracle、DB2、Mysql或Access数据库的创建脚本。选择Database工具栏中的Change Current DBMS菜单,将以前的Microsoft SQL Server 2000改为MySQL 5.0,以前sql2000数据库的模型摇身一变成了MySQL,在Preview选项卡里面我们就能看到MySql的drop table if exists的sql语法了 ,这里需要注意的是转换过程中可能会出现一些错误,可能是因为你在模型里使用了某种数据库特有的一些语法或功能,在新选择数据库内不能被支持使用,所以建议从一开始就使用规范的一些SQL语法建立数据库为后面有可能移植转换做考虑,之前还提到了使用Domian自定义类型,这里就能很好的应用,如修改当前时间的自定义类型的默认值为CURDATE()即可修改所有引用字段以支持MySql数据库,或修改autoId自定义类型为其他非int类型为表的主键等等。
PowerDesigner里面各种模型是能实现无缝隙进行相互转换的。还是以刚开始会员为例子,我现在建好了物理模型需要转换为OOM模型,并把数据库所有表映射生成cs代码实体类。点击Tools工具栏选择Generate Object-Oriented Model菜单,选择生成OOM对象的语言,这里以C# 2.0为例,如果物理模型表里的Name为中文转换生成的OOM类对象字段里面也全是中文的话,请确保在转换时OOM Generation Options里的Detail选项卡内的Convert names to into codes没有被选中。转换成功后我们可以在OOM里面看到会员对象的一些关系和生成cs代码如下图:
从图片可以看出,会员与会员类型是1对1关系,而会员类型可以对应多个会员。所以生成的cs代码里会员表没有会员类型编号字段,而有一个FA_MemberType类型的属性,代表当前会员的会员类型,而会员类型表里面会多一个System.Collections.Generic.List<FA_Member>属性,代表当前会员类型的所有会员列表集合,PowerDesigner把这些面向对象的思想真的表现得淋漓尽致。但有时候我们需要的实体类是数据库内原分不动的字段映射过来,而不需要FA_MemberType类型的属性只要一个包含memberTypeId字段的完整会员表实体怎么办?我这里介绍一个简单的办法,在物理模型转换为OOM对象模型前先把表之间的所有References主外键关系全部删除掉,可能删除表的主外键关系时会PowerDesigner也会把主从表的主外键列也全部删除去,设置Tools工具栏Model Options里Reference选项里的Auto-migrate columns勾去掉即可。删除后不保存之前的物理模型直接转换成OOM后再Ctrl+Z恢复之前删除的References,这时可以看到OOM模型里面的会员类对象便是数据库会员表所有字段原分不变的映射。另外,OOM模型可以直接生成VS的工程文件带所有cs实体类文件,那么,我们使用PowerDesigner建立好数据库的物理模型后,又可转换成OOM对象模型轻松生成cs代码实体类。
可能有些朋友的PowerDesigner打开工程Preview里看到的不是我这样的cs代码,而是一些public int MemberId之类的字段,这是因为PowerDesigner将物理模型转换到OOM对象模型的时候表的所有字段是被变成类模型里面的Attributes,而Attributes配置生成的模板默认是不带有get和set访问器的,修改Language工具栏Edit Current Object Language菜单找到Profile > Attribute > Templates > definition修改模板即可。我的C#2.0模板如下:
[%comment%\n]\
[%oidDocTag%\n]\
[%customAttributes%\n]\
.if (%Multiple% == false) and (%isIndexer% == false)
private [%flags% ]%dataType% %fieldCode%[ = %InitialValue%];
[%visibility% ][%flags% ]%dataType%
.convert_name(%fieldCode%,,"_",FirstUpperChar)
{
get { return %fieldCode%; }
set { %fieldCode% = value; }
}
.else
private [%flags% ]%dataType%[%arraySize%] %fieldCode%[ = %InitialValue%];
[%visibility% ][%flags% ]%dataType%
.convert_name(%fieldCode%,,"_",FirstUpperChar)
{
get { return %fieldCode%; }
set { %fieldCode% = value; }
}
.endif
.endif
Java 5.0带get和set访问规则Bean对象生成模板如下:
[%javaDocComment%\n]\
private [%flags% ]%dataType%\[\] %fieldCode%[ = %initialValue%];
%visibility% %flags% %dataType%\[\] get
.convert_name(%fieldCode%,,"_",FirstUpperChar)
()
{
return this.%fieldCode%;
}
%visibility% %flags% %dataType%\[\] set
.convert_name(%fieldCode%,,"_",FirstUpperChar)
(%dataType% %fieldCode%)
{
this.%fieldCode% = %fieldCode%;
}
.else
[%javaDocComment%\n]\
private [%flags% ]%dataType% %fieldCode%[ = %initialValue%];
%visibility% %dataType% get
.convert_name(%fieldCode%,,"_",FirstUpperChar)
()
{
return this.%fieldCode%;
}
%visibility% void set
.convert_name(%fieldCode%,,"_",FirstUpperChar)
(%dataType% %fieldCode%)
{
this.%fieldCode% = %fieldCode%;
}
.endif
PowerDesigner几乎所有模型转换生成都可以使用模板来配置,这样能充分的让用户自定义来实现想要的功能。
PowerDesigner的OOM功能远远不只这一些,最重要的是使用UML建用例图了,在面向对象里面的继承、多态,面向接口编程,对象之间的依赖、包含等关系也能在这里一一体现,不同的箭头线条各自代表着不同的意思,也能够生成一些cs伪代码,由于本文主要将PDM物理模型,这里就不再赘述。不知那些大师也会不会使用PowerDesigner或Rose来画画图呢?
6.使用Report导出生成HTML格式的数据库表结构数据字典
对于一个有着很多个表的庞大的数据库,直接去查看数据库的结构显得很费力,比如我们在编程的时候要从几百个表里面找到表然后再从几十个列里去找到列的注释说明,很麻烦,使用PowerDesigner的Report功能自动生成所有表列的html的树状菜单结构,也可以作为数据库的帮助文档,使得我们找什么东西再也不需要跑到数据库内去看。选择Report工具栏选择Generate Report菜单使用Full Physical Report全部生成即可,生成后html效果图如下:
这样,PowerDesigner对数据库管理升级操作的全攻略到此为止,以后发现新的功能再补上。相比Rose我觉得PowerDesigner它的功能更方便实用,而Rose可谓身出名门D调华丽,为Java量身打造很多功能,现在归属于IBM。PowerDesigner也历经风波最终被美国的Sybase所收购,这里值得一提的是PowerDesigner最初是由一个中国人开发创建!!!
以上PowerDesigner事例下载:Case下载 版本:PowerDesigner 12.5