数据库关系和“结构”

时间:2013-09-10 04:23:16

标签: sql database linq sql-server-2008

我对数据库不太熟悉,但如果我有这个设置:

Payment -> Advances -> Advance Payments

因此,payment可能会因应付总金额不足而产生advance。根据客户的意见,当您想要制作advance payment时,您必须将advance payment伪装成payment - 用于自己的会计目的。我该怎么做呢。

目前,advances拥有payments的外键,而advance payments拥有advances的外键。

一个简单的场景:

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

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

因此,当他们输入金额时advance payment已创建并附加到advance,因为advance payments已转到advances

现在的问题是,如果我想查看付款创建了哪些预付款,我将如何做?

我不想破坏payment - advance - advance payment - 或我的结构吗?我想在paymentids表中只有advance 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.我不知道这是否有所作为。

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

1 个答案:

答案 0 :(得分: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