amount) между пользователями, в обе стороны. Также есть таблица балансов долгов DebtBalance между пользователями, чтобы иметь возможность оперировать балансами в коде и не высчитывать баланс каждый раз из списка долгов. Задача состоит в том как сохранить целостность данных и чтобы баланс всегда был равен тому что находится в таблице долгов.
Сейчас такие модели::
Debt => [
'from_user_id’,
'to_user_id',
'amount’,
];
DebtBalance => [
'from_user_id’,
'to_user_id',
'amount’,
];
В такой схеме требуется постоянно менять местами id пользователей в DebtBalance (если он существует), чтобы amount был положительный. Также когда существует DebtBalance, то его amount меняется на величину amount долга при создании нового Debt между пользователями, что может вызвать проблемы рассинхронизации с таблицей долгов.
Вопросы:
1. Имеет ли смысл заменить один DebtBalance на два DebtBalance, чтобы в одном из них был отрицательный amount и не надо было менять местами id пользователей?
2. Имеет ли смысл при создании нового Debt, не изменять DebtBalance, а удалять его и создавать новый DebtBalance (взяв значение amount для него из таблицы Debt, просуммировав все долги между двумя пользователями)? В идеале сделать это каким то одним запросом sql, чтобы все расчеты база данных сделала самостоятельно.
Модели:
https://github.com/opensourcewebsite-org/opensourcewebsite-org/blob/060beaa33fef7a913293718a1fb6dda29f754739/models/Debt.php
https://github.com/opensourcewebsite-org/opensourcewebsite-org/blob/060beaa33fef7a913293718a1fb6dda29f754739/models/DebtBalance.php
Не знаком с этими понятиями
Вам нужна целостность вот прям сразу одновременно или допустимы поблажки, что изменения во второй таблице отразятся с задержкой?
Целостность разная бывает. Пример: в банке вы делаете перевод и по факту перевод может появится в интерфейсе не сразу. Но точно появится. Более того баланс обновится с еще большей задержкой чем перевод.
параллельно с тем что пользователи создают долги в интерфейсе сайта, в фоне работают процессы которые работают с балансом. так что долг и баланс должны попасть в базу одновременно.
если у тебя есть два процесса то одновременно не выйдет либо нужны блокировки (а это уже не скейлится)
больше чем два процесса. например множество пользователей создают долги, это отражается на балансах между пользователями. параллельно в фоне процесс постоянно смотрит какие балансы изменились и что то с этим дальше делает.
я тебе страшную тайну открою - ты когда данные из базы пихаешь на UI у тебя есть ограничение в виде скорости света (причем в медных проводах в твоей витой паре скорость меньше сильно, а в оптоволокне всеравно не скорость света в вакууме). И даже если все хорошо - мозгу нужно милисекунд 100 что бы осознать что происходит и еще 200 что бы понять что там за циферки.
ну вот от момента как картинка показалась и ты осознал картинку там прилично так времени проходит. Отдельно доставляют разные штуки типа вот был звук и вот картинка а мозг это подстраивает что бы причинно следственные связи.
а. ну если так) а то я сразу так понял что человек больше 10 Гц не воспринимает
тут такая аналогия - вот ты на ощупь можешь различать прям оч маленькие изменения рельефа, чет типа порядка десятков микрон. Но только когда ты юлозишь по поверхности.
Обсуждают сегодня