浅谈数据库设计技巧(下).txt[2]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 comiunknown 的 blog

……

  为了实现按批查询借阅记录,我们可以再建一个表来保存批量借阅的信息,例如:

批量借阅表(batch_rent)
名称   类型   约束条件   说明
batch_id       int                 无重复            批量借阅标识,主键
batch_no      int                 不允许为空    批量借阅编号,同一批借阅的batch_no相同
rent_id          int                不允许为空    借阅记录标识,和rent_log.rent_id关联
batch_date   datetime        不允许为空    批量借阅时间

  这样的设计好吗?我们来看看为了列出某个用户某次借阅的所有书籍,需要如何查询?首先检索批量借阅表(batch_rent),把符合条件的的所有记录的rent_id字段的数据保存起来,再用这些数据作为查询条件带入到借阅记录表(rent_log)中去查询。那么,有没有什么办法改进呢?下面给出一种简洁的批量设计方案,不需添加新表,只需修改一下借阅记录表(rent_log)即可。修改后的记录表(rent_log)如下:

借阅记录表(rent_log)
名称   类型   约束条件   说明
rent_id          int                无重复               借阅记录标识,主键
r_id              int                不允许为空        用户标识,和renter_table.renter_id关联
b_id             int                不允许为空        书籍标识,和book_table.book_id关联
batch_no      int                不允许为空        批量借阅编号,同一批借阅的batch_no相同
rent_date     datetime       不允许为空         借阅时间
……

  其中,同一次借阅的batch_no和该批第一条入库的rent_id相同。举例:假设当前最大rent_id是64,接着某用户一次借阅了3本书,则批量插入的3条借阅记录的batch_no都是65。之后另外一个用户租了一套碟,再插入出租记录的rent_id是68。采用这种设计,查询批量借阅的信息时,只需使用一条标准t_sql的嵌套查询即可。当然,这种设计不符合3nf,但是和上面标准的3nf设计比起来,哪一种更好呢?答案就不用我说了吧。


  五、冗余数据的取舍
  上篇的“树型关系的数据表”中保留了一个冗余字段,这里的例子更进一步——添加了一个冗余表。先看看例子:我原先所在的公司为了解决员工的工作餐,和附近的一家小餐馆联系,每天吃饭记账,费用按人数平摊,月底由公司现金结算,每个人每个月的工作餐费从工资中扣除。当然,每天吃饭的人员和人数都不是固定的,而且,由于每顿工作餐的所点的菜色不同,每顿的花费也不相同。例如,星期一中餐5人花费40元,晚餐2人花费20,星期二中餐6人花费36元,晚餐3人花费18元。为了方便计算每个人每个月的工作餐费,我写了一个简陋的就餐记账管理程序,数据库里有3个表:

员工表(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             无重复              就餐计费细表标识,主键

本文关键:浅谈数据库设计技巧(下).txt
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top