SQL круговой внешний ключ - PullRequest
0 голосов
/ 29 июня 2018

Предположим, база данных содержит некоторые учетные записи и транзакции.

Будет таблица Account (для простоты она содержит только идентификатор) и таблица Transaction, в которой есть столбцы id, account_id (внешний ключ), type и value.

Теперь, если деньги поступят на депозит, проблем не будет. account_id выбрано и type и value определены. Но что, если я хочу перевести деньги со счета a на счет b?

Я думал о добавлении какого-то offset_account_id, чтобы отличать, где и где, но это не очень хорошее решение, imo.

Или мне добавить две транзакции для каждой из задействованных учетных записей? Затем я сначала должен вставить оба и после обновления оба, так как они должны иметь круговую ссылку друг на друга.

В-третьих, я подумал о добавлении таблицы «переноса», в которой будут храниться transaction_id задействованных учетных записей.

Тем не менее, моя проблема с последним решением заключается в том, что, если я удаляю учетную запись и хочу каскадировать ее по всей базе данных, все транзакции должны удаляться автоматически. Но если я удалю a, то транзакция для a исчезнет, ​​и запись в таблице переноса также будет сохранена, но транзакция счета b все равно будет в базе данных.

Что такое хороший макет для этих «бухгалтерских» проблем?

Дополнительный вопрос: будете ли вы рассчитывать баланс во время выполнения или работать с триггерами вставки / удаления / обновления для сохранения баланса с соответствующей учетной записью?

1 Ответ

0 голосов
/ 29 июня 2018

Я публикую пример таблиц, описанных выше. В этом примере с идентификатором счета «100» был произведен платеж в размере 30 долларов США с идентификатором счета «123». Транзакция отображается как запись в таблице кредиторской задолженности и как запись в таблице дебиторской задолженности.

Table Examples

Тогда, если аккаунт на 100 будет закрыт в один прекрасный день, вы удалите остаток с аккаунта, создав новую запись в таблице кредиторской задолженности. Если деньги переводятся на новый счет, то в таблице дебиторской задолженности также будет создана запись. Это покажет историю перемещения средств. Если вы хотите отслеживать, какие счета открыты или закрыты, я бы также предложил создать таблицу, которая содержит все номера счетов, имена клиентов и столбец для «открытых / закрытых». Таким образом, закрытые учетные записи будут отражены в ваших данных, и вы все равно сможете делать запросы на основе открытых или закрытых учетных записей, но история не будет удалена, что крайне важно для надежных учетных записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...