HTML5技术

关于数据库‘状态’字段设计的思考与实践 - 倒骑的驴(2)

字号+ 作者:H5之家 来源:H5之家 2017-08-20 12:00 我要评论( )

对于支付失败,则要看需求,如果需求要求用户可以继续支付,则订单需要保留,并且状态仍然为等待买家付款,如果不允许再支付,则理论上可以将BizState置为支付失败终态,所以,支付失败的BizState终态也应当记录到O

对于‘支付’失败,则要看需求,如果需求要求用户可以继续支付,则订单需要保留,并且状态仍然为‘等待买家付款’,如果不允许再支付,则理论上可以将BizState置为‘支付失败’终态,所以,‘支付失败’的BizState终态也应当记录到OrderState字段中。

对于‘发货’失败、‘收货’失败的情况,通常是不会发生的,即使发生也不属于系统能够控制的范畴,系统记录并无意义,更具建设性的做法是通过线下手段尽快解决问题,重新发货等等,所以对于这些状态系统的OrderState字段不予记录。

这样下来我们的OrderState字典值增加到6个,加粗项为新增:

目前的订单状态流转:

‘action行为’进行中的情况

对于action的SubState是‘1进行中’的处理,同样需要具体场景具体分析。‘付款’行为是用户发起的,但是并不是和订单系统之间的交互,涉及到支付系统的处理,这个领域也不是订单系统可控的,但关系到钱,用户比较关系,所以对于这样一个中间态,我们需要记录,以便用户通过订单系统查询订单状态,为便于用户理解,将此状态在OrderState中记为‘付款确认中’;‘发货’‘收货’进行中的情况,不是订单系统可以控制的领域,我们可以把他们当着行为‘未开始’处理,比如‘发货进行中’,订单系统的OrderState值为‘买家已付款’,但给用户看到的提示信息是‘买家已付款,等待卖家发货’,实际上这时候卖家可能正在发货中,但是用户不会去关心到底有没有打包好货物什么的,所以这类‘进行中’状态可以舍弃。这样下来订单系统的OrderState字段又多了一个字典值:‘付款确认中’:

目前的订单状态流转:

‘action行为’未开始的情况

忽略所有action的‘0未开始’SubState状态。因为这类SubState对于BizState不会带来变化。

‘评论comment’的处理

最后,再来看看‘评论comment’这个action。如果需求上要求:只有买家收货后才能发起‘评论’操作,则可以任务‘评论comment’单向依赖于‘receive收货’行为,那么可以将这个action的subState对应的少量BizState(应当只有‘买家已评论’、‘卖家已评论’状态)纳入OrderState字段统一记录;但是如果需求是:买家在下单后就可以开始评论,比如如果卖家发货慢了,买家可以上去吐槽,那么‘评论comment’就不是单向依赖于‘receive收货’行为了,而是多向依赖于‘pay付款’、‘deliver发货’、‘receive收货’,那么这些actions的subState组合可能性就暴增,BizState的字典取值也会暴增,显然,不应当将这么多的BizState交给OrderState来记录,而应当由一个独立的数据库字段负责记录‘评论comment’的SubState,我们可以将这个字段取名为‘CommentState’(评论状态),它的字典值不多,只有:‘未评论’、‘买家已评论’、‘卖家已评论’;其实,对于前一种需求,也可以不讲‘评论comment’对应的SubState产生的BizState纳入OrderState,因为用户对于评论与否其实并不是那么关心的,也就是说‘评论comment’并不是核心业务流程,为了降低核心业务流程的系统处理复杂度,将其从核心业务流程中剥离出来较好。

综上,我们应当将‘评论comment’对应的BizState独立到一个字段中记录。

‘退货rereturn’的处理

再来看看‘退货rereturn’行为对应的BizState的处理。‘退货rereturn’并不是所有订单都会经历的,但是一旦涉及,则‘退货rereturn’在业务流程上必定是单向依赖于单向依赖于‘receive收货’,所以应当将‘退货rereturn’产生的BizState(‘退货中’、‘退货成功’,‘退款失败’和‘未退货’被忽略,见上面解释)纳入OrderState一并记录;这样我们的OrderState有多了两种字典值,这里我们不考虑一个订单中有多种商品的情况,故把‘退货成功'当着终态处理,如果是一个订单多种货物的情况,需要重新仔细分析。加粗项为新增:

目前的订单状态流转:

‘退款refund’的处理

最后来看下‘退款refund’行为对应的BizState的处理。首先,我们需要知道‘退货’和‘退款’是两种不同的业务行为,他们的关系是:通常意义上,‘退货’必然导致‘退款’,但是‘退款’可以没有‘退货’的参与(这里不讨论特殊情况,比如对于虚拟货物来讲,付款成功通常以为着收货成功,这时候就只能是在由‘退货’导致‘退款’),比如电商允许用户付款成功后收到货物前发起‘退款’。也就是说‘退款refund’并不单向依赖于‘退货rereturn’,和‘评论comment’一样是多项依赖,所以,我们可以参考‘评论comment’的处理方式,单独建立一个字段‘RefundState退款状态’记录‘退款refund’产生的BizState,这个状态字段的字典值有:退款中,退款成功。

其他情况考虑

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 关于Egret模块化开发---vip系统 - aゞ时光无声

    关于Egret模块化开发---vip系统 - aゞ时光无声

    2017-08-15 12:00

  • 关于面试!(投递篇) - 碎冰

    关于面试!(投递篇) - 碎冰

    2017-07-28 18:00

  • 关于html转换为pdf案例的一些测试与思考 - 无涯Ⅱ

    关于html转换为pdf案例的一些测试与思考 - 无涯Ⅱ

    2017-07-28 17:09

  • HTML5 — Wed SQL 本地数据库示例 - gdwkong

    HTML5 — Wed SQL 本地数据库示例 - gdwkong

    2017-07-23 10:00

网友点评
i