跪求解决方法,各位大虾。现有需求:大概有200万客户,每个客户需要计算10个指标。我只能想到两种设计方法。一种:一个客户一个指标一条记录,这样就有200*10=2000万条数据。二种:一个客户所有的指标一条记录,这样就只有200w条记录。现在要在这些数据上进行运算,对于前一种又2000w条数据,进行算术运算肯定会很慢,而后一种只有200w条数据计算起来肯定会比第一种快得多,但是第二种方法也会有弊端,就是这个指标有可能会增加,这样的会对于第二种方法就必须增加列,感觉这样不是很好。不知道各位高手有没有啥比较好的解决办法。

解决方案 »

  1.   

    1、按你说的第一种、可以考虑使用,动态表(索引表)方式进行计算指标(要求服务器的CPU够强)
    具体设计思路:第一种办法,物理保存客户纪录,以及每个客户的指标值,分开保存。因为需要计算的客户应该不是全部都计算吧。这样就通过检索条件过滤出需要计算的客户以及指标值,保存到索引表中,(为了加快速度,可以用客户标识,作为索引表下标),然后通过循环索引表纪录,进行计算,这样就避免了频繁IO操作。提供速度。
    2、按第二种,也可以实现,在设计代码的时候,也尽量使用动态语句,并增加获取列个数的常量参数。一旦系统需要增加指标,那么代码中只需修改列个数的指标,以及对应与增加列的相关计算也就可以了;或者干脆预留出列,以备已后增加指标也是解决的办法。第一种方法耦合算法多,维护相对困难,尽管他能满足你的要求。
      

  2.   

    5楼你好,我说的第一种方法是,客户id,资产id,资产。这是一条记录成交量是另外一条记录:客户id,成交量id,成交量
      

  3.   

    资产id,资产
    这样设计不符合数据库设计标准,除非你有特殊考虑
    例如:
    资产id,资产,资产类型,资产性质......
    否则不要这样设计,增加了冗余,而且这样的冗余没有什么意义,只会增加数据库和查询的负担
      

  4.   

    通常计算销售或产品的表范式,尽量设计字段要少些。成交纪录通常是按纪录放置,不是按列放置的。
    客户ID,交易ID,做复合索引。客户ID做单独索引。不具体到业务描述,是没有办法给你提供更适合的设计思想的。只能帮你这么多。哈哈。
      

  5.   

    LZ说的是典型的横表纵表的问题,这个没有固定答案,只能在业务需求和执行效率之间找平衡点。像LZ所说的,这种求资产情况和成交量之类的指标,很可能因为业务需要新增很多字段,这样横表就非常的不适合了,因为维护太麻烦,而且容易出问题,我建议还是建成纵表比较好,2000w数据还不算多的,即使指标再增加一倍也就4000w。
      

  6.   

    假如是指标你已经分析的差不多了(也就是以后不会加更多的指标),还是用第二种。
    第一种相当于所有的属性都放到一张表里,除非是用户自定义数据,才有理由这样做。这种设计属于表设计模式的EAV模式。 
      

  7.   

    顶一下
       oracle QQ群:54775466
               期待您的一起探讨
                          欢迎爱好者入群学习