电子商务网站结帐建模

时间:2016-07-08 06:42:22

标签: database-design language-agnostic e-commerce

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

  1. 更新/确认购物车中的产品数量
  2. 输入地址,选择送货方式
  3. 输入信用卡详细信息
  4. 查看所有订单详情,点击“确认”进行付款
  5. “谢谢”页面,订单号
  6. 客户在结账的第4步点击“确认”后,我们通常会想要创建一些数据库对象,包括:

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

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

    1. 使用订单详细信息创建Order对象
    2. 使用订单的总费用创建Invoice对象
    3. 使用Payment创建status=PENDING对象并尝试从信用卡中收费
    4. 如果收费成功,请将Payment更新为status=SUCCESS并将客户重定向至“谢谢”页面
    5. 如果费用失败,请将Payment更新为status=FAIL并将客户返回到步骤4并显示错误消息
    6. 但是,此流程存在问题:如果费用失败且客户返回到第4步,则再次点击“确认”即会生成重复的OrderInvoice重新尝试付款。

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

      为了避免这种情况,我们可以更新现有的OrderInvoice(如果它们已经存在),但这现在看起来过于复杂,并且还打破了发票应该是不可变的共同约定。 / p>

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

1 个答案:

答案 0 :(得分:0)

简单回答 - 直到交易确认后才会发生任何事情。如果信用卡没有通过您,请再次使用相关的错误消息向他们显示结算表单。这可能是一个简单的错误。或者可能是他们并没有真正去做订单。

'发票'意味着欠款。实际上,这可能是一种有趣的方式来描述客户购物时的流程订单。但是你处于最后一步,一旦交易完成了它的订单。所以你不需要单独创建任何东西。

=========编辑

嘿,我非常感谢你详细说明你的其他评论中的发票要求 - 不知道这一点。而且我仍然会在你知道根本就会有订单的情况下推迟创建订单的想法。

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

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

此外,我强烈建议 - 如果订单被更改 - 例如退货,交换等 - 您发出新订单。因为部分变化也是手头库存变化的原因。