我正在试图找出当键根据类型指向不同表时如何正确存储外键。
我searched 但是nothing 我found seemed 到help at all
有一个表格可以存储大部分基本信息:
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)
输入 s:
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)
但我知道我不能将一个列作为基于类型链接到不同表的外键。所以我可以将它存储为(int)但是尝试使用基于类型的不同表格对该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.
然后外键不会有问题。当然,为了找出任何人的帐户余额,我现在必须从一堆表中加入和加总。
也许有一种完全不同的更好的方式。我不关心它需要多少个表。我有可能在某处使事情变得复杂。
由于
答案 0 :(得分:1)
簿记员一直在处理存钱的来源以及资金流向500多年的情况。这就是他们发明双重记账的原因。否则称为复式会计。
您需要查看双重录入簿记的数据模型。来自你面前的程序员已经成功完成了数千次。
如果您需要样本模型,请访问Database Answers并查看“会计系统”。您应该能够获得涵盖您案例的模型图。