需求:
合同,合同会包含多个项目,每个项目可能会多次进账,每个项目都有不同的成本。
销售员工会查询合同,查看合同内容;财务需要对合同项目进账情况登记、查询、管理、月末统计提成;售后需要根据合同里各项目到账的情况安排项目后续事宜;每天会统计各销售部门到账情况,包括合同数、利润、部门总业绩、个人总业绩等;总监要看整个进账各项情况;等等。现在我创建了一个合同表、项目表、财务表,这些表的关系没太想好,目前是合同包含多项项目,每个项目包含多笔入账。这样是否好,每次查看合同,就要统计项目,就要统计财务,才能知道合同相关款是否完成,这样开销好像有些大,请给一些建议,谢谢

解决方案 »

  1.   

    其实就是上面的 合同、项目、财务表都是主表,然后创建具体的业务表,就是合同id,项目id,财务id这样。但是你如果要获取比较完整的信息,就得多次join,所以开销确实会比较大。这个时候,可以用反规范化,也就是说,你可以直接在业务表里存储一些 主要的字段,比如原来是合同id,现在加上合同名称,合同负责人,项目名称,项目负责人,财务名称等等,这样就可以减少关联
      

  2.   


    我觉得除了表设计这样基础的问题以外,你有没有考虑高层次一些的问题。
    你昨天说是做CRM是吧,这些业务都是应该CRM完成的吗?换句话说,如果系统小,那么考虑是否应该涵盖这些需求,需求永远是做不完的;如果系统够大,是否考虑做成多个多个子系统,之间是松耦合和接口,也方便以后系统扩展或者与其他真正的ERP或者财务、人事系统集成。
    可以参考一下成熟系统的解决方法。其实这些在Oracle EBS和SAP R/3之类的系统已经多少年前就解决了十多个行业了。非常成熟,也就是踩了无数雷以后的结晶。我建议CRM,只搞CRM自己的东西,剩下的留成接口。接口是什么?就是对于另外一个模块交互的抽象。在数据库上说,不是另外整个模块的ER都搬过来,而是精简化、平坦化,也就是某种反范式的概括了。昨天也是你问的吧,是不是应该考虑买个咨询服务啊,哈哈哈。
      

  3.   


    我觉得除了表设计这样基础的问题以外,你有没有考虑高层次一些的问题。
    你昨天说是做CRM是吧,这些业务都是应该CRM完成的吗?换句话说,如果系统小,那么考虑是否应该涵盖这些需求,需求永远是做不完的;如果系统够大,是否考虑做成多个多个子系统,之间是松耦合和接口,也方便以后系统扩展或者与其他真正的ERP或者财务、人事系统集成。
    可以参考一下成熟系统的解决方法。其实这些在Oracle EBS和SAP R/3之类的系统已经多少年前就解决了十多个行业了。非常成熟,也就是踩了无数雷以后的结晶。我建议CRM,只搞CRM自己的东西,剩下的留成接口。接口是什么?就是对于另外一个模块交互的抽象。在数据库上说,不是另外整个模块的ER都搬过来,而是精简化、平坦化,也就是某种反范式的概括了。昨天也是你问的吧,是不是应该考虑买个咨询服务啊,哈哈哈。确实现在需求越来越多,本来是某一个功能,但是讨论后就是一大块,所以这么都是不好,没经验真可怕
      

  4.   

    我觉得除了表设计这样基础的问题以外,你有没有考虑高层次一些的问题。
    你昨天说是做CRM是吧,这些业务都是应该CRM完成的吗?换句话说,如果系统小,那么考虑是否应该涵盖这些需求,需求永远是做不完的;如果系统够大,是否考虑做成多个多个子系统,之间是松耦合和接口,也方便以后系统扩展或者与其他真正的ERP或者财务、人事系统集成。
    可以参考一下成熟系统的解决方法。其实这些在Oracle EBS和SAP R/3之类的系统已经多少年前就解决了十多个行业了。非常成熟,也就是踩了无数雷以后的结晶。我建议CRM,只搞CRM自己的东西,剩下的留成接口。接口是什么?就是对于另外一个模块交互的抽象。在数据库上说,不是另外整个模块的ER都搬过来,而是精简化、平坦化,也就是某种反范式的概括了。昨天也是你问的吧,是不是应该考虑买个咨询服务啊,哈哈哈。确实现在需求越来越多,本来是某一个功能,但是讨论后就是一大块,所以这么都是不好,没经验真可怕
    这个也不是说没有经验的问题,因为人嘛,都是从没有经验过来的,关键还在于你想问题的方式。如果这个软件你来设计,我觉得适当的多想点,比如 现在是crm,如果以后有其他系统怎么集成,一般来说都是做成单独的系统,
    这种模块化设计的思路是很好的,想想我们用的电脑,有一大堆的零部件,那个坏了,换掉就行,比如,内存坏了,把内存换了就行,相互之间不会有影响。我们公司也是做crm的,实际上也就是实现crm的一部分功能,crm是非常复杂的系统,从前端的销售,到后端的客服呼叫中心,都可以包含在里面。所以一开始的设计很重要,总体的设计,以及细小到表的设计,上面说的 有到了,采用反规范化的设计很重要,就是表和表之间有外键是正常的设计,但是表一多,一个简单的查询就得10个表关联,效率太差,所以针对不同的数据,你可以采用烦规范化的设计思路,也就是说不用外键,而是直接在业务表里添加主数据的字段,比如:客户拜访表:
    业务员id,客户id,拜访时间,此外加上客户的一些详细信息:客户渠道、客户类型等等,这样就不需要join关联一堆表,速度快多了,当然前提是,这些客户的渠道之类的很少会变化。