我正在试图弄清楚当键根据类型指向不同的表时如何正确存储外键.
我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.
然后外键不会成为问题.当然要弄清楚任何人的帐户余额,我现在必须从一堆表中加入和总结.
也许有一种完全不同的更好的方式.我不关心它需要多少个表.我有可能在某个地方复杂化某些事情.
谢谢
解决方法:
簿记员一直在处理存钱的来源以及资金流向500多年的情况.这就是他们发明双重记账的原因.否则称为复式会计.
您需要查看双重输入簿记的数据模型.来自你面前的程序员已经成功完成了数千次.
如果您需要样本模型,请访问Database Answers并查看“会计系统”.您应该能够获得涵盖您案例的模型图.