现在的位置: 首页 > 综合 > 正文

[经验总结]做了一个数据库的题

2013年02月12日 ⁄ 综合 ⁄ 共 1493字 ⁄ 字号 评论关闭
有三个表
 1. 商品表(商品编号,商品规格,商品条码,商品名称,商品单位)
 2.销售主表(销售单ID,销售日期,销售人员编号,销售人员姓名)
 3.销售明细表(商品编号,销售人员编号,销售数量,销售日期)

问题:
  1.要为每个表建立一个数据模型
  2. 写一个SQL语句,在2008.1.1到2008.3.1,每个销售人员销售每件商品的总数。要求结
果中要包括销售人员姓名,商品名称,销售每件商品的总数

看到题目首先明确概念:
主表中的日期是销售清单产生的日期,明细表中的销售日期是单个商品的销售日期。
一张销售清单中可能有多个商品售出。

很久没写SQL语句了,硬着头皮写了个
  首先建三个表:
      商品表:  product(productid#, spec, barcode, name, unit)
      销售主表: sale(saleid#, date, staffid, staffname)
      销售明细表: detail(productid#,staffid#,num, date)

      select  s.staffname, p.name, sum(d.num)
            from product p, sale s, detail d
            where s.staffid = d.staffid and p.productid = d.productid
            group by d.productid
            having s.date  between   '2008-1-1'   and   '2008-3-1'

热心的水木网友licy也写了一个:
     select p.name, s.staffname, t.productSum
     from product p, sale s,
              (select staffid, productid, sum(num) as productSum
               from detail
               where date between '2008-1-1' and '2008-3-1'
               group by staffid,productid)   t
     where p.productid = t.productid and s.staffid = t.staffid

没考虑左右连接之类的.

认真看过licy写的,我写的错了,错在group by d.productid这行,这里丢了一个d.staffid,不能按销售人员统计商品数量。

再回头看看题目中表设计得挺别扭,原来这里存里两个问题:
       1> 销售主表存在传递依赖, 销售单ID-->销售人员编号-->销售人员姓名,应该拆出一个销售人员表。
       2>销售主表和销售明细表中都存在一个销售日期字段,冗余。

同时,从这个例子中可以看出关系数据库的局限性,如果要保存每个销售单中的内容是很不方便,因为单子里商品数量不是固定的,而每个销售单建个小表也是不现实的,这样的需求用XML数据库就很合适了。

后记:
今天(09/01/08)看了这篇文章 http://blog.csdn.net/liuzuofei/archive/2009/01/07/3727793.aspx

       文章结尾处的有这样的观点:

            但是第三范式的弊端在于关联性太多,如是在对于查询时,会造成瓶颈。由此回到前面所说的“第三范式首先应该被抛弃”....

       话虽这么说,销售主表不符合第三范式可能带来的问题就是,无法对销售人员数据进行添加和删除,而且销售人员姓名数据冗余。

   

抱歉!评论已关闭.