手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Mssql>列表

浅谈数据库设计技巧(下)

来源:互联网 作者:west263.com 时间:2008-04-02
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!


员工表(Clerk_table)
名称     类型    约束条件   说明
clerk_id     int    无重复  员工标识,主键
clerk_name  char(10)   不允许为空 员工姓名

每餐总表(Eatdata1)
名称     类型    约束条件   说明
totle_id    int    无重复  每餐总表标识,主键
persons   char(100)  不允许为空   就餐员工的员工标识集合
eat_date  datetime    不允许为空  就餐日期
eat_type  char(1)     不允许为空   就餐类型,用来区分中、晚餐
totle_price  money    不允许为空  每餐总花费
persons_num   int    不允许为空  就餐人数

就餐计费细表(Eatdata2)
名称     类型    约束条件   说明
id      int   无重复   就餐计费细表标识,主键
t_id       int  不允许为空  每餐总表标识,和Eatdata1.totle_id关联
c_id       int  不允许为空   员工标识标识,和Clerk_table.clerk_id关联
price    money  不允许为空  每人每餐花费

  其中,就餐计费细表(Eatdata2)的记录就是把每餐总表(Eatdata1)的一条记录按就餐员工平摊拆开,是个不折不扣的冗余表。当然,也能够把每餐总表(Eatdata1)的部分字段合并到就餐计费细表(Eatdata2)中,这样每餐总表(Eatdata1)就成了冗余表,但是这样所设计出来的就餐计费细表重复数据更多,相比来说还是上面的方案好些。但是,就是就餐计费细表(Eatdata2)这个冗余表,在做每月每人餐费统计的时候,大大简化了编程的复杂度,只用类似这么一条查询语句即可统计出每人每月的寄餐次数和餐费总帐:

SELECT clerk_name AS personname,COUNT(c_id) as eattimes,SUM(price) AS ptprice FROM Eatdata2 JOIN Clerk_tabsle ON (c_id=clerk_id) JOIN eatdata1 ON (totleid=tid) WHERE eat_date>=CONVERT(datetime,'"&the_date&"') AND eat_date<DATEADD(month,1,CONVERT(datetime,'"&the_date&"')) GROUP BY c_id

  想象一下,假如不用这个冗余表,每次统计每人每月的餐费总帐时会多麻烦,程式效率也够呛。那么,到底什么时候能够增加一定的冗余数据呢?我认为有2个原则:

  1、用户的整体需求。当用户更多的关注于,对数据库的规范记录按一定的算法进行处理后,再列出的数据。假如该算法能够直接利用后台数据库系统的内嵌函数来完成,此时能够适当的增加冗余字段,甚至冗余表来保存这些经过算法处理后的数据。要知道,对于大批量数据的查询,修改或删除,后台数据库系统的效率远远高于我们自己编写的代码。

  2、简化研发的复杂度。现代软件研发,实现同样的功能,方法有很多。尽管不必需要程式员精通绝大部分的研发工具和平台,但是还是需要了解哪种方法搭配哪种研发工具的程式更简洁,效率更高一些。冗余数据的本质就是用空间换时间,尤其是现在硬件的发展远远高于软件,所以适当的冗余是能够接受的。但是我还是在最后再强调一下:不要过多的依赖平台和研发工具的特性来简化研发,这个度要是没把握好的话,后期维护升级会栽大跟头的。


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!