考虑到计费系统的特点,要求数据可以追溯,所以删除数据要尽量小心,以免造成在日后查账时出现问题。
  同时,考虑到效率的要求,对数据应该尽可能精简。虽然索引可以提高效率,但是索引设计需要考虑的问题很多(一个表会被太多的SQL使用,而且还有用户的需求变化),不是所有时候都能达到理想状态,有时甚至有负面效应。  根据以上两点,对于第一个问题,可以建立两个表,在线用户表和注销用户表(注销用户表主键可以考虑用自动增加)。用户注销后,从在线用户表中删除,同时在注销用户表中添加一条记录,并将记录标注为“未结帐”,结帐后,再将标志改为“已结帐”。这样既可以保证数据的完整性,又精简了在线用户表的记录数量。
  
  第二个问题,你的方法可以,在你现有思路的基础上,可以设置两个表,未统计记录表和已统计记录表。所有发生的记录首先插入未统计记录表,每日对上一日发生的记录进行统计,统计后,将数据复制到已统计记录表中,而后删除。——这样相当于建立了一个中间表,中间表中的数据很少,统计运算都很快。而已统计记录表则存放历史数据,一般不再使用。但是统计结果需要保存在同一表中。
  这样,中间表几乎总在内存中,统计时,会减少磁盘操作,极大的提高效率。

解决方案 »

  1.   

    to dreamworld:
      第一个问题,把用户移到“注销用户表”,如何使业务表中的数据与之关联?业务表与"在线用户表"应该有外键约束的。
      
      第二个问题,业务数据是要查询的,统计完之后也不能删除。to xsh77830:
      不想这样做是考虑性能问题,与被注销用户关联的业务数据量是很大的,如果在触发器或存储过程中这样做,会是一个相当耗时的操作
      

  2.   

    对于第一个问题,我觉得应该做一个 触发器(trigger),当有相同ID注册的时候,就自动检查状态,然后把状态刷新就可以了吧~~~
      对于第二个问题,我觉得应该这样做,业务表里面增加一个字段--“用户每项业务的统计”,然后分别为每一项业务建立一个业务表,这样不但方便统计,日后用户打印明细帐单的时候也很方便~
      

  3.   

    对于问题2,现在不都是实时计费吗?
    我认为应该另外建表,生成计费数据,实时结果insert 即可。必要的时候
    还要对计费数据进行分区,以提高性能。汇总的数据应该继续建表。
    这样各种数据都有中间结果,也相当于记了日志,一旦发生数据丢失,
    也都能找回来。
      

  4.   


    "  第一个问题,把用户移到“注销用户表”,如何使业务表中的数据与之关联?业务表与"在线用户表"应该有外键约束的。"   数据关连是通过“手机号码”或“身份证号码”或“用户id”(有时还要有时间),只要保证用户表信息和业务表信息中有相同的字段,就可在任何情况下保证数据的关连。即使出现同一手机号码先后备多个人使用,同样可以保证数据关连的准确可靠。
       业务表与用户表用外键约束不如通过TRIGGER保证数据的一致性。   另一个方法:   “在线用户表”可以是我上面说的情况——是当前的“未注销用户”,还可以把“在线用户表”和“注销用户表”合并成一个“用户表”,同时再建立一个“在线用户表”。这样“在线用户表”就是“用户表”的一个子集,他们可通过TRIGGER保证一致性。---------------------------------------
    “第二个问题,业务数据是要查询的,统计完之后也不能删除”   没有删除数据。中间表(未统计记录表)保存的是当天的数据,已统计记录表保存的是所有已经统计的数据。所有业务记录是两个表的和。