Является ли нормой вести историю изменения всех свойств сущности приложения в mysql таблицу?
Является ли нормой вести историю изменения всех свойств сущности приложения в mysql таблицу?
Для примера:
Есть браузерное приложение (игра). В этой игре есть уровни персонажей, к примеру. Когда уровень персонажа повышается, вместо изменения строки этого персонажа в таблице уровней, создаётся новая строка, с новым уровнем. Старая строка со старым уровнем остаётся. Если к каждой такой строке добавить datetime, то получится история, когда персонажем был получен какой уровень.
Когда нужно узнать текущий уровень персонажа, делается запрос по последнему datetime этого персонажа.
И так ко всем свойствам этого персонажа. К примеру: оружие, опыт, и т.д.
В каком случае, по вашему мнению, свойства вообще стоит вносить в такую "историю"?
Тебе виднее зачем она нужна. По мне так разве что для всяческих разборок с читерами, накрутчиками и при проблемах с оплатами.
Но в именно таком виде не хранил бы. Хранил бы историю отдельно, а последнее значение отдельно, чтобы выборку для текущего значения можно было бы делать без указания "последнего datetime". Поскольку для повседневной работы история не нужна, то и незачем нагружать сервер ненужной работой. Потом, по мере роста сложности игры и количества игроков у тебя будут проблемы с производительностью, если сделаешь как ты написал.
И было бы из-за чего. Не из-за чего - просмотр истории не самая частая и не самая нужная операция.
По поводу "из-за чего". А разве логирование каждого момента не есть стремление к информативности? Когда у вас есть доступ к состоянию приложения, не обязательно игрового, в любой момент времени его существования.
Urukhayy:
Как вы думаете почему логи, как правило, хранят в текстовых файлах, а не в БД?
Есть ситуации, когда логи удобнее в БД, но это только для жестокой борьбы с читерами, накрутчиками и для слежения за игровыми деньгами.
Если тебе этого край как не нужно, то не стоит загружать БД ненужными сущностями.
Riccky: В задаче речь о статистике и прочей мало используемой фигне. Когда нужно клиенту клиент посылает запрос вместе с актуальной инфой.
Аналогично и сервер может её запросить.
Pavel K: Какая разница? Если игра сетевая, то сервер всегда должен знать об состоянии клиента всегда, чтобы с другими клиентами корректно отрабатывать. И невозможно никак не посылать состояние.
Pavel K: Уровень персонажа, к примеру, как в описании задачи? От уровня персонажа зависит результат столкновения (боя). Но согласен, если ты только заапгрейдился и бой еще не скоро, на сервер можно и не слать сразу.
У меня в одной фин. системе был подобный паттерн - висел триггер на UPDATE + INSERT, который складывал все поля + DateTime в имя_таблицы_log. Работало, но есть один нюанс. Если вдруг кто придёт и сделает update table set amount=amount+1, то базе будет ооочень плохо.