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