должен ли баланс счета пользователя храниться в базе данных или рассчитываться динамически?


Должен ли баланс счета пользователя храниться в базе данных или вычисляться динамически?

Для точных результатов вычисление его динамически имеет смысл, но тогда это может быть проблемой, когда есть много пользователей и база данных становится очень большой?

Транзакция

  • Id (PK)
  • AccountId
  • тип
  • DateTime
  • сумма
  • и т. д..и т.д...

Баланс счета

  • Транзакционид (PK/FK)
  • BalanceAmount
5 9

5 ответов:

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

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

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

Возможно, счастливая среда должна иметь триггер sql в таблице транзакций, который обновляет агрегат значение вставки или обновления для этого пользователя.

Вам нужно задать себе несколько вопросов.: 1) Кому будет принадлежать расчет? 2) Кому будет нужен результат?

Теперь, если владелец расчета - единственный, кому он понадобится, или если кто-то другой, кому он нужен, получит его от владельца, тогда нет необходимости хранить расчет.

Однако в большинстве приложений, которые на самом деле работают в течение длительного времени, вычисленный результат, вероятно, понадобится где-то еще. Например, приложение для отчетности, такое как SQLReportingServices будет нужен результат вычисления, так что если владельцем вычисления является веб-приложение, у вас есть проблема. Как службы reporting services (которые работают только с базой данных) получат результат?

Решение в этом случае - либо хранить вычисление, либо сделать базу данных владельцем вычисления и иметь функцию sql, которая возвращает результат.

Лично я склоняюсь к непуристскому подходу-я храню вычисленные результаты в базе данных. Космос это дешево, и время отклика быстрее при чтении, чем при вызове функции read+.

Текущий баланс уже доступен! это остаток в последней транзакции по счету:

select top 1 [Balance]
from dbo.Trans
where [AccountID] = @AccountID
order by [TranID] desc

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

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

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