1.使用PowerDesigner物理模型生成數(shù)據(jù)庫
打開PowerDesigner在File里New選擇Physical Data Model(物理模型),可在DBMS選項(xiàng)里面選擇數(shù)據(jù)庫的類型,新建立模型后PowerDesigner自動(dòng)創(chuàng)建一個(gè)工作空間(Workspace)放在里面,然后模型下面默認(rèn)會(huì)創(chuàng)建一個(gè)名PhysicalDiagram_1的物理圖表區(qū),這個(gè)其實(shí)就是用來區(qū)分?jǐn)?shù)據(jù)庫內(nèi)某一模塊的單元區(qū)域,我一般是把數(shù)據(jù)庫內(nèi)有關(guān)系的表放在同一塊里面,如會(huì)員模塊就叫MemberDiagrm里面放會(huì)員及其相關(guān)的表,其他模塊就另外新建一個(gè)另外放在一起。浮在IDE右上方的Palette就是PowerDesigner里一些常見操作的工具面板,點(diǎn)擊選擇
在圖表區(qū)新建一個(gè)FA_Member會(huì)員表,雙擊表在General里面修改表名描述,這里的Name最好是用中文,然后Code就是數(shù)據(jù)庫的表名用英文,默認(rèn)是Name to Code mirroring名字會(huì)連動(dòng)的,如果覺得這個(gè)功能有點(diǎn)討厭可在Tools工具欄General Options里Dialog的Name to Code mirroring不選中即可。表的列是在Columns選項(xiàng)卡里面添加的,同樣Name最好用中文描述而Code即是表的列名了。 后面的P、F、M選項(xiàng)分別代表主鍵、外鍵、強(qiáng)制的(字段不為空),選中主鍵強(qiáng)制的選項(xiàng)也會(huì)選中,外鍵不可選當(dāng)字段有外鍵引用時(shí)自動(dòng)選中。雙擊字段列可修改字段的一些屬性,有描述、字段類型等,字段默認(rèn)值在Standard Checks選項(xiàng)卡的Values里Default處設(shè)置。再新建一個(gè)會(huì)員類型表FA_MemberType,此時(shí)會(huì)員表里面的會(huì)員類型字段應(yīng)該是引用會(huì)員類型表里面的會(huì)員類型編號(hào),在PowerDesigner里表的主外關(guān)系建立的方法是:在Palette工具面板里面選擇
Reference后先點(diǎn)擊從表然后再拖向主表,從表一條帶箭頭實(shí)線指向主表以表示主外鍵引用關(guān)系,雙擊關(guān)系名以編輯引用關(guān)系屬性,建議主外鍵關(guān)系取名為:FK_從表_Reference_主表,但注意這里的Code不是數(shù)據(jù)庫內(nèi)生成的主外鍵關(guān)系名,而是在Integrity選項(xiàng)卡里Constraint name設(shè)置,另外對(duì)Insert和Update強(qiáng)制關(guān)系級(jí)聯(lián)(Cascade)更新、刪除操作(sql2005叫疊層并可以設(shè)置為空或默認(rèn)值)也在此選項(xiàng)卡內(nèi)設(shè)置。Join選項(xiàng)卡里是設(shè)置兩個(gè)主外鍵表的引用列,PowerDesigner會(huì)自動(dòng)選擇主表主鍵為默認(rèn)主外鍵列,如果兩個(gè)表的列名不一樣則需要修改,無論是修改主外鍵還是表都能在Preview選項(xiàng)卡里面即時(shí)預(yù)覽看到生成的SQL語句。生成整個(gè)數(shù)據(jù)庫的SQL語句是在Database工具欄的Generate Database里,建議新建一個(gè)sql目錄專門放生成的sql語句文件,第一次創(chuàng)建數(shù)據(jù)庫所有表建議取名叫create1.0.sql(因?yàn)楹竺嫒渴莡pdate),Generation type建議選擇Script generation生成sql腳本文件,而不要選擇下面的Direct generation直接連接數(shù)據(jù)庫執(zhí)行,因?yàn)橛袝r(shí)候生成的SQL語句里面會(huì)有Warn警告需要稍做修改不然會(huì)報(bào)錯(cuò)的(如修改表字段類型時(shí)候?qū)⒁郧氨韮?nèi)數(shù)據(jù)導(dǎo)入時(shí)會(huì)有Warn)。Automatic archive自動(dòng)備份也需要選中,該選項(xiàng)使生成sql語句后將彈出保存當(dāng)前工程模型的對(duì)話框,后綴名為apm(其實(shí)內(nèi)容和工程文件格式pdm是一樣的,同樣都可以打開),建議新建一個(gè)目錄叫l(wèi)og里面存所有apm格式的歸檔記錄文件,由于是創(chuàng)建數(shù)據(jù)庫文件所以建議取名叫create1.0.apm,這樣能與創(chuàng)建數(shù)據(jù)庫的sql文件一一對(duì)應(yīng)。要?jiǎng)?chuàng)建數(shù)據(jù)庫,找到sql目錄里生成的create1.0.sql文件執(zhí)行即可。
2.使用PowerDesigner升級(jí)維護(hù)數(shù)據(jù)庫
做項(xiàng)目難免要升級(jí)維護(hù)之前的數(shù)據(jù)庫,PowerDesigner里的操作稍微比創(chuàng)建時(shí)麻煩點(diǎn),還是繼續(xù)以上面會(huì)員為例子,假如我現(xiàn)在已經(jīng)創(chuàng)建好了數(shù)據(jù)庫,但是需求的變化我需要在會(huì)員表上面增加一個(gè)區(qū)域編號(hào),并引用新建的區(qū)域表,那用PowerDesigner模型該如何操作呢?首先開打pdm工程文件,在以前模型基礎(chǔ)上直接進(jìn)行修改,這里的操作就是新建一個(gè)區(qū)域表在再會(huì)員表添加一個(gè)區(qū)域字段引用它的外鍵,所有的修改完成后在Database工具欄Modify Database里面進(jìn)行生成修改后的SQL語句,仍然建議設(shè)置生成sql語句的目錄放在之前建立的sql目錄下面,但是現(xiàn)在的文件名應(yīng)該叫update2.0.sql,或者加在后面加上括號(hào)簡(jiǎn)要描述,如update2.0(add area).sql。注意記得指定Backup tables和Automatic archive選項(xiàng),選中Backup tables將在修改表結(jié)構(gòu)之前把原表改名加個(gè)tmp_前綴,創(chuàng)建好新的表結(jié)構(gòu)后再insert into from select tmp_表插入以前表內(nèi)的數(shù)據(jù),起到備份以前表內(nèi)數(shù)據(jù)功能,這就是為什么有時(shí)候用PowerDesigner升級(jí)數(shù)據(jù)庫后會(huì)多一些tmp開頭的臨時(shí)表了,Automatic archive是在生成升級(jí)sql語句后提示保存當(dāng)前記錄的選項(xiàng)。由于這次修改是針對(duì)上創(chuàng)建數(shù)據(jù)庫時(shí)候的修改,注意指定Get database schema選項(xiàng)里的Using a archive model文件,這里這個(gè)文件的路徑應(yīng)該是log目錄下面的create1.0.apm文件,因?yàn)檫@次升級(jí)是針對(duì)上次創(chuàng)建數(shù)據(jù)庫時(shí)的一次升級(jí),PowerDesigner會(huì)自動(dòng)拿當(dāng)前模型和create1.0.apm之前保存的歷史存檔模型比較生成升級(jí)的sql語句,并顯示確切的修改對(duì)比變化,很清晰一目了然,如下圖:
最后提示保存Archive Model歸檔記錄模型,這里應(yīng)該叫update2.0.amp(或加上括號(hào)簡(jiǎn)要描述)并保存到log目錄下面,同樣與update2.0對(duì)照,這樣命名條理清晰可讀性強(qiáng)。以后的升級(jí)依此類推,都是相對(duì)之前的歸檔記錄進(jìn)行升級(jí),升級(jí)后記得保存當(dāng)前記錄,如果變化不大可以叫update2.1,update2.2依次遞增,如果修改較大可以升級(jí)一個(gè)版本序號(hào)叫update3.0,或者后面加上括號(hào)和簡(jiǎn)要的描述等。但是有時(shí)候我們修改的地方很少產(chǎn)生的update修改語句可能不會(huì)馬上去執(zhí)行,而是要等到下一次有多個(gè)修改的地方合起來一起去更新,這樣我們的話我們就有可能有多個(gè)update語句文件在服務(wù)器數(shù)據(jù)庫上還沒有執(zhí)行,但是和以前的update語句卻區(qū)分不開來到底有沒有升級(jí)過的,雖然說PowerDesigner產(chǎn)生的升級(jí)語句是可以多次執(zhí)行的,但不建議這么多,因?yàn)檫@樣有可能會(huì)出錯(cuò),有個(gè)辦法就是在每個(gè)已經(jīng)升級(jí)過的sql文件名后加個(gè)后綴_ed表示已經(jīng)升級(jí)過的,這樣我下次升級(jí)后就只執(zhí)行那些沒有_ed還沒有升級(jí)過的sql文件。當(dāng)我們幾次升級(jí)數(shù)據(jù)庫后,會(huì)發(fā)現(xiàn)保存的數(shù)據(jù)庫歸檔記錄文件排列得很整齊。^_^
PowerDesigner的apm歸檔格式文件也是可以直接打開的,有個(gè)時(shí)候我們可能需要數(shù)據(jù)庫某個(gè)升級(jí)版本的結(jié)構(gòu),那么現(xiàn)在您可以找到那個(gè)歸檔的apm文件用PowerDesigner直接打開,選擇Database工具欄的Generate Database選項(xiàng),那么這時(shí)候所產(chǎn)生的sql語句就是那個(gè)版本數(shù)據(jù)庫的所有表結(jié)構(gòu)了。
3.使用PowerDesigner的Domain自定義列類型
其實(shí)sqlserver數(shù)據(jù)庫里面默認(rèn)就支持用戶定義的數(shù)據(jù)類型,該功能旨在對(duì)數(shù)據(jù)庫字段實(shí)現(xiàn)通用和統(tǒng)一性,只要自定義一個(gè)數(shù)據(jù)庫列類型,多處可以引用,修改自定義數(shù)據(jù)類型,所有引用處均自動(dòng)修改,方便統(tǒng)一管理。PowerDesigner吸收這種自定義數(shù)據(jù)類型功能到模型里面,使用Domain新建一個(gè)用戶自定義類型,在模型的列類型Domain處可選擇用戶自定義類型,最后在生成sql語句的時(shí)候PowerDesigner會(huì)自動(dòng)將所有選擇用戶自定義類型的字段類型替換為用戶自定義類型里的字段類型(不是所有的數(shù)據(jù)庫都支持自定義數(shù)據(jù)類型),一般來說我們至少會(huì)把表的主鍵字段做成一個(gè)用戶自定義類型autoId,在autoId用戶自定義類型里面我們?cè)O(shè)置它的類型Data type為int然后選中Identity,那么所有的引用表的主鍵就是int類型并自動(dòng)增長(zhǎng),假如有一天我們要移植數(shù)據(jù)庫或更換所有的表主鍵的類型那么只要修改用戶自定義類型所有引用的表主鍵字段便會(huì)跟著被修改。還有一些字段為了做到通用性也建議使用用戶自定義類型,如表的標(biāo)識(shí)字段flag表示這行記錄的狀態(tài),建議使用一個(gè)int類型的用戶自定義類型并可設(shè)置默認(rèn)值,還有當(dāng)前時(shí)間字段也建議新建一個(gè)用戶自定義類型,在sqlserver數(shù)據(jù)庫里面我們可以設(shè)置它的默認(rèn)值為getdate(),當(dāng)我們更換成oracle或mysql數(shù)據(jù)庫時(shí)候就只需要修改的默認(rèn)值為SYSDATE或CURDATE()即可。
4.使用PowerDesigner的Reverse反向工程生成模型
我們以前一些項(xiàng)目的數(shù)據(jù)庫可能沒有用PowerDesigner進(jìn)行建模管理,那怎么辦呢?沒有關(guān)系,PowerDesigner的Reverse反向工程幫您重新生成模型,選擇Database工具欄Reverse Engineer Database菜單,Using script files是使用sql腳本文件來反向生成模型(不建議使用,如果sql語句太復(fù)雜生成的模型可能將與你期待的有所差異,畢竟PowerDesigner也不能全智能來識(shí)別),使用下面的Using a data source選項(xiàng)是使用現(xiàn)有的數(shù)據(jù)庫來生成,我們可以先在Configure Connections菜單里面新建立一個(gè)數(shù)據(jù)庫連接,選擇好要連接的數(shù)據(jù)庫驅(qū)動(dòng)類型,如果是Access數(shù)據(jù)庫則指定本地mdb文件的路徑,如果是連mysql數(shù)據(jù)庫需要從網(wǎng)上下載一個(gè)ODBC For Mysql的驅(qū)動(dòng),Oracle和Sqlserver有默認(rèn)的連接驅(qū)動(dòng)程序,輸入正確的數(shù)據(jù)庫用戶名和密碼后列出數(shù)據(jù)庫內(nèi)所有表結(jié)構(gòu)如下圖:
可以看到我們從數(shù)據(jù)庫反向生成模型的時(shí)候可以設(shè)置指定生成那些表、視圖、用戶自定義類型、觸發(fā)器、存儲(chǔ)過程、表主外鍵關(guān)系、索引等等,一般默認(rèn)值就好,生成后我們可以看到數(shù)據(jù)庫的結(jié)構(gòu)原模原樣的被復(fù)制到物理模型里面,E-R圖如下:
這樣,使用PowerDesigner的Reverse反向工程功能便能"同步"到當(dāng)前的數(shù)據(jù)庫,先保存一份create1.0.amp創(chuàng)建時(shí)候的數(shù)據(jù)庫存檔,之后在此基礎(chǔ)上進(jìn)行修改操作,生成出來的sql語句就是針對(duì)當(dāng)前服務(wù)器上數(shù)據(jù)庫的更新腳本。
當(dāng)我們創(chuàng)建的是PowerDesigner的面向?qū)ο竽P?Object Oriented Model)的時(shí)候同樣也能使用Reverse反向工程功能,選擇C#語言則指定cs文件的路徑,這里一般為數(shù)據(jù)庫映射的實(shí)體模型類,然后PowerDesigner便能生成對(duì)應(yīng)的面向?qū)ο竽P汀?/p>
5.使用PowerDesigner的物理模型生成不同的數(shù)據(jù)庫和轉(zhuǎn)換成OOM模型生成CS實(shí)體類代碼
PowerDesigner的物理模型保存的文件是用XML來描述模型結(jié)構(gòu)的格式,所以它不會(huì)受任何數(shù)據(jù)庫類型的影響。假如我們剛開始的例子是使用sql2000數(shù)據(jù)庫創(chuàng)建的物理模型,那么現(xiàn)在使用PowerDesigner能馬上生成一份Oracle、DB2、Mysql或Access數(shù)據(jù)庫的創(chuàng)建腳本。選擇Database工具欄中的Change Current DBMS菜單,將以前的Microsoft SQL Server 2000改為MySQL 5.0,以前sql2000數(shù)據(jù)庫的模型搖身一變成了MySQL,在Preview選項(xiàng)卡里面我們就能看到MySql的drop table if exists的sql語法了 ,這里需要注意的是轉(zhuǎn)換過程中可能會(huì)出現(xiàn)一些錯(cuò)誤,可能是因?yàn)槟阍谀P屠锸褂昧四撤N數(shù)據(jù)庫特有的一些語法或功能,在新選擇數(shù)據(jù)庫內(nèi)不能被支持使用,所以建議從一開始就使用規(guī)范的一些SQL語法建立數(shù)據(jù)庫為后面有可能移植轉(zhuǎn)換做考慮,之前還提到了使用Domian自定義類型,這里就能很好的應(yīng)用,如修改當(dāng)前時(shí)間的自定義類型的默認(rèn)值為CURDATE()即可修改所有引用字段以支持MySql數(shù)據(jù)庫,或修改autoId自定義類型為其他非int類型為表的主鍵等等。
PowerDesigner里面各種模型是能實(shí)現(xiàn)無縫隙進(jìn)行相互轉(zhuǎn)換的。還是以剛開始會(huì)員為例子,我現(xiàn)在建好了物理模型需要轉(zhuǎn)換為OOM模型,并把數(shù)據(jù)庫所有表映射生成cs代碼實(shí)體類。點(diǎn)擊Tools工具欄選擇Generate Object-Oriented Model菜單,選擇生成OOM對(duì)象的語言,這里以C# 2.0為例,如果物理模型表里的Name為中文轉(zhuǎn)換生成的OOM類對(duì)象字段里面也全是中文的話,請(qǐng)確保在轉(zhuǎn)換時(shí)OOM Generation Options里的Detail選項(xiàng)卡內(nèi)的Convert names to into codes沒有被選中。轉(zhuǎn)換成功后我們可以在OOM里面看到會(huì)員對(duì)象的一些關(guān)系和生成cs代碼如下圖:
從圖片可以看出,會(huì)員與會(huì)員類型是1對(duì)1關(guān)系,而會(huì)員類型可以對(duì)應(yīng)多個(gè)會(huì)員。所以生成的cs代碼里會(huì)員表沒有會(huì)員類型編號(hào)字段,而有一個(gè)FA_MemberType類型的屬性,代表當(dāng)前會(huì)員的會(huì)員類型,而會(huì)員類型表里面會(huì)多一個(gè)System.Collections.Generic.List<FA_Member>屬性,代表當(dāng)前會(huì)員類型的所有會(huì)員列表集合,PowerDesigner把這些面向?qū)ο蟮乃枷胝娴谋憩F(xiàn)得淋漓盡致。但有時(shí)候我們需要的實(shí)體類是數(shù)據(jù)庫內(nèi)原分不動(dòng)的字段映射過來,而不需要FA_MemberType類型的屬性只要一個(gè)包含memberTypeId字段的完整會(huì)員表實(shí)體怎么辦?我這里介紹一個(gè)簡(jiǎn)單的辦法,在物理模型轉(zhuǎn)換為OOM對(duì)象模型前先把表之間的所有References主外鍵關(guān)系全部刪除掉,可能刪除表的主外鍵關(guān)系時(shí)會(huì)PowerDesigner也會(huì)把主從表的主外鍵列也全部刪除去,設(shè)置Tools工具欄Model Options里Reference選項(xiàng)里的Auto-migrate columns勾去掉即可。刪除后不保存之前的物理模型直接轉(zhuǎn)換成OOM后再Ctrl+Z恢復(fù)之前刪除的References,這時(shí)可以看到OOM模型里面的會(huì)員類對(duì)象便是數(shù)據(jù)庫會(huì)員表所有字段原分不變的映射。另外,OOM模型可以直接生成VS的工程文件帶所有cs實(shí)體類文件,那么,我們使用PowerDesigner建立好數(shù)據(jù)庫的物理模型后,又可轉(zhuǎn)換成OOM對(duì)象模型輕松生成cs代碼實(shí)體類。
可能有些朋友的PowerDesigner打開工程Preview里看到的不是我這樣的cs代碼,而是一些public int MemberId之類的字段,這是因?yàn)镻owerDesigner將物理模型轉(zhuǎn)換到OOM對(duì)象模型的時(shí)候表的所有字段是被變成類模型里面的Attributes,而Attributes配置生成的模板默認(rèn)是不帶有g(shù)et和set訪問器的,修改Language工具欄Edit Current Object Language菜單找到Profile > Attribute > Templates > definition修改模板即可。我的C#2.0模板如下:
.if (%isGenerated%) and (%isValidAttribute%)
[%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訪問規(guī)則Bean對(duì)象生成模板如下:
.if (%Multiple%)
[%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幾乎所有模型轉(zhuǎn)換生成都可以使用模板來配置,這樣能充分的讓用戶自定義來實(shí)現(xiàn)想要的功能。
PowerDesigner的OOM功能遠(yuǎn)遠(yuǎn)不只這一些,最重要的是使用UML建用例圖了,在面向?qū)ο罄锩娴睦^承、多態(tài),面向接口編程,對(duì)象之間的依賴、包含等關(guān)系也能在這里一一體現(xiàn),不同的箭頭線條各自代表著不同的意思,也能夠生成一些cs偽代碼,由于本文主要將PDM物理模型,這里就不再贅述。不知那些大師也會(huì)不會(huì)使用PowerDesigner或Rose來畫畫圖呢?
6.使用Report導(dǎo)出生成HTML格式的數(shù)據(jù)庫表結(jié)構(gòu)數(shù)據(jù)字典
對(duì)于一個(gè)有著很多個(gè)表的龐大的數(shù)據(jù)庫,直接去查看數(shù)據(jù)庫的結(jié)構(gòu)顯得很費(fèi)力,比如我們?cè)诰幊痰臅r(shí)候要從幾百個(gè)表里面找到表然后再?gòu)膸资畟€(gè)列里去找到列的注釋說明,很麻煩,使用PowerDesigner的Report功能自動(dòng)生成所有表列的html的樹狀菜單結(jié)構(gòu),也可以作為數(shù)據(jù)庫的幫助文檔,使得我們找什么東西再也不需要跑到數(shù)據(jù)庫內(nèi)去看。選擇Report工具欄選擇Generate Report菜單使用Full Physical Report全部生成即可,生成后html效果圖如下:
圖片未能復(fù)制過來,非常抱歉!