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

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

>客户可以购买物品并创建订单.
>订单可能会在客户之后添加未知费用
支付物品的总金额.也就是说,客户支付
一定数量先.该订单增加了一些费用并改变了总额.
并且客户再次为差价支付费用.但这两个(或
更多)付款与相同的订单相关联.
>(可选)客户可以为多个提交单笔付款
命令.

目前,我有一个Order表,每个订单可能包含多个OrderLineItems(简化模式):

Order
=====
customer
line_items
total
status

OrderLineItem
=============
price
quantity
order
product

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

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

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

>订单和发票看起来与我非常相似(例如两者都有
项目和总数).典型的主要区别是什么?
电子商务系统?
>我应该如何为我的方案建模发票?我应该
订单的OrderLineItems和Invoice的InvoiceLineItems?
>一些初步想法:我将有多个发票相关联
有一定的顺序.每当订单改变总数时,我都有
以某种方式计算差异并发送新的/不可变的发票
给客户.然后,客户可以付款并付款
与发票相关联.

很想听听一些建议.非常感激.谢谢!

解决方法

这里有很多问题,我会尝试尽可能多地解决.许多问题是业务模型而不是数据模型.

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

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

Order
=====
orderId
customerId
status

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

因此,要查看订单,请加入orderId上的表.也没有必要存储从连接计算的总数.

尽量不要复制您的数据:您的发票将引用orderLineItems,但不一定是订单中的相同.例如,客户订购A和B,但B缺货.您运送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?你如何处理这些事情取决于你,但我可以说大多数发票系统都非常糟糕.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03