DB设计的常见问题

转载:http://www.blogjava.net/relax/archive/2010/10/22/335905.html

第一次做数据库设计的开发人员,难免会碰到一些问题,根据自己的经验简单的总结一下这些问题,在没有更好的解决方法前的一种可能的备选方案。

一、 从技术上对表进行分组
我们在做业务数据库设计的时候,个人认为首先要从技术上对表进行分组,下面是个人的标准:
1、 流程和交易相关的表:它的特点是记录数保持最小,以便快速响应交易需求,并且相关交易主题对象的生命周期比较短;比如纳税申报表。或者可以称为操作数据库。
2、归档后的查询表:它的特点就是记录数很大,有足够多的索引,关键保持查询速度;它的特点就是查的多,改的少;比如车辆档案表。或者可以称为查询数据库。
3、 提供给分析使用的汇总表:它的特点就是表中存储了很多计算后的数据并且是冗余数据。如果使用BI,这一部分就不用了;如果自己设计为了出报表方便还是需要的;比如纳税情况归集表。或者可以称为查询分析表
4、支持类的表:这一类是对业务的支持,包括代码表、配置表、规则表等。
特别是1和2在设计时最好分别进行处理,不要将交易数据和查询数据混在一块;如果后续要分别部署交易服务器和查询服务器就麻烦了。
二、主键策略
个人建议在客户没有要求的情况下全部使用替代健而不是自然键,自然键是指业务本身的唯一区别,比如员工工号等。而替代健建议使用GUID,这样在有离线业务处理时也能应付。
1、替代健中的冗余问题
在使用替代健后,有一个问题就是需要频繁的查找自然健,个人建议增加冗余字段将自然健也加入关联表中。
2、代码管理策略
在客户没有特别要求的情况下,使用整数来表达代码。并确定代码表的建表策略,是建一个表统一管理还是分别建表管理?个人建议使用一个表管就行了。具体表设计后续可以和大家分享。
3、 字符串字典管理策略
我们经常碰到一个问题,内部一些状态和它的名称的管理;比如审批流程中的审核、批准等等,建议使用字符串字典表统一管理。具体表设计后续可以和大家分享。
4、 大字段管理策略
当碰到大字段时,建议尽量集中管理,并建在一个表空间(Oracle)或文件组(Sqlserver)上。后续和大家分享一下关于附件管理的表设计。
5、使用视图
个人很少使用视图,原因就是Powerdesign对视图设计支持不好,但是有几个方面给大家建议,所有的Select查询最好从视图检索,视图中将相应需要的中文信息统一带出来(比如:代码相对的名称或一个流程的状态名称等);这样统一处理前台需要的显示问题;在业务层构建对象模型时增加状态名称的属性以保持它;这样做的另一个好处就是减少和物理表的耦合性,毕竟一般系统中查询远比修改要多。
三、 使用标量函数
我们有时有这样的需求,要查今天的收入,要查最近7天的收入;这时我们可以使用标量函数来完成这个工作,并能保证时间以数据库服务器一致;当然还有很多其他用途,大家去发现。
下面是一个标量函数的声明来去给定日期当月的第一天:
Create function [dbo].[fn_BeginOfMonth](
@DayUTC         datetime
)
returns datetime
1、使用模版表
用户需要做相似又有微小差别的录入或配置,可以使用模版表来增强用户体验。
2、 和业务相关的表都包含下列字段
CreatedBy 创建人
CreatedOn 创建时间
ModifiedBy 最后修改人
ModifiedOn 最后修改时间
VersionNumber版本号
特别是VersionNumber作为开放式锁的必要字段;在修改记录时可以通过它来判断用户提交数据时,是否其他人做过改动,以便后续处理。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值