資料表的設計原則

銀河使者發表於2008-05-05
(1)不應針對整個系統進行資料庫設計,而應該根據系統架構中的元件劃分,針對每個元件所處理的業務進行元件單元的資料庫設計;不同元件間所對應的資料庫表之間的關聯應儘可能減少,如果不同元件間的表需要外來鍵關聯也儘量不要建立外來鍵關聯,而只是記錄關聯表的一個主鍵,確保元件對應的表之間的獨立性,為系統或表結構的重構提供可能性。

(2)採用領域模型驅動的方式和自頂向下的思路進行資料庫設計,首先分析系統業務,根據職責定義物件。物件要符合封裝的特性,確保與職責相關的資料項被定義在一個物件之內,這些資料項能夠完整描述該職責,不會出現職責描述缺失。並且一個物件有且只有一項職責,如果一個物件要負責兩個或兩個以上的職責,應進行分拆。

(3)根據建立的領域模型進行資料庫表的對映,此時應參考資料庫設計第二正規化:一個表中的所有非關鍵字屬性都依賴於整個關鍵字。關鍵字可以是一個屬性,也可以是多個屬性的集合,不論那種方式,都應確保關鍵字能夠保證唯一性。在確定關鍵字時,應保證關鍵字不會參與業務且不會出現更新異常,這時,最優解決方案為採用一個自增數值型屬性或一個隨機字串作為表的關鍵字。

(4)由於第一點所述的領域模型驅動的方式設計資料庫表結構,領域模型中的每一個物件只有一項職責,所以物件中的資料項不存在傳遞依賴,所以,這種思路的資料庫表結構設計從一開始即滿足第三正規化:一個表應滿足第二正規化,且屬性間不存在傳遞依賴。

(5)同樣,由於物件職責的單一性以及物件之間的關係反映的是業務邏輯之間的關係,所以在領域模型中的物件存在主物件和從物件之分,從物件是從1-N或N-N的角度進一步主物件的業務邏輯,所以從物件及物件關係對映為的表及表關聯關係不存在刪除和插入異常。

(6)在對映後得出的資料庫表結構中,應再根據第四正規化進行進一步修改,確保不存在多值依賴。這時,應根據反向工程的思路反饋給領域模型。如果表結構中存在多值依賴,則證明領域模型中的物件具有至少兩個以上的職責,應根據第一條進行設計修正。第四正規化:一個表如果滿足BCNF,不應存在多值依賴。

(7)在經過分析後確認所有的表都滿足二、三、四正規化的情況下,表和表之間的關聯儘量採用弱關聯以便於對錶欄位和表結構的調整和重構。並且,我認為資料庫中的表是用來持久化一個物件例項在特定時間及特定條件下的狀態的,只是一個儲存介質,所以,表和表之間也不應用強關聯來表述業務(資料間的一致性),這一職責應由系統的邏輯層來保證,這種方式也確保了系統對於不正確資料(髒資料)的相容性。當然,從整個系統的角度來說我們還是要盡最大努力確保系統不會產生髒資料,單從另一個角度來說,髒資料的產生在一定程度上也是不可避免的,我們也要保證系統對這種情況的容錯性。這是一個折中的方案。

(8)應針對所有表的主鍵和外來鍵建立索引,有針對性的(針對一些大資料量和常用檢索方式)建立組合屬性的索引,提高檢索效率。雖然建立索引會消耗部分系統資源,但比較起在檢索時搜尋整張表中的資料尤其時表中的資料量較大時所帶來的效能影響,以及無索引時的排序操作所帶來的效能影響,這種方式仍然是值得提倡的。

(9)儘量少採用儲存過程,目前已經有很多技術可以替代儲存過程的功能如“物件/關係對映”等,將資料一致性的保證放在資料庫中,無論對於版本控制、開發和部署、以及資料庫的遷移都會帶來很大的影響。但不可否認,儲存過程具有效能上的優勢,所以,當系統可使用的硬體不會得到提升而效能又是非常重要的質量屬性時,可經過平衡考慮選用儲存過程。

(10)當處理表間的關聯約束所付出的代價(常常是使用性上的代價)超過了保證不會出現修改、刪除、更改異常所付出的代價,並且資料冗餘也不是主要的問題時,表設計可以不符合四個正規化。四個正規化確保了不會出現異常,但也可能由此導致過於純潔的設計,使得表結構難於使用,所以在設計時需要進行綜合判斷,但首先確保符合四個正規化,然後再進行精化修正是剛剛進入資料庫設計領域時可以採用的最好辦法。

(11)設計出的表要具有較好的使用性,主要體現在查詢時是否需要關聯多張表且還需使用複雜的SQL技巧。

(12)設計出的表要儘可能減少資料冗餘,確保資料的準確性,有效的控制冗餘有助於提高資料庫的效能。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-261506/,如需轉載,請註明出處,否則將追究法律責任。

相關文章