数据库设计,大家都知道有几个范式,在此我不想多说。只是想说一下的我的经验:
1. 一个数据库基本上有这几部分表组成:
a. 用户及权限表:包括一些用户表,用户组表及各类权限表。
这部分相对来讲比较格式化,没啥可讲。
b. 配置表:我们将各类配置做成不同的表,配置的属性做成表的字段。但实际应用中,配置经常会更改,这就需要经常要改数据库结构,这很麻烦。
为了解决这个问题, 我将这些配置表做成“假表”(设计数据库是把它作为正常的表,这样方便产生代,但这些表不用发布)。我们再专门设计两张“真表”(正常发布的表)来存配置数据。
修改假表的CRUD操作,存的时候把“假表”对象(由假表自动产生的对象)的字段/值对作为数据一条一条存到“真表”里面,取得时候把“真表”的数据取出来恢复成“假表”返回。用户用的时候就象用真表一样。
c. 业务数据表,就象企业的产品表等。
d. 历史数据表:这类表一般和时间有关,随着时间的变化而大量增加。这些表不能和业务数据表由外键关联,因为业务数据表改动不能变更历史数据。
e. 数据的更改删除记录表,用于恢复误操作的数据。
2. 一个数据表字段的组成,一个数据表都应包含以下标准字段:
a. PK (一般用GUID,这样很方便);
b. RowVersion;
c. CreatedBy;
d. CreatedOn;
e. ModifiedBy;
f. ModifiedOn;
3. 为了方便查询,相同类别的表加相同的前缀,
如:UsrAccount, UsrGroup...;
ACTimecode,ACInterval,ACCardHolder...;
4. 一些用户不能修改的少量配置数据,不应存到数据库里面,而应该作为也系统常量存到文件里面。这些数据和数据库的关联用ID(int)来实现。
5. 其他有博友来拍砖了!呵呵
先说一下我的项目组成:
DataService:
1. DataTable和Entity一一对应,现根据数据库自动生成Entity以及数据验证;
2. 根据数据库自动产生CRUD.dll,就是简单的CRUD,不包括事务等,但包括根据索引产生的GetByXXX;
3. 自动产生DataServiceBase.dll,这里面包括了事务、数据库日志以及虚拟的数据过滤、存取权限控制等;
4. 创建DataService.dll,继承DataServiceBase.dll,实现数据过滤,存取权限等,在这面可以根据业务需要;
自己写代码实现GetByxxx。但在这里面一般只处理数据存取,不处理复杂的业务逻辑;
5. 自动产生BasicService.dll,封装DataService,附加上数据压缩、加密、数据分页等功能。
BizService:
1. 根据业务需要自己写业务服务,注意服务的粒度要合适;
2. 业务服务尽量功能单一,切勿弄成一个大垃圾桶,啥都塞进去;
3. 不同服务之间可以互相调用。
这是系统最大的业务服务所在地。服务的粒度对以后的维护很重要!
FacadeService:
1.封装BizService,简化客户端的调用;
2. 在这面也可以根据需要加上权限等。
UI:
使用BasicService和FacadeService即可。
包装服务可以Remoting、WCF等。我用的是Remoting,感觉很方便。
系统最花费气力是BizServce和UI这两部分。不知各位博友有啥感受?
一直看别人的博客,觉得太自私了,呵呵!
我想把自己的所谓经验和朋友们分享。以后有空的话,就开始写。
今天就权当开始了。。。

