Database design 电子商务网站结帐建模

Database design 电子商务网站结帐建模,database-design,language-agnostic,e-commerce,Database Design,Language Agnostic,E Commerce,通常,当客户单击电子商务网站上的“结帐”按钮时,他们会经历如下结帐过程: 更新/确认购物车中的产品数量 输入地址,选择配送方式 输入信用卡详细信息 查看所有订单详细信息,单击“确认”进行付款 带有订单号的“谢谢”页面 在客户单击签出步骤4上的“确认”后,我们通常希望创建一些数据库对象,包括: 订单 发票(与相应的订单相关) 付款(与相应的发票相关) 我的第一个想法是应该发生这样的事情: 使用订单详细信息创建一个Order对象 使用订单的总成本创建一个发票对象 创建一个状态为“待定”的Paym

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

  • 更新/确认购物车中的产品数量
  • 输入地址,选择配送方式
  • 输入信用卡详细信息
  • 查看所有订单详细信息,单击“确认”进行付款
  • 带有订单号的“谢谢”页面
  • 在客户单击签出步骤4上的“确认”后,我们通常希望创建一些数据库对象,包括:

    • 订单
    • 发票
      (与相应的
      订单相关)
    • 付款
      (与相应的
      发票
      相关)
    我的第一个想法是应该发生这样的事情:

  • 使用订单详细信息创建一个
    Order
    对象
  • 使用订单的总成本创建一个
    发票
    对象
  • 创建一个状态为“待定”的
    Payment
    对象,并尝试向信用卡收费
  • 如果收费成功,请将
    付款
    更新为
    状态=成功
    ,并将客户重定向到“谢谢”页面
  • 如果收费失败,请将
    付款更新为
    状态=失败
    ,并将客户返回到步骤4,并显示错误消息
  • 但是,此流程存在一个问题:如果收费失败,并且客户返回到步骤4,如果他们再次单击“确认”重新尝试付款,将生成重复的
    订单
    发票

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

    因此,为了避免这种情况,我们可以更新现有的
    订单
    发票
    ,如果它们已经存在的话,但是这现在看起来过于复杂了,也打破了发票应该是不可变的这一常见约定


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

    简单回答-在交易确认之前,不会发生任何事情。如果信用卡未通过,请再次向他们显示账单和相关错误消息,以重试。这可能是一个简单的错误。也可能是他们真的不打算下订单

    “发票”意味着欠款。事实上,这可能是一种有趣的方式来描述顾客购物时的过程顺序。但你已经到了最后一步,一旦交易完成,它就只是一个订单。因此,您不需要创建任何单独的内容

    ==========编辑

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

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

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


    此外,我强烈建议-如果订单发生变化-如退货、换货等-您可以发布新订单。因为这一变化的一部分也反映了现有库存的变化

    我考虑过这一点,但是我将失败
    支付
    对象,这些对象未链接到任何订单或客户。谢谢,我认为我将只在支付成功后创建
    订单
    发票
    对象,还有一个
    Payment.notes
    字段,我可以在其中添加一条消息,说明失败付款的原因。