“当时”与“当前”
交易发生时,应将当时的业务关系记录在交易表;另一种情况,如果要依据当前最新业务关系查看交易数据时,应以两表关联的方式来实现。
“当时“vs“当前”
先举个例子:电商系统,用户下单可以使用卡券支付。此时,订单的金额会有两部分构成:商品金额 和 卡券抵扣金额。通常,这样的信息在订单详情页也会展示出来。那么,我们的订单表里,关于金额,应该有三个字段:商品金额、卡券抵扣金额 和 订单金额。
先举个例子,在ToB的系统中,客户通常会通过销售代表来引入和维系。那么,系统里会有一个保存客户与销售代表之间关系的 客户关系表 。当客户产生交易后, 交易表除了要记录客户信息外,还要记录当时的销售代表。因为在企业实际经营过程中,客户与销售代表的关系会发生变更,例如某某销售代表离职或调岗,其负责的客户会转交给其他销售代表。
交易表记录交易发生时的销售代表,就是我所说的“当时”。交易发生时,一定要把当时的相关业务关系信息记下来,类似的信息,在不同的业务领域里,可能还包括客户服务费率、客户支付方式、发票类型、相关抵扣金额,等等。
相应地,在企业管理系统或报表系统里,会有两种查看或统计销售业绩的需求,第一种是依照当时的客户关系来查看,另一种是依照当前的客户关系来查看。
第一种需求很好实现,因为在 交易表里记录了销售代表。
那么,第二种需求怎么实现呢?
第二种需求就是通过 交易表 与 客户关系表这两张表进行关联来实现。这似乎也很容易理解。
分布式系统中的“当前”问题
那么,随着业务的不断丰富已经交易量的增多,单体应用会通过功能模块横向切分成数个子系统/子服务。在分布式系统中,当 交易表 和 客户关系表分属在 交易系统 和 CRM系统 时,对于上面的第二种需求,该如何实现呢?
我先列举两个不当的解决方案。
1)在查看某个销售代表的交易数据时, CRM系统 根据客户关系得到一批客户id,发送给 交易系统 ,交易系统过滤后返回数据结果。 不足:销售代表的客户量不定,如果比较多,会影响网络传输和程序性能。
2) 在 交易系统 的 交易表 里,增加一个字段——最新的销售代表。这样,当 CRM系统 里有客户关系发生变更时,通知 交易系统 来变更最新的销售代表。 这样,在查看最新的客户关系查询数据时,仍然是传销售代表id。不足:第一,可能会存在数据的不一致,其次,最要命的,更新交易表本身就是一个耗时的操作。其三,从系统设计上讲,已经完成的交易,不应该再因为业务数据的变化而变化。
比较好的解决方案,可以将 CRM系统 的 客户关系表的数据同步到 交易系统 里。这样就可以像上面那样的两表关联来实现了。
你也许会担心数据的一致性问题。对于这个担心,可以考虑使用消息队列的方式,保证消息的可靠传输。然后,由 交易系统 发起,定期与 CRM系统 比对客户关系数据。毕竟, 客户关系表 是个瘦表,数据量并不大。
当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!--buguge
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/buguge/p/16907571.html