【发布时间】:2016-11-10 15:41:13
【问题描述】:
通常,当客户点击电子商务网站上的“结帐”按钮时,他们会经历如下的结帐流程:
- 更新/确认购物车中的产品数量
- 输入地址,选择送货方式
- 输入信用卡详细信息
- 查看所有订单详情,点击“确认”付款
- 带有订单号的“谢谢”页面
客户在结账的第 4 步点击“确认”后,我们通常会希望创建一些数据库对象,包括:
Order-
Invoice(与对应的Order有关系) -
Payment(与对应的Invoice有关系)
我的第一个想法是应该发生这样的事情:
- 使用订单详细信息创建一个
Order对象 - 创建一个包含订单总成本的
Invoice对象 - 使用
status=PENDING创建一个Payment对象并尝试从信用卡中扣款 - 如果收费成功,请将
Payment更新为status=SUCCESS并将客户重定向到“谢谢”页面 - 如果收费失败,请将
Payment更新为status=FAIL并让客户返回第 4 步并显示错误消息
但是,这个流程有一个问题:如果收费失败,客户返回第4步,再次点击“确认”再次尝试付款会产生重复的Order和Invoice .
为避免这种情况,我们可以修改此流程以仅创建新的 Order 和 Invoice(如果它们尚不存在)。但是,这样做的问题是用户可能会单击返回到第 1 步,更改订单,然后再次尝试付款。在这种情况下,Order 和 Invoice 对象将不正确,因为顺序已更改。
因此,为避免这种情况,我们可以改为更新现有的 Order 和 Invoice(如果它们已经存在),但现在这似乎过于复杂,并且也违反了发票应该是不可变的常见约定。
对此建模的最佳方法是什么?
【问题讨论】:
标签: database-design language-agnostic e-commerce