您现在的位置:首页 > 学术研究 > 读书笔记 > 浅谈数据库设计技巧(转)
浅谈数据库设计技巧(转)
[发布时间:2006-03-13  阅读次数: 9084]
员工表(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_dateDATEADD(MONTH,1,CONVERT(DATETIME,&THE_DATE&)) GROUP BY c_id

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

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

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

首页上一页下一页尾页当前为5/5页