Я пытаюсь выяснить, как правильно хранить внешние ключи, когда ключ указывает на другую таблицу в зависимости от типа.
Я искал
но ничего
Я нашел
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.
И тогда внешние ключи не будут проблемой. Конечно, чтобы выяснить баланс любого аккаунта, я должен был бы сейчас делать соединения и суммы из нескольких таблиц.
Возможно, есть совершенно другой лучший способ сделать это. Мне все равно, сколько столов это займет. Скорее всего, я где-то что-то усложнил.
Спасибо