1. 程式人生 > >資料庫設計的重要性和設計原則

資料庫設計的重要性和設計原則

說起資料庫設計,相信大家都明白怎麼回事,但說起資料庫設計的重要性,我想大家也只是停留在概念上而已,到底如何重要?怎麼重要呢?今天就將我至今為止的理解向大家闡述下。

一個不良的資料庫設計,必然會造成很多問題,輕則增減欄位,重則系統無法執行。我先來說說資料庫設計不合理的表現吧:

1. 與需求不符

因為這個原因造成的改動量往往是最大。如果進入編碼階段的話,很可能會直接讓你崩潰掉。

2. 效能低下

含有大資料量的表之間的關聯過多;沒有合理的欄位設計來用於查詢而造成的SQL查詢語句很複雜;對於大資料量的表沒有采用有效的手段去處理;濫用檢視等。

3. 資料完整性喪失

含有主外來鍵關係的表之間關聯欄位的設計方式不合理,造成更新與刪除操作後程序容易出錯或不完善;使用了已經刪除或丟失掉的資料。

4. 可擴充套件性性太差

表設計的與業務繫結的太緊密、單一,造成表的可拓展性、可修改性太差,無法新需求的要求。

5. 非必要資料冗餘量太大

沒用的垃圾資料儲存過多,不僅佔用資源,還影響查詢效率。

6. 不利於計算或統計

缺少必要的聯絡性或統計性欄位或用於計算統計的欄位分散於多個表中,造成計算統計的步驟繁瑣,甚至無法計算統計。

7. 沒有詳盡的資料記錄資訊

缺少必要的欄位,造成無法跟蹤資料變化、使用者操作,也無法進行資料分析。

8. 表之間的耦合性太大

多張表之間關聯的過於緊密,造成一張表發生變化而影響到其他表。

9. 欄位設計考慮不周

欄位長度過短或欄位型別過於明確,造成可發揮、可拓展的空間太小。

大多數的程式設計師對於軟體開發的出發點認識不是很明確,總是認為實現功能才是重要的,在簡單瞭解完基本需求後就急忙進入編碼階段,對於資料庫設計思考的比較少、比較簡單,大多設計都只停留在表面上,這往往是要命的,會為系統留下很多隱患。要麼是寫程式碼開發過程中才發現問題,要麼就是系統上線運轉後沒多久就出現問題,還有可能給後期維護增加了很多工作量。如果到了那個時候再想修改資料庫設計或進行優化等同於推翻重來。

資料庫是整個軟體應用的根基,是軟體設計的起點,它起著決定性的質變作用,因此我們必須對資料庫設計高度重視起來,培養設計良好資料庫的習慣,是一個優秀的軟體設計師所必須具備的基本素質條件!

那麼我們要做到什麼程度才是對的呢?下面就說說資料庫設計的原則

1.  資料庫設計最起碼要佔用整個專案開發的40%以上的時間

資料庫是需求的直觀反應和表現,因此設計時必須要切實符合使用者的需求,要多次與使用者溝通交流來細化需求,將需求中的要求和每一次的變化都要一一體現在資料庫的設計當中。如果需求不明確,就要分析不確定的因素,設計表時就要事先預留出可變通的欄位,正所謂“有備無患”。

2.  資料庫設計不僅僅停留於頁面demo的表面

頁面內容所需要的欄位,在資料庫設計中只是一部分,還有系統運轉、模組互動、中轉資料、表之間的聯絡等等所需要的欄位,因此資料庫設計絕對不是簡單的基本資料儲存,還有邏輯資料儲存。

3.  資料庫設計完成後,專案80%的設計開發在你腦海中就已經完成了

每個欄位的設計都是有他必要的意義的,你在設計每一個欄位的同時,就應該已經想清楚程式中如何去運用這些欄位,多張表的聯絡在程式中是如何體現的。換句話說,你完成資料庫設計後,程式中所有的實現思路和實現方式在你的腦海中就已經考慮過了。如果達不到這種程度,那當進入編碼階段後,才發現要運用的技術或實現的方式資料庫無法支援,這時再改動資料庫就會很麻煩,會造成一系列不可預測的問題。

4.  資料庫設計時就要考慮到效率和優化問題

一開始就要分析哪些表會儲存較多的資料量,對於資料量較大的表的設計往往是粗粒度的,也會冗餘一些必要的欄位,已達到儘量用最少的表、最弱的表關係去儲存海量的資料。並且在設計表時,一般都會對主鍵建立聚集索引,含有大資料量的表更是要建立索引以提供查詢效能。對於含有計算、資料互動、統計這類需求時,還要考慮是否有必要採用儲存過程。

5.  新增必要的(冗餘)欄位

像“建立時間”、“修改時間”、“備註”、“操作使用者IP”和一些用於其他需求(如統計)的欄位等,在每張表中必須都要有,不是說只有系統中用到的資料才會存到資料庫中,一些冗餘欄位是為了便於日後維護、分析、拓展而新增的,這點是非常重要的,比如黑客攻擊,篡改了資料,我們便就可以根據修改時間和操作使用者IP來查詢定位。

6.  設計合理的表關聯

若多張表之間的關係複雜,建議採用第三張對映表來關聯維護兩張表之間的關係,以降低表之間的直接耦合度。若多張表涉及到大資料量的問題,表結構儘量簡單,關聯也要儘可能避免。

7.  設計表時不加主外來鍵等約束性關聯,系統編碼階段完成後再新增約束性關聯

這樣做的目的是有利於團隊並行開發,減少編碼時所遇到的問題,表之間的關係靠程式來控制。編碼完成後再加關聯並進行測試。不過也有一些公司的做法是乾脆就不加表關聯。

8.  選擇合適的主鍵生成策略

主鍵生成策略大致可分:int自增長型別(identity、sequence)、手動增長型別(建立單獨一張表來維護)、手動維護型別(如userId)、字串型別(uuid、guid)。int型的優點是使用簡單、效率高,但多表之間資料合併時就很容易出現問題,手動增長型別和字串型別能很好解決多表資料合併的問題,但同樣也都有缺點:前者的缺點是增加了一次資料庫訪問來獲取主鍵,並且又多維護一張主鍵表,增加了複雜度;而後者是非常佔用儲存空間,且表關聯查詢的效率低下,索引的效率也不高,跟int型別正好相反。

終上所述,我們可見資料庫設計在整個軟體開發的起到的舉足輕重的作用,尤其是我說的設計原則的第一點,資料庫與需求是相輔相成的,我經常把軟體開發比作汽車製造。汽車製造會經過圖紙設計,模型製作,樣車製造,小批量試生產,最後是批量生產等步驟。整個過程環環相扣,後一過程是建立在前一過程正確的前提基礎之上的。如果在圖紙設計階段發現了一個紕漏,我們可以重新進行圖紙設計,如果到了樣車製造階段發現這個錯誤,那麼我們就要把從圖紙設計到樣車製造的階段重來,越到後面發現設計上的問題,所付出的代價越大,修改的難度也越大。

資料庫設計難度其實要比單純的技術實現的難很多,他充分體現了一個人的全域性設計能力和掌控能力,所以在今後的專案中大家一定要著重培養這方面的能力,這裡我將我的經驗分享給了大家,希望能對大家有所幫助。