正如你所说,按你这样的设计,如果大区改变了,则相关数据都要修改。你的数据库是不规范的。
可以考虑这样做:区域表(区域ID(自增字段),区域名,地区ID)
地区表(地区ID(自增字段),地区名,大区ID)
大区表(大区ID,大区名)
台帐 费用ID(自增字段),金额,区域ID多表关联查询是很常见而且很实用的方法,只要表设计得好,性能是可以保证的。

解决方案 »

  1.   

    spring_ok(AFanOfSoccerLottery)的设计比较合理,楼主的设计容易引起删除异常和修改异常。这个问题我觉得要这么考虑:
    1、区域表、地区表、大区表的记录都不是很多。
    2、去掉几个字段对报表实现的印象其实不到,用连接就可以,可能会比原来麻烦些,但是不是困难些。
    3、现在往往不考虑硬盘空间问题,但实际上,冗余浪费了空间。
    4、逐级筛选的界面设计很好,但是表结构改变不会影响这个界面,每次都连接查询就可以。
      

  2.   

    我赞同spring_ok(AFanOfSoccerLottery)的设计比较合理,按理您们的东西不会搞得我想的那么复杂的。
      

  3.   

    同意spring_ok的看法,这样不影响逐级的筛选啊,
    没看明白你们经理的意识。不管前台应用如何做,
    数据库应该有办法满足。
    是否再明确说明你们经理的理由,我帮你说服他。
      

  4.   

    大家能不能提个解决方案呀
    spring_ok(AFanOfSoccerLottery)的设计我也想这么设计,不过不能汇总
    大区的费用
    吉林从东区划到西区 从这个设计上看 以前东区的费用就要计算到西区上了
      

  5.   

    我的帖子怎么变了呀
    区域表(区域ID(自增字段),区域名,地区ID)
    地区表(地区ID(自增字段),地区名,大区ID)
    大区表(大区ID,大区名)
    台帐表 ID(自增字段)费用ID(自增字段),金额,区域ID,地区ID,大区ID
      

  6.   

    区域表(区域ID(自增字段),区域名,地区ID)
    地区表(地区ID(自增字段),地区名,大区ID)
    大区表(大区ID(自增字段),大区名)
    台帐表 费用ID(自增字段),金额,日期时间,区域ID怎么不能汇总??按区域汇总:
    select b.区域名,sum(金额) as 金额
    from 台帐表 a,区域表 b
    where a.区域ID=b.区域ID
    and 日期时间 between '2002-11-1' and '2002-12-1'
    group by b.区域名按地区汇总:
    select c.地区名,sum(金额) as 金额
    from 台帐表 a,区域表 b,地区表 c
    where a.区域ID=b.区域ID
    and b.地区ID=c.地区ID
    and 日期时间 between '2002-11-1' and '2002-12-1'
    group by c.地区名...
      

  7.   

    to Haiwer(海阔天空): 
    大区表  01        北区
            02        南区
    地区表  01       黑龙江        01(属于北区)
    区域表  01   哈尔滨  01 
    台帐表  01   01  5000(金额)   01(代表黑龙江地区)
            上面的这笔费用是北区花费的
    后来黑龙江划到南区
    地区表  01       黑龙江        02(已经属于南区)
    这时产生的台帐
    台帐表  01   01哈尔滨  10000(金额)  01(代表黑龙江地区)
    这样怎么按大区进行汇总呢
    因为进行关联的话会将上两笔费用都算到南区下
    其实第一条费用是北区的
    因为台帐里面没有体现这种关系
             
      

  8.   

    1、我理解如果修改黑龙江到南区,那所有黑龙江的记录都应该归到南区。
    2、我理解区域归属是客观存在的,不应该随意修改,有修改只是修改输入错误。
    3、如果你允许你说的修改,不如如下设计:
    区域表(区域ID(自增字段),区域名)
    地区表(地区ID(自增字段),地区名)
    大区表(大区ID(自增字段),大区名)
    台帐表 费用ID(自增字段),金额,日期时间,区域ID
    因为经过长时间修改,区域、地区、大区之间没有必然的联系,也没法核对区域、地区、大区之间的各种组合是不是正确的,不如不要这些联系。
      

  9.   

    达到第三范式:
    区域表(区域ID(自增字段),区域名,地区ID)
    地区表(地区ID(自增字段),地区名,大区ID)
    大区表(大区ID,大区名)
    台帐 费用ID(自增字段),金额,区域ID
      

  10.   

    哦!不好意思!我看错了!!!
    应该是:
    区域表(ID(自增字段),区域ID,区域名,地区ID)
    地区表(ID(自增字段),地区ID,地区名,大区ID)
    大区表(ID(自增字段),大区ID,大区名)
    ID(自增字段),金额,区域ID,地区ID,大区ID
    ------------------^^^^^^^^^^^^^^^^^^^^全为外键
    你是对的
    因为:你要考虑地区变更且费用不变,冗余是有的,但正确真实第一.
    对与费用表区域关系是黑盒,这样就OK了!
      

  11.   

    脑袋苯,总于看明白你要什么了,这样好不好:
    区域表(ID(自增字段),区域ID,区域名,地区ID,启用日期),主键(区域ID,启用日期)
    地区表(ID(自增字段),地区ID,地区名,大区ID,启用日期),主键(地区ID,启用日期)
    大区表(ID(自增字段),大区ID,大区名,启用日期),主键(大区ID,启用日期)
    台帐(ID(自增字段),金额,区域ID,日期时间),主键(区域ID,日期时间)大区表 1   01        北区   2000-1-1
           2   02        南区   2000-1-1
    地区表 1   01       黑龙江        01(属于北区) 2000-1-1
    区域表 1   01   哈尔滨  01   2000-1-1
    台帐表 1   01   01  5000(金额)   01(代表黑龙江地区) 2001-1-10
    上面的这笔费用是北区花费的
    后来黑龙江划到南区
    大区表 1   01        北区   2000-1-1
           2   02        南区   2000-1-1
    地区表 1   01       黑龙江        01(属于北区) 2000-1-1
           1   01       黑龙江        02(属于南区) 2001-1-1
    区域表 1   01   哈尔滨  01   2000-1-1   --这里区域表不变
    台帐表 1   01   01  5000(金额)   01(代表黑龙江地区) 2001-1-10
    这时产生的台帐
    台帐表 2   02   01  10000(金额)  01(代表黑龙江地区) 2001-2-1这样查询:
    select a.金额,a.日期时间,b.区域名,c.地区名,d.大区名
    from 台帐表 a,区域表 b,地区表 c,大区表 d
    where a.区域ID=b.区域ID
    and b.启用日期=(select max(启用日期) from 区域表 where 区域ID=b.区域ID and 启用日期<a.日期时间)
    and b.地区ID=c.地区ID
    and c.启用日期=(select max(启用日期) from 地区表 where 地区ID=c.地区ID and 启用日期<a.日期时间)
    and c.大区ID=c.大区ID
    and d.启用日期=(select max(启用日期) from 大区表 where 大区ID=d.大区ID and 启用日期<a.日期时间)
    and a.日期时间 between '2000-1-1' and '2002-1-1'可以查出正确的区域信息。这样编程会麻烦很多!自己考虑了。
      

  12.   

    做过一个类似的需分层次的数据库,我的方法是这样:
    大区表(ID(自增字段),大区ID,大区名)
    地区表(ID(自增字段),地区ID,地区名,大区ID)
    区域表(ID(自增字段),区域ID,区域名,地区ID,大区ID)
    台帐可以不变
    ID(自增字段),费用ID,金额,区域ID,地区ID,大区ID
    并且地区表中的大区ID,区域表中的地区ID、大区ID,台帐中的区域ID,地区ID,大区ID都是外键,把级联更新设好
      

  13.   

    1.systab -- (自定义参数表)
       recid -- 代码类别定义
       desc  -- 描述
       ref1  -- 层1
       ref2  -- 层2
       ref3  -- 层3
       ref4  -- 层4
       ref5  -- 层5
       ref6  -- 层62. recid = 'dept'
       表示部门参数定义
       ref1 = 'ACGp001'   --- 部门码
       ref2 = ''
       ....3. recid = 'dept'
       ref1 = 'X000001'
       ref2 = 'ACGp001' 
       表示'X000001'隶属'ACGp001','ACGp001'是'X000001'的上一级
       ... ...4. 当任意ref字段中包含有‘ACGp001’,即表示为该记录标示的部门是ACGp001的隶属