должен ли баланс счета пользователя храниться в базе данных или рассчитываться динамически?
Должен ли баланс счета пользователя храниться в базе данных или вычисляться динамически?
Для точных результатов вычисление его динамически имеет смысл, но тогда это может быть проблемой, когда есть много пользователей и база данных становится очень большой?
Транзакция
- Id (PK)
- AccountId
- тип
- DateTime
- сумма
- и т. д..и т.д...
Баланс счета
- Транзакционид (PK/FK)
- BalanceAmount
5 ответов:
Чтобы вести точный аудит, вы должны записывать каждую транзакцию, которая влияет на баланс счета пользователя. Это означает, что вы можете вычислить баланс динамически, однако из соображений производительности я бы также сохранил баланс. Чтобы убедиться, что баланс правильный, я бы ежедневно выполнял задание, которое пересчитывает баланс с нуля.
Я думаю, что это хороший вопрос. Вычисление каждый раз, очевидно, легко сделать, но, вероятно, приведет к большому количеству ненужных вычислений с результирующим ударом производительности.
Но сохранение текущего баланса в какой-то другой таблице может привести к проблемам в параллелизме данных, когда данные, которые строит агрегат, изменяются несинхронно с агрегатом.
Возможно, счастливая среда должна иметь триггер sql в таблице транзакций, который обновляет агрегат значение вставки или обновления для этого пользователя.
Вам нужно задать себе несколько вопросов.: 1) Кому будет принадлежать расчет? 2) Кому будет нужен результат?
Теперь, если владелец расчета - единственный, кому он понадобится, или если кто-то другой, кому он нужен, получит его от владельца, тогда нет необходимости хранить расчет.
Однако в большинстве приложений, которые на самом деле работают в течение длительного времени, вычисленный результат, вероятно, понадобится где-то еще. Например, приложение для отчетности, такое как SQLReportingServices будет нужен результат вычисления, так что если владельцем вычисления является веб-приложение, у вас есть проблема. Как службы reporting services (которые работают только с базой данных) получат результат?
Решение в этом случае - либо хранить вычисление, либо сделать базу данных владельцем вычисления и иметь функцию sql, которая возвращает результат.
Лично я склоняюсь к непуристскому подходу-я храню вычисленные результаты в базе данных. Космос это дешево, и время отклика быстрее при чтении, чем при вызове функции read+.
Текущий баланс уже доступен! это остаток в последней транзакции по счету:
select top 1 [Balance] from dbo.Trans where [AccountID] = @AccountID order by [TranID] desc
Баланс должен быть вычислен и сохранен как часть каждой транзакции. в противном случае система не будет масштабироваться ... кроме того, если вы не храните баланс, у вас нет сдержек и противовесов (поскольку баланс должен быть равен предыдущему балансу плюс новые кредиты за вычетом новых дебетов)
Если ваше приложение не извлекает данные из базы данных для расчета баланса, в то время как вам нужен баланс, я предложу вам рассчитать баланс или сохранить его в базе данных.
Если вам часто требуется обновлять баланс, и он динамически изменяется на основе более чем одной таблицы, то вместо триггера у вас должно быть представление таблицы.