0

我不是很精通数据库,但如果我有这个设置:

Payment -> Advances -> Advance Payments

因此,apayment可能是advance由于应付总额不足而导致的。对于客户来说,当您想要制作一个时,advance payment您必须将其“伪装”advance paymentpayment- 用于他们自己的会计目的。我该怎么做。

现在,advances有一个外键到payments并且advance payments有外键到advances.

一个简单的场景:

我们有一个总额为 100 美元的订单。客户支付 80 美元,预付 20 美元。因此,我们创建了一个advance(预付款 1),附加(fk'd)到此payment(付款 1)。客户再次订购,这次总金额为 50 美元,只支付 40 美元,因此advance创建了另一个(预付款 2)与新的payment(付款 2)相关联。

当客户决定他们想要还清时,会创建advancesa payment(付款 3)并将advances(预付款 1 和预付款 2)添加到其中payment(付款 3)。这样做是为了当它显示在系统中时,员工可以选择advance向哪个付款。它不像得到总数然后减去payment金额那么简单。

因此,当他们输入金额时,advance payment将创建并附加到该金额,advance因为它们advance payments是 fk'd to advances

现在的问题是,如果我想查看付款产生了哪些预付款,我该怎么做?

我不想打破我的结构payment - advance - advance payment——或者我是吗?我想过只是paymentidsadvance payment桌子上,但这会在两者之间建立一种关系,paymentsadvance payments忽略了advance中间人。我可能想错了,但我不确定。

更多信息:

Payment Table
-------------
id : pk
amount 

Advance Table
-------------
id
amount
paymentId // payment that created the advance

Advance Payment Table
---------------------
id
amount
advanceId

我认为错误的建议是:

Payment Table
-------------
id : pk
amount 

Advance Table
-------------
id
amount
paymentId // payment that created the advance

Advance Payment Table
---------------------
id
amount
advanceId
paymentId <---- add paymentid

我认为这会破坏结构/流程,并且付款将不再具有预付款的预付款。

更多信息 - 我们正在使用 linq 和 SQL Server 2008。我不知道这是否会有所不同。

这可能非常令人困惑,但我试图以最好的方式解释它。

4

1 回答 1

0

如果您在 AdvancePayment 表中有一个 advanceId,那么它已经链接到 Payment 表。所以我认为不需要另一个外键。

所以,如果我理解你的故事是正确的。订单价格必须等于付款和预付款的总和。那么 AdvancePayment 金额的总和必须等于链接的 Advance。

SELECT AP.id FROM AdvancePayments AP
INNER JOIN Advances A
ON AP.advanceId = A.id
INNER JOIN Payments P
ON A.paymentId = P.id
WHERE P.id = 1
于 2013-09-10T07:00:30.540 回答