碼農們來一起討論下數據庫設計....


上次我們對項目的分層架構設計進行了熱烈的討論 

.Net項目分層與文件夾結構大全(最佳架子獎,吐槽獎,陰溝翻船獎揭曉)

弦哥杯.Net搭架子大賽總結

但是 對於信息管理系統(MIS)來說,其實質是數據庫管理系統。架子搭的再漂亮,數據庫設計不過關,會在項目中付出慘重的代價。

還是之前的玩法,我先來拋磚引玉,然后大伙也把自己關於數據庫設計的一些原則,技巧,方法,思路分享出來:


 

傳說中的弦哥(注:我的也不一定正確,歡迎指正

1.數據庫模型的設計工具工具基本就是用PowerDesigner。PowerDesigner有兩個作用:數據庫設計的文檔;生成數據庫

 


 

2.如果項目的功能比較多的話,建議用“包”去組織,並和你的代碼命名空間對應一致。而不要一股腦的把所有表放在一個視圖中,如下圖所示:

 


 

3.給你的PowerDesigner設計,設置上你喜歡的顏色和字體,默認的實在太難看,如下圖所示:


 

4.Name用中文這樣方便看,Code用英文,作為生成到物理數據庫中的字段名。對於數據庫表名和字段名用中文我持保留意見 如下圖:


 

5.主鍵的話 我基本都是用GUID或UUID這些全局唯一的字符串,不喜歡用自增列,雖然相比Int自增列有一定效率損耗,但好處多多啊~

好處:1.全局唯一,在做數據遷移的時候不會出現主鍵重復,在做一些業務的時候也有意想不到的好處

    2.數據產生前就能知道ID的值


 

6.對於很多表設計一致的地方,盡量保持一些一致的約定,比如:

我的每個表都有2個固定的字段分別作為歸檔用的CreateTime和並發控制的Version:

我用的Nhibernate做為ORM,那么我的C#代碼里有個抽象類,抽象類里面也有這2個屬性:

 

再比如,系統中一般都會有很多樹形結構,那么我在數據庫設計中,所有樹形結構的表都具有一些相同的字段和命名:

同樣對應c#也有個樹形結構的抽象類以及樹形抽象類的NHB MAPPING類:

樹形抽象類:

Mapping類:

 

7.對於外鍵約束,級聯更新,非空等,觸發器等,一般我不在數據庫中做這些事情,我總覺得這應該內聚在業務邏輯中,所以我都是在c#中的業務邏輯層實現的


8.對於字段冗余的態度:從數據庫設計三大范式角度是盡量不要有冗余字段的,但從數據倉儲的角度,合理的冗余是有利於查詢的。但往往我們的系統並沒有嚴格把業務系統和數據倉儲分開,所以適當的冗余是可以的,但不要過度,過度的冗余常常會導致同樣的數據存儲在不同的地方過多,容易造成數據不一致,比如復雜的財務系統,不容易寫單元測試,容易對不上帳。實際上我現在的做法是基本對冗余零容忍,復雜查詢的話通過物化視圖或數據倉儲去查。


9.二進制大文件:我還是喜歡把如word,照片之類的存儲在數據庫中,總覺得管理文件夾太麻煩。但應注意,應該單獨用一個表去存,並且如果比較大的話,建議划分獨立的表空間到獨立的存儲設備,這樣我覺得就比較完美啦~:


10.往往系統中都有不少下拉選項,我們叫數據字典,建議用2個表去表示系統中所有的字典,而不要一個字典一個表:

很多這種下拉的有木有:

兩個表去實現有木有:

統一維護,並做全局應用程序緩存,效率很高有木有:


10.最后來個權限的表設計:


把你的有關數據庫設計的看法,方法,思路或者把你的權限部分的數據庫設計發到回復里,我會整理到帖子中~~~~

把你的有關數據庫設計的看法,方法,思路或者把你的權限部分的數據庫設計發到回復里,我會整理到帖子中~~~~

把你的有關數據庫設計的看法,方法,思路或者把你的權限部分的數據庫設計發到回復里,我會整理到帖子中~~~~

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM