キーがタイプに基づいて別のテーブルを指しているときに、外部キーを適切に保存する方法を見つけようとしています。
クレジットのほとんどの基本を格納する 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.
そして、外部キーは問題になりません。もちろん、誰かの口座残高を把握するには、テーブルの束から結合と合計を行う必要があります。
おそらく、それを行うためのまったく異なるより良い方法があります。テーブルがいくつあっても構いません。どこかで何かを複雑にしすぎている可能性があります。
ありがとう