aco*_*aco 5 language-agnostic database-design e-commerce
通常,当客户点击电子商务网站上的“结账”按钮时,他们会经历如下结账流程:
客户在结帐的第 4 步单击“确认”后,我们通常希望创建一些数据库对象,包括:
OrderInvoice(与相应的 有关系Order)Payment(与相应的 有关系Invoice)我的第一个想法是应该发生这样的事情:
Order使用订单详细信息创建一个对象Invoice包含订单总成本的对象Payment对象status=PENDING并尝试向信用卡收费Payment到status=SUCCESS并将客户重定向到“谢谢”页面Payment至status=FAIL与回报客户步骤4的错误消息显示但是,这个流程有一个问题:如果收费失败,客户返回第4步,如果再次点击“确认”重新尝试付款Order,Invoice则会生成一个副本。
为避免这种情况,我们可以修改此流程以仅创建一个新流程Order,Invoice如果它们尚不存在。然而,这样做的问题是用户可能会点击回到第 1 步,更改订单,然后再次尝试付款。在这种情况下,Order和Invoice对象将不正确,因为顺序已更改。
所以为了避免这种情况,我们可以改为更新现有的Order,Invoice如果它们已经存在,但这现在看起来过于复杂,并且也打破了发票应该是不可变的通用约定。
对此建模的最佳方法是什么?
简单的答案 - 在交易确认之前不会发生任何事情。如果信用卡未通过,您可以再次向他们展示账单表格以及相关错误消息,然后再试一次。这可能是一个简单的错误。或者他们可能不会真正执行订单。
“发票”意味着欠钱。实际上,这可能是一种有趣的方式来描述客户购物时正在处理的订单。但你已经到了最后一步,一旦交易完成,它就只是一个订单。所以你不需要单独创建任何东西。
=========编辑
嘿,我真的很感谢您在其他评论中详细说明了发票要求 - 不知道这一点。我仍然会反对在你知道会有订单之前必须创建订单的想法。
否则 - 为什么不在发票上执行与付款相同的操作?似乎发票只有在交易完成后才“不可变”。因此,有一个状态字段 - 待处理、成功、失败等,如果付款失败,则非常重要 - 在提交交易之前 - 您正在检查购物车等以重新确认所有总计。
您需要让客户无法点击返回并更改订单。购物车中必须有一个令牌或某种标识符,这使得这成为不可能。
另外,我强烈建议您在订单发生更改(例如退货、换货等)时发出新订单。因为该变化的一部分还考虑了现有库存的变化。