Как работать с финансовыми транзакциями в реляционных базах данных? - PullRequest
0 голосов
/ 26 октября 2019

Я изо всех сил пытаюсь создать свою базу данных. Моя база данных включает финансовые операции многих видов, которые будут использоваться для расчета балансов пользователей. Разные транзакции имеют разную структуру, и на данный момент я храню их в разных таблицах. Когда дело дошло до подсчета баланса пользователя, я понял, что это большой беспорядок, поскольку мне нужно было выбрать много разных несогласованных строк из нескольких таблиц и сложить их все вместе. Поэтому я подумал, что если я создам одну таблицу, которая будет суммировать транзакцию (например, сумму и идентификатор пользователя, которому она принадлежит) и будет ссылаться на более подробную запись и иметь поле для указания, какая это транзакция. Как оказалось: то, что я пытался реализовать, называется «полиморфными ассоциациями», и нет способа реализовать его с помощью MySQL надежным способом. Есть некоторые обходные пути, но ни один из них не гарантирует целостность данных на том уровне, на котором я хочу. В конце концов я настолько отчаялся, что начал смотреть на другие СУБД, но ни одна из них, похоже, не подходит и для моего случая.

У вас есть какие-либо рекомендации? Может быть, мне не стоит бояться писать большие и растущие функции для расчета балансов пользователей? Или я должен пойти с лучшим вариантом моделирования полиморфных ассоциаций в MySQL и оставить небольшой риск несогласованности данных? Или, может быть, существуют СУБД, которые могут решить мою проблему без обходных путей?

Структура, которую я сейчас имею The structure I have now Некоторые транзакции связаны напрямую с пользователем, а другие - через другую таблицу. Моя цель - вычислить сумму всех транзакций для одного пользователя, и было бы действительно большим и растущим оператором SQL, чтобы получить все строки для каждого типа транзакции.

Вот как я хочуон должен быть структурирован This is how I want it to be structured

То есть я хочу иметь одну таблицу для более простых вычислений, но эта таблица должна обеспечить, чтобы существующая запись существовала.

1 Ответ

1 голос
/ 26 октября 2019
BEGIN;
SELECT balance FROM Balances WHERE user_id = 123 FOR UPDATE;
do stuff in other table(s)
UPDATE Balances SET balance = balance + 876 WHERE user_id = 123
COMMIT;

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

Обратите внимание, что баланс пользователя находится только в одном месте в одной таблице

FOR UPDATE имеет решающее значение для правильной блокировки.

...