码农们来一起讨论下数据库设计....

上次我们对项目的分层架构设计进行了热烈的讨论 

.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.最后来个权限的表设计:


把你的有关数据库设计的看法,方法,思路或者把你的权限部分的数据库设计发到回复里,我会整理到帖子中~~~~

把你的有关数据库设计的看法,方法,思路或者把你的权限部分的数据库设计发到回复里,我会整理到帖子中~~~~

把你的有关数据库设计的看法,方法,思路或者把你的权限部分的数据库设计发到回复里,我会整理到帖子中~~~~

 

 

posted on 2012-07-05 15:11  传说中的弦哥  阅读(11870)  评论(135编辑  收藏  举报

导航