使用PowerDesigner的物理模型創建升級管理數據庫(轉)
使用PowerDesigner的物理模型創建升級管理數據庫
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效果圖如下:
圖片未能復制過來,非常抱歉!
posted on 2011-10-08 10:10 Steven_bot 閱讀(2062) 評論(0) 編輯 收藏 所屬分類: 遇到的一些問題