电子商务网站结账建模

aco*_*aco 5 language-agnostic database-design e-commerce

通常,当客户点击电子商务网站上的“结账”按钮时,他们会经历如下结账流程:

  1. 更新/确认购物车中的产品数量
  2. 输入地址,选择送货方式
  3. 输入信用卡详细信息
  4. 查看所有订单详情,点击“确认”付款
  5. 带有订单号的“谢谢”页面

客户在结帐的第 4 步单击“确认”后,我们通常希望创建一些数据库对象,包括:

  • Order
  • Invoice(与相应的 有关系Order
  • Payment(与相应的 有关系Invoice

我的第一个想法是应该发生这样的事情:

  1. Order使用订单详细信息创建一个对象
  2. 创建一个Invoice包含订单总成本的对象
  3. 创建一个Payment对象status=PENDING并尝试向信用卡收费
  4. 如果收费成功,更新Paymentstatus=SUCCESS并将客户重定向到“谢谢”页面
  5. 如果扣款失败,系统更新Paymentstatus=FAIL与回报客户步骤4的错误消息显示

但是,这个流程有一个问题:如果收费失败,客户返回第4步,如果再次点击“确认”重新尝试付款OrderInvoice则会生成一个副本。

为避免这种情况,我们可以修改此流程以仅创建一个新流程OrderInvoice如果它们尚不存在。然而,这样做的问题是用户可能会点击回到第 1 步,更改订单,然后再次尝试付款。在这种情况下,OrderInvoice对象将不正确,因为顺序已更改。

所以为了避免这种情况,我们可以改为更新现有的OrderInvoice如果它们已经存在,但这现在看起来过于复杂,并且也打破了发票应该是不可变的通用约定。

对此建模的最佳方法是什么?

car*_*lot 1

简单的答案 - 在交易确认之前不会发生任何事情。如果信用卡未通过,您可以再次向他们展示账单表格以及相关错误消息,然后再试一次。这可能是一个简单的错误。或者他们可能不会真正执行订单。

“发票”意味着欠钱。实际上,这可能是一种有趣的方式来描述客户购物时正在处理的订单。但你已经到了最后一步,一旦交易完成,它就只是一个订单。所以你不需要单独创建任何东西。

=========编辑

嘿,我真的很感谢您在其他评论中详细说明了发票要求 - 不知道这一点。我仍然会反对在你知道会有订单之前必须创建订单的想法。

否则 - 为什么不在发票上执行与付款相同的操作?似乎发票只有在交易完成后才“不可变”。因此,有一个状态字段 - 待处理、成功、失败等,如果付款失败,则非常重要 - 在提交交易之前 - 您正在检查购物车等以重新确认所有总计。

您需要让客户无法点击返回并更改订单。购物车中必须有一个令牌或某种标识符,这使得这成为不可能。

另外,我强烈建议您在订单发生更改(例如退货、换货等)时发出新订单。因为该变化的一部分还考虑了现有库存的变化。