@driverx18

Арифметическое отнимание напрямую в MySQL или передавать с бэка число?

Возник вопрос, делаю систему, где у пользователя будет баланс. После определенных действий юзера, от его поля balance будет отниматься число 10, а при каких то других действиях, будет прибавляться 10.
Собственно возник вопрос, как лучше, сделать арифметику напрямую:
1 вариант - Сделать запрос
UPDATE users SET balance = balance - 10 WHERE user_id = :userId;

или все же
2 вариант - посчитать это все на бэке и передать просто число в UPDATE? По реализации: получаем нынешнее число balance юзера, на бэке делаем отнимание, получаем число, и это число передаем в базу:
UPDATE users SET balance = :newBalance WHERE user_id = :userId;
?
Как лучше, стоит ли доверять арифметике в бд, или это дело языка программирования? Как лучше, и в чем плюс и минус?
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 2
1-й вариант лучше, т.к. требует на 1 запрос меньше: не приходится сначала запрашивать текущий баланс.
Но этот плюс исчезает, если вам в этом же коде требуется получить новый баланс юзера — тогда оба варианта эквивалентны.

3-й вариант: только-вставлять в ещё одну таблицу новые записи о Событиях. Событие "+10" для user_id=X, затем новая запись "-10" для user_id=Y. И чтобы получить актуальный баланс юзера, вы собираете все его События и суммируете. Раз в месяц уплотняете базу, выкидывая События и обновляя «базовый» баланс для каждого юзера.
Ответ написан
TheRonCronix
@TheRonCronix
Если делать на бекэнде, очевидно, что плюс - это скорость, т.к. операции выполняются в пямяти + не нужно проходить по лишним слоям, чтобы передать данные в БД. Но в таком случае данные могут быть утеряны в случае сбоя сервиса. БД по крайней мере гарантирует, что данные сохранены на диск (хотя тут есть свои но, тем не менее).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы