таблица таблиц системы онлайн-кредитов для внешнего ключа получателей транзакций - PullRequest
4 голосов
/ 06 июля 2011

Я пытаюсь выяснить, как правильно хранить внешние ключи, когда ключ указывает на другую таблицу в зависимости от типа.

Я искал но ничего Я нашел 1010 * Казалось * помочь в все .

Существует одна таблица, в которой будет храниться большинство основ для кредитов:

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

Пока все хорошо. Эта следующая часть, я немного озадачен. Он также должен будет хранить, куда направляются деньги.

Я бы хотел сохранить внешний ключ для того, что бы тип указывал бы на его. Так что, если это покупка, она будет хранить FK для invoice_id, если это депозит, она будет хранить транзакцию_id от торгового провайдера, если это перевод, она будет хранить user_accounting_id кредита, если это кредит, то он будет сохранить user_accounting_id перевода.

Было бы неплохо иметь один столбец, в котором хранится:

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

Но я знаю, что у меня не может быть одного столбца, являющегося внешним ключом, связывающим разные таблицы на основе типа . Так что я мог бы просто сохранить его как (int), но было бы огромной болью , чтобы попытаться выполнить JOINs с этим идентификатором с различными таблицами на основе типа . Пытался сделать это давным-давно, большая ошибка.

Так что вместо этого я мог бы сделать это вместо:

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 Ответ

1 голос
/ 06 июля 2011

Бухгалтеры занимались хранением, откуда поступают деньги и куда они уходят, более 500 лет. Вот почему они изобрели двойную бухгалтерию. В противном случае известен как учет двойной записи.

Вам нужно взглянуть на модель данных для двойной записи бухгалтерского учета. Это было сделано тысячи раз программистами, которые были до вас.

Если вам нужен образец модели, посетите База данных ответов и посмотрите в разделе «Системы учета». Вы должны быть в состоянии получить диаграмму модели, которая охватывает ваш случай.

...