“当时”与“当前”

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

“当时“vs“当前”

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

 

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

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

 

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

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

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

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

 

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

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

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

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

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

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

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

 

posted @ 2022-11-19 23:49  buguge  阅读(113)  评论(0编辑  收藏  举报