0

私はデータベースに精通していませんが、この設定がある場合:

Payment -> Advances -> Advance Payments

そのため、未払いの合計金額が不足しているpayment可能性があります。advance顧客ごとに、あなたがしたいときは、自分の会計目的のために、advance paymentを「偽装」する必要があります. どうすればそれについて行くでしょうか。advance paymentpayment

今、advancesへの外部キーを持ち、 への外部キーをpayments持っadvance paymentsていますadvances

簡単なシナリオ:

合計100ドルの注文があります。顧客は 80 ドルを支払い、20 ドルが前払いされます。advanceそのため、これ (支払い 1) に添付 (fk'd)される (前払い 1) を作成しましたpayment。顧客は再び注文し、今回は合計が $50 で、$40 しか支払わないため、別のadvance(前払い 2) がその新しいpayment(支払い 2) に関連付けられて作成されます。

顧客が支払いを決定すると、advancesapaymentが作成され (支払い 3)、(前払いadvances1 と前払い 2) がそれに追加されpaymentます (支払い 3)。advanceこれは、システムに表示されたときに、従業員が支払い先を選択できるようにするためです。合計を取得してから金額を差し引くほど単純ではありませんpayment

したがって、彼らが金額を入力すると、advance paymentが作成され、それに接続さadvanceadvance paymentsますadvances

ここで質問ですが、支払いによって作成された前払いを確認したい場合、どうすればよいですか?

私は自分の構造を壊したくありませんpayment - advance - advance payment-それともそうですか? 私はちょうどテーブルにいることを考えpaymentidsましたが、それは中間者であるとを無視advance paymentする関係を生み出します. 私はこれについて間違って考えているかもしれませんが、よくわかりません。paymentsadvance paymentsadvance

いくつかの詳細情報:

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 に答える