【问题标题】:Modelling e-commerce website checkout电子商务网站结账建模
【发布时间】:2016-11-10 15:41:13
【问题描述】:

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

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

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

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

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

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

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

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

因此,为避免这种情况,我们可以改为更新现有的 OrderInvoice(如果它们已经存在),但现在这似乎过于复杂,并且也违反了发票应该是不可变的常见约定。

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

【问题讨论】:

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


    【解决方案1】:

    简单的答案 - 在交易被确认之前什么都不会发生。如果信用卡没有通过,请再次向他们展示带有相关错误消息的帐单表格,然后再试一次。这可能是一个简单的错误。或者可能是他们真的不会执行订单。

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

    ========= 编辑

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

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

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

    此外,我强烈建议 - 如果订单发生更改 - 例如退货、换货等 - 您发出新订单。因为这种变化的一部分也解释了手头库存的变化。

    【讨论】:

    • 我考虑过,但我将失败Payment 未链接到任何订单或客户的对象。
    • 谢谢,我想我只会在付款成功后创建 OrderInvoice 对象,并有一个 Payment.notes 字段,我可以在其中添加有关付款内容的消息用于支付失败。
    猜你喜欢
    • 1970-01-01
    • 2019-06-17
    • 2017-09-07
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多