交易发生时,应将当时的业务关系记录在交易表;另一种情况,如果要依据当前最新业务关系查看交易数据时,应以两表关联的方式来实现。

“当时“vs“当前”

先举个例子:电商系统,用户下单可以使用卡券支付。此时,订单的金额会有两部分构成:商品金额 和 卡券抵扣金额。通常,这样的信息在订单详情页也会展示出来。那么,我们的订单表里,关于金额,应该有三个字段:商品金额、卡券抵扣金额 和 订单金额。

先举个例子,在ToB的系统中,客户通常会通过销售代表来引入和维系。那么,系统里会有一个保存客户与销售代表之间关系的客户关系表。当客户产生交易后,交易表除了要记录客户信息外,还要记录当时的销售代表。因为在企业实际经营过程中,客户与销售代表的关系会发生变更,例如某某销售代表离职或调岗,其负责的客户会转交给其他销售代表。

交易表记录交易发生时的销售代表,就是我所说的“当时”。交易发生时,一定要把当时的相关业务关系信息记下来,类似的信息,在不同的业务领域里,可能还包括客户服务费率、客户支付方式、发票类型、相关抵扣金额,等等。

相应地,在企业管理系统或报表系统里,会有两种查看或统计销售业绩的需求,第一种是依照当时的客户关系来查看,另一种是依照当前的客户关系来查看。

第一种需求很好实现,因为在交易表里记录了销售代表。

那么,第二种需求怎么实现呢?

第二种需求就是通过交易表客户关系表这两张表进行关联来实现。这似乎也很容易理解。

分布式系统中的“当前”问题

那么,随着业务的不断丰富已经交易量的增多,单体应用会通过功能模块横向切分成数个子系统/子服务。在分布式系统中,当交易表客户关系表分属在交易系统CRM系统时,对于上面的第二种需求,该如何实现呢?

我先列举两个不当的解决方案。

1)在查看某个销售代表的交易数据时,CRM系统根据客户关系得到一批客户id,发送给交易系统,交易系统过滤后返回数据结果。 不足:销售代表的客户量不定,如果比较多,会影响网络传输和程序性能。

2) 在交易系统交易表 里,增加一个字段——最新的销售代表。这样,当CRM系统里有客户关系发生变更时,通知交易系统来变更最新的销售代表。 这样,在查看最新的客户关系查询数据时,仍然是传销售代表id。不足:第一,可能会存在数据的不一致,其次,最要命的,更新交易表本身就是一个耗时的操作。其三,从系统设计上讲,已经完成的交易,不应该再因为业务数据的变化而变化。

比较好的解决方案,可以将CRM系统客户关系表的数据同步到 交易系统里。这样就可以像上面那样的两表关联来实现了。

你也许会担心数据的一致性问题。对于这个担心,可以考虑使用消息队列的方式,保证消息的可靠传输。然后,由交易系统 发起,定期与CRM系统 比对客户关系数据。毕竟,客户关系表是个瘦表,数据量并不大。


当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!–buguge
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/buguge/p/16907571.html


hr.signhr{width:80%;margin:0 auto;border: 0;height: 4px;background-image: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0))}