Лучший способ сохранить баланс счета клиента - PullRequest
6 голосов
/ 10 октября 2008

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

Ответы [ 8 ]

8 голосов
/ 10 октября 2008

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

7 голосов
/ 10 октября 2008

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

3 голосов
/ 11 октября 2008

«Это зависит». Чаще всего вы хотите избежать производных данных. Тем не менее, есть случаи, когда получение производной суммы оправдано.

Показательный пример:

Я работал над приложением кредитной базы данных, где баланс состоял из множества разных вещей и разных бизнес-правил с течением времени. Например, «баланс» на самом деле был суммой различных сальдо из разных групп, таких как Принципал, Тарифы и т. Д.

Поскольку проводки проводились, они распределялись по разным сегментам в соответствии с бизнес-правилами. Сборы пошли на ведро сборов. Покупки, кредиты и дебеты уходили в основное ведро. Эти распределения и правила могут изменяться со временем.

Представьте себе, что вы запрашиваете 100 000 балансов клиентов на лету перед лицом меняющихся бизнес-правил с течением времени. Это солидный случай, когда наличие производного значения действительно имеет смысл. Мы сохранили набор алгоритмов, чтобы «перематывать» учетную запись и восстанавливать баланс в хронологическом порядке для целей аудита и проверки, но вы не хотели ничего делать для больших наборов.

3 голосов
/ 10 октября 2008

Я думаю, что это зависит от множества факторов, от того, как часто вы будете получать доступ к весам, насколько сложно его пересчитывать каждый раз, когда вам это нужно. Каковы затраты на просмотр и т. Д.

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

2 голосов
/ 11 октября 2008

Все здесь правы. Это зависит. Но вы можете получить лучшее из обоих миров, используя представление. Похоже, у вас довольно маленькая система, и динамический расчет баланса будет самым простым делом. Для простоты я бы определил одно представление, в котором есть нужные данные учетной записи (рассчитанные динамически).

Если вам понадобится больше производительности, я бы настроил систему на основе триггера для обновления баланса в таблице основных счетов, а затем обновил бы представление за кулисами, чтобы вам не нужно было менять другой код. Просто убедитесь, что вы используете правильный режим изоляции базы данных для любого запроса, иначе у вас будут проблемы! ; -)

2 голосов
/ 10 октября 2008

Если просмотры и запросы дают достаточно быстрый результат, не храните их в отдельном поле.

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

0 голосов
/ 10 октября 2008

Используйте представления и запросы - вы удивитесь, насколько быстро он будет работать.

0 голосов
/ 10 октября 2008

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

...