Как правильно реализовать механизм сохранения устаревшей версии поста (вести историю изменений поста/публикации)?
Всем доброго времени суток!
Есть сайт, на котором публикуются некоторые записи другими пользователями. И появилась задача сохранять предыдущие версии этих записей, что бы можно было их просматривать.
Сами посты хранятся в базе в нескольких таблицах: 1. Таблица с постами
id | title | post | user | date | date_change | status
date - дата создания
date_change - дата последнего изменения
status - код статуса поста, пост может быть на модерации, активен, скрыт и т.д.
2. Таблица с файлами к постам
id | post_id | name | path
name - имя файла
path - путь до файла на сервере
3. Таблица для тэгов к посту
post_id | tag
Как правильно сделать механизм сохранения предыдущей версии поста?
Изменения файлов и тэгов так же должны сохраняться т.е. если какой-то файл удалили, то он так и должен остаться для устаревшей версии поста, но в новой его быть не должно.
Серверная часть реализована на PHP, при желании можно изменить структуру таблиц.
P.S. это краткая структура таблиц, там есть еще поля с информацией к постам.
DevMan: Да тут больше половины вопросов с тегом PHP, в которых нет никакого явного упоминания о PHP, но при этом тег этот указан. Почему тогда? Вот, например, на первой же странице первый попавшийся Как осуществить такой выбор?
В таблицу с постами добавить столбцы даты и состояния публикации. Первый для сортировки предыдущих версий, второй для определения, опубликован ли пост или является архивным. Ну и все архивные считать той самой устаревшей версией. При сохранении поста вместо изменения добавлять новую запись в таблицу, а предыдущей присваивать статус архивной.
Согласен, поле состояния лишнее - сортируйте вывод по дате от больших к меньшим и берите первую запись - это будет актуальный пост, все остальные - история изменений.
Я бы ввел в таблицу с постами post_id - можно приравнять к id при создании поста и post_date - дата создания\изменения поста
Все остальные таблицы имеют связь так же id как и сейчас...
1. Или сделать таблицы "истории" со структурой идентичной таблицам 1-3 + поле даты-времени или номера версии и при изменениях - перемещать туда изменяемые посты.
2. Ввести в таблицы признак "историчности" и при изменениях постов - добавлять их как новые, а у старых взводить флаг. Соответственно в отображении постов - фильтровать посты без флага
Выбор варианта зависит от возможности трогать исходные таблицы. Вариант 1 - может оказаться наиболее удобным, если хочется минимально вмешаться - достаточно просто поставить триггеры на update
Maloy123: ну тогда скорее вариант 2 с флагом историчности и отображением только "окончательных" версий постов + видимо сделать какую-то отображалку историй
d-stream: Меня больше беспокоит вопрос как это правильно записать в базу, что бы не получилось, что в одно и тоже время измененный пост отправит и пользователь и , например, модератор. Т.к. получается изменения в таблицах идут не одним запросом, а тремя. И соответственно может получится, что в актуальной версии будет часть от пользователя и часть данных от модератора.