单据的设计
大约 3 分钟
单据的设计
本文主要是初步记录一下关于单据零散的想法,看看是否可以形成一套可行的方法论。
单据实体
单据这个实体,其实从抽象的层面来说,它其实描述了一次行为:
谁,在什么时间点,用了什么样的成本,对什么目标产生了一次什么样的行为
如果让我们来对上面这句话进行解析,其实可以发现它可以拆分为下面几块:
- 谁
- 时间信息
- 成本
- 行为描述
- 行为目标
下面我们来一次分析这个问题。
谁
一般订单的发起者其实都是【用户】,当然这个用户并不一定是C端用户。而用户的信息如何描述呢?一般的公司都会有【用户中心】,或者【供应商管理系统】等等的来描述【用户】的信息。做的好的公司也会有【用户画像】
时间信息
时间信息一般分为2类:
- 行为动作的产生时间
- 比如用户的下单时间
- 行为动作所带来的影响发生的时间
- 用户购买的商品的出库时间
- 用户购买的商品的送货时间
- 用户购买的商品的预计收货时间 前者是用户主动产生的,后者其实对用户来说是被动的。
成本信息
用户在下订单的时候往往都会消耗一定的成本,这个成本并不一定是金钱。可能是:
- 金钱
- 积分
- 优惠券
- ...
##行为描述
行为描述主要是用来解释行为,比如:
- 购买行为
- 退货行为
不同的行为会有不同的属性信息,比如购买行为会有购买的数量,购买服务的持续时间等。
行为目标
行为的目标可以是物理实体,比如商品(一瓶可乐),也可以是虚拟实体,比如一次服务。
- 商品
- 服务
- 流量
- ...
而具体的目标也会有一大套自己的模型和属性。比如商品的sku就是一套很经典的模型。
单据本身的信息
单据本身也需要一些自己的属性信息:
- 单号
- 单据类型
- 状态机
关于单据号的设计可以很有讲究,一般会有如下的考虑:
- 单据号的形式,长度
- 是否有业务含义
- 无
- 有
- 业务含义的具体信息
- 业务含义占单据号的长度
- 是否连续(可遍历)
- 单据创建时间
- 单据生成的serverIP
- 路由信息
- 分库分表的依据
- 其他路由形式
- 单据数量增长对单据号的影响
- 单据号长度的划分
- 每秒最大单据数量预估
- 关于路由信息也有一个需要注意的点,就是要尽量做到数据分布平衡。
单据流程
单据的流程一般有正向流程和逆向流程。考虑到解耦和业务复杂度不可控导致的变数,一般情况下建议正向和逆向分开设计和实现。然后通过单号等信息进行关联。
- 正向流程
- 订单正常生产到配送的过程
- 逆向流程
- 逆向流程则指订单发生取消、退货等情况时引发的订单流程过程。