Текущий баланс и парадигма нормализации базы данных - PullRequest
2 голосов
/ 20 ноября 2010

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

Допустим, у меня есть таблица SQL с транзакциями

transactions(id int, credit float, debit float, billable_account_id int)

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

Я использую Postgres, если это имеет значение (хотя тема является общей), и я вообще не ниндзя SQL, но пытаюсь быть педантичным в проектировании.

Вопросы:

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

Любые ссылки очень ценятся!

1 Ответ

1 голос
/ 20 ноября 2010

Вы можете использовать аналитические функции для генерации промежуточной суммы в большинстве баз данных.В Oracle что-то вроде

SELECT billable_account_id,
       SUM( (CASE WHEN credit IS NOT NULL THEN credit
                  WHEN debit IS NOT NULL THEN -1 * debit
                  ELSE 0 
                  END) ) OVER (PARTITION BY billable_account_id
                                   ORDER BY transaction_date ) running_total
  FROM transactions

Если у вас нет TRANSACTION_DATE, вы можете использовать ID, предполагая, что вы можете гарантировать, что сгенерированные идентификаторы увеличиваются монотонно.

Однако изС точки зрения производительности, вы, вероятно, захотите согнуть, если не нарушите третьи нормальные правила нормализации формы для отчетов типа OLAP / DSS, потому что люди захотят отчитываться по итоговым суммам довольно часто, и некоторые учетные записи, вероятно, будут иметь большое количество транзакций.Например, вы можете захотеть создать отдельную таблицу с конечным балансом для каждого BILLABLE_ACCOUNT_ID для каждого конца месяца, а затем использовать аналитическую функцию, чтобы просто добавить транзакции текущего месяца в конечный баланс прошлого месяца.В Oracle вы можете создать материализованное представление, которое будет автоматически поддерживать промежуточную сумму.

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