订单/发票/付款数据库建模

时间:2015-03-04 18:18:51

标签: database database-design e-commerce payment invoice

我正在设计一个电子商务网站,其中包含以下情况:

  1. 客户可以购买商品并创建订单。
  2. 订单可能会在客户之后添加未知费用 支付物品的总金额。也就是说,客户付钱 一定数量先。该订单增加了一些费用并改变了总额。 并且客户再次支付差额。但这两个(或 更多)付款与相同的订单相关联。
  3. (可选)客户可以为多个提交单笔付款 订单。
  4. 目前,我有一个Order表,每个订单可能包含多个OrderLineItem s(简化架构):

    Order
    =====
    customer
    line_items
    total
    status
    
    OrderLineItem
    =============
    price
    quantity
    order
    product
    

    付款与订单相关联(简化架构):

    Payment
    =======
    order
    payment_account
    total
    result
    

    在当前的实施中,支持单个订单方案的多次付款似乎非常困难。我估计我必须在系统中引入不可变发票,并且付款应该与发票而不是订单相关联。但是,我需要一些关于上述方案的订单/发票/付款建模的帮助。我有一些具体问题:

    1. 订单和发票看起来与我非常相似(例如两者都有 项目和总数)。典型的主要区别是什么? 电子商务系统?
    2. 我应该如何为我的方案建模发票?我应该 对于OrderLineItem的{​​{1}}和Order来说,InvoiceLineItem是什么?
    3. 一些初步想法:我将有多个发票相关联 有一定的顺序。每当订单改变总数时,我都有 以某种方式计算差异并发送新的/不可变的发票 给客户。然后,客户可以付款并付款 与发票相关联。
    4. 很想听听一些建议。非常感激。谢谢!

1 个答案:

答案 0 :(得分:9)

这里有很多问题,我会尝试尽可能多地解决。很多问题都是商业模式而不是数据模型。

首先,你是对的,你需要一个不可变的发票。创建发票后,您无法对其进行更改,处理发票更改的标准方法是发出贷方通知单和新发票。

考虑表之间的关系:Order不需要保持lineItem,因为这些是以另一种方式引用的,即

Order
=====
orderId
customerId
status

OrderLineItem
=============
orderLineItemId
orderId
product
price
quantity

所以要查看你在orderId上加入表的顺序。还没有必要存储total,因为它是根据连接计算的。

尽量不要复制您的数据:您的发票会引用orderLineItem,但不一定是订单中的相同内容。例如,客户订购A和B,但B缺货。您运送A并为A引用orderLineItemId的发票。因此您的发票表可能如下所示:

invoice
=======
invoiceId
status

invoiceLineItem
===============
invoiceId
orderLineItemId
quantity

换句话说,没有必要具有该项目的细节。您可能想知道为什么不要将invoiceId添加到orderLineItem表中 - 原因是客户可能会订购项目A中的10个,但您只发送其中的8个,其他两个将继续发送。

付款不是针对订单,而是针对发票。因此,您的付款表应该引用invoiceId。

然后你谈谈和解。如果一切都很完美,即使是部分付款,客户也会针对特定发票进行付款。实际上,这将是你最头痛的问题。假设客户有多个未付的金额x,y和z的发票。如果他们支付p,你会分配哪个?也许按日期顺序,如果p> x,则将余数分配给y。如果p = z怎么办?也许客户打算现在支付z,但是对y表示怀疑并且误放了x?你如何处理这些事情取决于你,但我可以说大多数发票系统确实非常糟糕。