4

キーがタイプに基づいて別のテーブルを指しているときに、外部キーを適切に保存する方法を見つけようとしています。

検索しまし役に立たなかっ よう です。

クレジットのほとんどの基本を格納する 1 つのテーブルがあります。

user_accounting
--------------------
user_accounting_id      (PK)
user_id                 (FK)
amount              
type                    (+deposit, +credit, -transfer, -purchase)
credit                  (bool, so I don't have to always check if amount is < or > 0)
void                    (in case it was canceled and repaired with some other transaction)
date
details                 (notes)

タイプ:

deposit - for outsite money being put into the system.
credit - are for money being transfered into their account from another
transfer - for putting money into someone elses account
purchase - for purchasing a site item

ここまでは順調ですね。この次の部分は、私が少し混乱しています。また、お金の出入り場所を保存する必要もあります。

どのようなタイプのものであっても外部キーを保存したいと思います。したがって、購入の場合はinvoice_idのFKを保存し、デポジットの場合はマーチャントプロバイダーからのtransaction_idを保存し、送金の場合はクレジットのuser_accounting_idを保存し、クレジットの場合はそれを保存します転送の user_accounting_id を保存します。

それを格納する単一の列があればいいのにと思います:

user_accounting (con't)
-----------------------------
source_or_destination_id (FK)

しかし、単一の列をtypeに基づいて異なるテーブルにリンクする外部キーにすることはできないことを知っています。したがって、それを (int) として保存することもできますが、 typeに基づいて異なるテーブルでその id を使用して JOIN を実行しようとするのは非常に面倒です。ずっと前にそれをやろうとしましたが、大きな間違いでした。

代わりに、代わりにこれを行うことができます:

user_accounting (con't)
-----------------------------
invoice_id                  (FK)
transaction_id              (FK)
credit_user_accounting_id   (FK)
transfer_user_accounting_id (FK)

しかし、それは良いことではない排他的なアークを作成するため、大きな問題です。

タイプに many_to_many_through 関係を使用することもできますが、ピボット テーブルには、複数のテーブルの同じ場所に外部キーを格納するという同じ問題が依然としてあります。

たぶん、さまざまなタイプのトランザクションを完全に異なるテーブルに格納するだけで、次のようにすることができます。

user_accounting_deposit, user_accounting_credit, user_accounting_transfer, user_accounting_purchase.

そして、外部キーは問題になりません。もちろん、誰かの口座残高を把握するには、テーブルの束から結合と合計を行う必要があります。

おそらく、それを行うためのまったく異なるより良い方法があります。テーブルがいくつあっても構いません。どこかで何かを複雑にしすぎている可能性があります。

ありがとう

4

1 に答える 1

1

簿記係は、500 年以上にわたって、お金がどこから来てどこへ行くのかを保管することに取り組んできました。複式簿記を発明したのはそのためです。複式簿記とも呼ばれます。

複式簿記のデータモデルを調べる必要があります。これは、あなたより前のプログラマーによって何千回も行われてきました。

サンプル モデルが必要な場合は、Database Answersにアクセスして、"Accounting Systems" の下を参照してください。ケースをカバーするモデル図を取得できるはずです。

于 2011-07-06T10:44:30.127 に答える