PowerDesigner
作為數據庫建模和設計的
CASE
工具之一,在數據庫系統開發中發揮著重要作用。
運用
PowerDesigner
進行數據庫設計,不但給人直觀地理解模型,而且充分運用數據庫的技術,優化數據庫的設計。
PowerDesigner
支持
Sybase
、
Oracle
、
Informix
、
SQL Server
等多種數據庫系統,在應用系統做數據庫遷移時不必維護多個數據庫腳本。
對于采用結構化分析(
SA
),
E
-
R
圖、數據流圖直至最后的數據庫物理圖都是系統設計時不可缺少的一個部分,當數據庫物理圖完成后,應該產生系統的數據字典。運用
PowerDesigner
完全能夠完成這一設計流程。
對于采用面向對象的分析(
OOA
),由于數據庫采用的是
RDBMS
,因此存在對象和關系數據庫之間的映射,也需要進行數據庫設計。
兩種數據庫模型
PowerDesigner
可以設計兩種數據庫模型圖:數據庫邏輯圖(即
E
-
R
圖或概念模型)和數據庫物理圖(物理模型),并且這兩種數據庫圖是互逆的。
數據庫邏輯圖是對現實世界的一種抽象,體現實體之間的關系,可以有
1
對
1
、
1
對多、多對多等關系。特別說一點,在擴充
E
-
R
圖中有概括這種關系,體現類型之間的一種子集聯系,它定義了超類和子類。在
PowerDesigner
設計的
E
-
R
圖中,不具備這種關系,但在
E
-
RWin
設計的模型中支持這種關系,因此在用
E
-
RWin
圖設計的模型轉化為
PowerDesigner
的模型時注意這種關系
。
數據庫物理圖中是邏輯模型的物理實現,體現了表間的參照關系。在物理模型中不可能存在多對多的關系。在邏輯圖向物理圖轉換時,多對多的關系變成兩個
1
對多的關系。
??????
邏輯模型和物理模型有著緊密的聯系,也有本質的區別。邏輯模型的設計遵循數據庫設計理論的第三范式(在一般的數據庫應用達到第三范式即可),邏輯模型要求具有應用系統所表達的所有信息并消除數據冗余。物理模型是在邏輯模型的基礎上,為了優化應用系統的性能而采用增加冗余,創建索引等數據庫技術,它主要用非規范化的一些理論。
??????
在考慮設計的任何非規范化之前,數據庫應先完全規范化,在沒有完全理解數據和用戶需求之前,不能進行非規范化。否則導致數據的組織越來越混亂,應用程序越來越復雜。
??????
因此邏輯模型和物理模型是相互矛盾又緊密聯系的,這點需要設計人員好好把握。
PowerDesigner
設計數據庫物理圖
用
PowerDesigner
設計數據庫物理圖,包括多個對象,如表(
Table
)、字段(
Column
)、域(
Domain
)等。設計時主要在
PowerDesigner
的
Dictionary
和
Database
兩個菜單中。
表(
Table
)
??????
表是數據存儲的一個邏輯對象,包括其它對象如字段(
Column
)、索引(
Index
)、觸發器(
Trigger
)、存儲過程(
Procedure
)等,表的優化設計有分割等技術,對于表的存儲,如果訪問數據量大,訪問頻率高則可考慮將表放在不同的存儲(
Storage
)上。
??????
在設計表時,應該估算表的大小和增長量,便于創建數據庫時分配數據庫空鍵,這樣減少了磁盤碎片的產生。
??????
在關系數據庫中設計主鍵時,采用有意義的主鍵是致命的錯誤。如果用戶決定改變字段的商業含義,則需要在所有使用到該信息的地方進行修改。主鍵的作用應是保持唯一性和作為外鍵使用。任何對主鍵的修改會導致巨大的數據庫維護工作量,顯然這是不合適宜的設計。就關系數據庫而言,設計主鍵策略采用的是代理主鍵的方法。
??????
設計主鍵時應該避免“熱點”現象,但也需要分析具體的應用系統的并發用戶而定。
字段(
Column
)
??????
定義一個字段主要有字段名、字段類型及長度、是否主外鍵、是否空、約束、默認值、域等。
??????
變長和定長的數據類型在數據庫設計中討論比較多,作為一般原則,如果預期某列中的數據范圍變化很大,但變化并不頻繁,那末對這樣的列使用變長數據類型最為適宜。
??????
決定行長時,既不能太浪費,又不能太吝惜??紤]到將來的需要,并且意識到,如果增加行長而沒有改變一頁中容納的行數,那末增加的空間就等于免費使用。
??????
設計時,字段盡量使用域,方便維護字段的類型。每個字段最好將默認值加上,因為在數據庫查詢中,有
NULL
值會影響查詢的性能。
??????
通過
CHECK
約束可限制字段的取值。
域(
Domain
)
簡單地說,是用戶自定義類型,但域還可以定義它的取值范圍或默認值,采用域減少了維護字段類型的工作量,也減少數據的不一致性。
參照(
Reference
)
參照在數據庫設計中是一個比較復雜的問題,
它是實現
數據的完整性主
要要素之一,詳細論述參考后面數據的約束。
在PowerDesigner中,可對參照完整性進行各項設置,參照的基數從0到n,對修改和刪除約束可分別設置為None、Restrict、Cascade、Set Null、Set Default。由于INSERT包含在UPDATE操作中,因此沒有單獨的INSERT約束。
約束的不同設置產生不同的效果,以修改為例(刪除相同):
None:父表修改,子表不影響。
Restrict:父表修改,如果子表存在,則出錯。
Cascade:父表修改,如果子表存在,則相應的修改。
Set Null:父表修改,如果子表存在,則相應置空。
Set Default:父表修改,如果子表存在,則相應置默認值。
索引(
Index
)
??????
索引是優化查詢時采用一種數據庫技術,索引有簇索引、非簇索引、唯一索引等。
??????
設計索引時,要注意索引寬度,盡量減少索引的寬度。索引的寬度不是由字段的多少決定的,而是由字段的長度來決定。對于窄索引關鍵字,在每一索引頁上放置更多的關鍵字和指針,這樣就能花銷更少的
I/O
找到數據。
??????
對于復合索引,選擇首列相當重要,否則可能不能利用該索引,當利用復合索引查詢時。必須確保查詢從首列開始。
??????
索引還有一個填充因子(
FillFactor
),填充因子的大小視表的數據增長量和主鍵定義的情況而定。
觸發器和存儲過程(
Trigger&&Procedure
)
??????
觸發器在維護數據完整性起著重要作用,它比參照更具靈活性,
也能實現三層結構中數據層的業務規則。
??????
存儲過程是采用
SQL
及流程控制語句編寫的完成某種業務的腳本。存儲過程在數據處理上具有處理速度快、處理靈活等優點。
但是,存儲過程極大地增加了與數據庫之間的耦合,在數據庫遷移時,需要重寫存儲過程,從而增加了版本維護的工作量。如果數據庫要求從遷移性考慮,應盡量避免使用存儲過程或者觸發器。
??????
如果不人為修改
PowerDesigner
的觸發器,其遷移性
PowerDesigner
自動解決。
存儲(
Storage
)
不同的數據庫中有不同的概念,
Sybase
稱為設備(
Device
),
SQL Server
稱為文件或文件組(
File
、
FileGroup
)
,
而
Oracle
稱為表空間(
TableSpace
)。
根據系統創建一個或多個存儲,按一定的優化規則存放。
數據庫的劃分
??????
數據庫的劃分以它的物理分布為原則,而不應數據量、表類型等原則來劃分,數據庫的多少對數據庫的性能影響不大。對于訪問數據量大、訪問頻繁的表來說,
I/O
操作很容易形成嚴重的瓶頸,因此減少
I/O
操作和
I/O
操作阻塞是數據庫設計考慮的主要問題,解決方法將將表放在多個設備上,設備需創建在不同的物理驅動器上,最好能用智能型或陣列。
??????
日志和數據分開存儲在不同設備上,如果索引多且占用空間大,也可以采用如此方式。
??????
數據庫數量少的維護成本比數量大少。
??????
因此數據庫劃分以物理分布為原則。
??????
在
PowerDesigner
提供計算數據庫或表的方法(
Compute Database Size
),可幫助設計者完成數據庫的劃分。
數據庫的完整性
??????
數據庫完整性可通過存儲過程、聲明性參照完整性(
DRI
)、
數據類型、約束、規則、默認值,以及觸發器來實現。在數據庫內,這些功能各以特有的方式發揮作用。綜合利用這些完整性功能,可以使數據庫靈活,易于管理,而且很安全。
數據完整性概念分為幾個方面。
◆?
表域完整性
通過主鍵來強制表的域完整性。
◆?
引用完整性
利用參照來加強表之間的邏輯關系。
◆?
數值域完整性
任何輸入的數據在類型和范圍上必須與指定的數據類型相匹配,只有當某列被說明允許
NULL
值,才允許向該列輸入
NULL
。
數據庫的性能測試
??????
生成數據庫之后,應進行數據庫性能測試,以便優化數據庫的設計,因此需要生成測試數據,由于是性能測試,數據的規范性要求不高。通過
PowerDesigner
可方便地生成測試數據(
Generate Test Data
),完成性能測試。
數據的約束
O-O
約束
對父表的
INSERT
、
UPDATE
、
DELETE
操作沒有限制。
M-O
約束
對父表操作的約束:
父表的INSERT操作,對M-O約束,父表中間的記錄可以沒有任何約束地添加到表中,因為這種約束中不一定必須有子女。
??? 父表的鍵值修改操作,只有在子表中其所有的子女對應均做修改后,才能修改,即一般采用級聯更新的方法。
??? 父表的刪除,父親只有在其所有子女均被刪除或重新分配之后該父親才能被刪除。
強制對可選(M-O)約束
O-M
約束
??? 父表操作的約束:
父表的INSERT操作,對O-M約束,一個父親只有當至少當它的一個、子女同時被加入或至少存在一個合法的子女時,才能被加入。
父表的鍵值修改操作,只有當一個子女被創建或已經有一名子女存在才行。
父表的刪除,理論上刪除父親是沒有限制的,實際上,刪除主表記錄時,不采用級聯刪除子表的方案,而采用將子表的外鍵置空。
?????????? 可選對強制(O-M)約束
?
M-M
約束
父表操作的約束:
父表的INSERT操作,可能隨后需要生成子女,即在子表中創建新的行。也可能通過對子表的重新分配來實施完整行限制。
父表的鍵值修改操作,只有在子表對應的外鍵的值修改成新值時才能進行。實際可能是先創建新的父表紀錄,接著修改子表所有對應的紀錄,使其與父表的新紀錄關聯,最后刪除原父表紀錄。
父表的刪除,只有在子表中所有相關的行全部刪除或重新分配之后,才能刪除父表中的紀錄,一般對子表也進行刪除操作。
?????????? 強制對強制(M-M)約束
?
在四類約束:
M
-
M
、
M-O
、
O-M
、
O-O
。鍵值的修改可能會改變表之間的關系,而且可能違反一些約束。違反約束的操作是不允許的。具體的應用必須根據實際的要求和商業規則進行適當的選擇。但在設計和開發時,必須考慮所分析的約束。
物理圖的組織
數據庫物理的組織以功能來組織為好,讓人很容易就明白該功能需要操作哪些表,數據是如何流向的,但是按此組織,可能有些參照建立比較亂,其實有些參照可以不必建立,如在寫入一個表時,其數據的來源就是從另一個查詢得到的,可以保證數據的正確性,從功能劃分來組織物理圖,就可以不建立這個參照。
數據庫的生成
有了數據庫物理圖,在生成數據庫或數據庫腳本時,應注意如下的問題:
參照完整性的實現,可以采用聲明性參照實現或觸發器實現,至于兩種實現的優缺點,前面已經論述過,這里僅說一點,如果采用觸發器實現需要在生成數據庫后再生成觸發器。
當參照含有級聯(Cascade)刪除或修改時,其實現要分情況處理:
Sybase
、
SQL Server
不支持聲明性
級聯(Cascade)刪除或修改,只能通過觸發器(Trigger)來實現。
Oracle、Informix支持
聲明性
級聯(Cascade)刪除,但不支持
級聯(Cascade)修改,也只能通過觸發器(Trigger)來實現。
??? 當定義了用戶自定義類型時,在生成數據庫時,最好轉換成數據庫基本類型,對數據庫性能和遷移都有利。
數據字典
??????
數據字典作為產品的一個歸檔文檔,它定義應用系統數據庫的各個方面。數據庫物理模型建好后,就可以生成數據字典,數據字典的內容和形式可以在
PowerDesigner
定義模板,依據模板生成數據字典,再處理一下文檔格式。
??????
在
PowerDesigner
用
Create Report
生成數據字典。
目前系統需要處理和優化的地方
主鍵的定義:
由于對業務了解的深度不夠,某些表的主鍵建立存在一些問題,隨著業務的深入逐步完善。
??????
參照的建立:
主鍵的定義不完善導致了參照建立的不完善,這也只能以后組不完善。
??????
數據庫的劃分:
??????
數據庫的劃分前面已經談過,由于這個劃分影響著服務器和客戶端的程序,也只能以后的新版中解決。
??????
表結構的調整:
??????
對于有些表,如系統設置表,可以將它的橫向結構改為縱向結構,這樣增加了系統的靈活性