2010-11-19 3 views
2

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

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

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

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

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

Вопросы:

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

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

ответ

1

Вы можете использовать аналитические функции для генерации общего количества в большинстве баз данных. В 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, вы можете использовать идентификатор при условии, что вы можете гарантировать, что сгенерированные идентификаторы монотонно возрастает.

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

+3

http://tech.jonathangardner.net/wiki/PostgreSQL/Materialized_Views –

+0

Спасибо, ребята! Ты дал мне направление! – forker

Смежные вопросы