CanVas
@CanVas
Веб-мастер

Как лучше всего вести историю изменений в mysql на крупном проекте?

Планирую вести историю изменений на сайте.
К примеру: есть материал. Материал храниться в БД в одной строке в таблице ну скажем posts.
Когда его кто-то меняет, необходимо схранить что именно и кем было изменено.
И вот вопрос - как это поудачнее реализовать? Поудачнее в плане больших данных.
Самое простое решение, которое вижу я - создать таблицу в БД с именем history:
| datetime-------| table | user | id- | changes                  |

| 12.02.15 12:48 | posts | 345  | 21  | laguage:ru=>en; ...и т.д.|


в конкретно данном случае пользователь с id=345 в 12.02.15 12:48 изменил строку в таблице posts c id=21 таким образом, что значение language было изменено с ru на en. И конечно сохранять изменения лучше не всей строки, а только того что конкретно было изменено. А по хорошему, можно и "ru=>" удалить. т.е. прошлое состояние, и сохранять только новое.

Всё ок, но я подозреваю рано или поздно огромный вес этой таблицы history. Как оптимизировать? Сохранять в файлы кусками? Так их потом нельзя будет нормально смотреть там же на сайте, и быстро найти изменения по фильтам...
Может в течении допустим дня - сохранять всё в эту таблицу, а по окончанию дня - просто регулярно переносить всё из неё, вообще в другую БД? Что бы основную - рабочую не перегружать.
  • Вопрос задан
  • 3272 просмотра
Решения вопроса 1
viwoam
@viwoam
I solve problems!
Сделайте себе документацию ивентов, экшенов которые могут быть. Нaпример ADD_POST, EDIT_POST и для каждова сохраните в виде ENUM, таким образов вам не нужно будет сохранять кучу информации которая бесполезна так как у вас все документировано. А таблица с 3 полями INT post_logs (можете и user_id добавить) будет работать быстро хоть с миллион данными. Еще плюс такой реализации в том что вы можете добавить связи не толкьо для posts, а практически любую реализацию.
К примеру users_logs, transaction_logs и так далее...
Дизайн модели: joxi.ru/DmBnDxVu8qwjmP
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@zelebobko
Как по мне лучше всего через определенное время перекидывать информацию в архивную БД или таблицу и если понадобится можно к ней обратится.
Ответ написан
Комментировать
Посмотрите, как это сделано в WordPress, например.
Там в таблице постов для одного поста есть несколько записей - это состояния поста на какой-то момент времени. Активный - последний. Просто держать, просто отслеживать изменения, просто искать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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