交易目的地外键的在线信用系统表布局

时间:2011-07-06 06:48:57

标签: mysql database database-design accounting credits

我正在试图找出当键根据类型指向不同表时如何正确存储外键。

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.

然后外键不会有问题。当然,为了找出任何人的帐户余额,我现在必须从一堆表中加入和加总。

也许有一种完全不同的更好的方式。我不关心它需要多少个表。我有可能在某处使事情变得复杂。

由于

1 个答案:

答案 0 :(得分:1)

簿记员一直在处理存钱的来源以及资金流向500多年的情况。这就是他们发明双重记账的原因。否则称为复式会计。

您需要查看双重录入簿记的数据模型。来自你面前的程序员已经成功完成了数千次。

如果您需要样本模型,请访问Database Answers并查看“会计系统”。您应该能够获得涵盖您案例的模型图。