итак, есть что-то. Например товар в инет-магазине. И тут кто-то из администраторов меняет некоторые параметры этого товара (объем микроволновой печи модели SGD-300 изменен с 25л на 26, поднимает цену на 10$, добавляет возможные варианты цветов). Хочется, что бы была история версия (как на Педивикии, svn/mercurial), а именно было видно кто, когда и какие параметры менял, была б возможность откатиться. Как обычно реализуются такие задачи? А Можно делать дополнительные таблицы, в которых будут "неактивные" товары, с указанием версий Б делать сериализованный массив Кто-то да наверняка сталкивался с этой задачей, расскажите плизз, как решили ее.
Лучше просто вести журнал действий администраторов. Типа Код (Text): 01/01/09 15:21 Administator_1 изменил описание и цену (исходная цена - $160) товара #23564.
В принципе, ты можешь оставить ту же таблицу отделив первичный автоинкрементный ключ в отделный столбик, и оставив id товара, и вместо ИЗМЕНЕНИЯ данных, ДОПИСЫВАТЬ еще одну запись, с тем же id товара, но соответственно, с другим ключом, т.е. по id товара можно выбрать полностью всю историю изменения товара, у текущего состояния будет максимальный id.
тут все немного сложнее. Для просмотра товара используется не 1 а около 5-6 таблиц (атрибуты, изображения и тд). То есть когда пользователь просматривает страницу информации о товаре будут обработаны эти таблицы. Уже немало. Больше строк-дольше будет происходить запрос, а тем более просмотр ченджлога нужен только администраторам (это я против хранения изменений в той же таблице, где и рабочая версия). + ко всему хочется сделать логирование изменений в атрибутах, наборах атрибутов, фразах (это уже в далеком будующем, когда будет многоязычность). Любые изменения должны логироваться с возможностью их отката. (простое журналирование событий не подходит) Поэтому, по-моему нужно копать в сторону отдельной таблицы для всех изменений, в которой будут находиться: id|user_id|timestamp|module|changes , где changes - сериализованный массив array['измененное поле таблицы'] = 'новое значение', module - таблица, которую меняли. так-то. Поправьте меня, если нужно.
Может быть так сделать Перед обновлением в основной таблице делать [sql] INSERT INTO history(id_tovar, name, date_update, ....) SELECT id, name, date_update, .... FROM tovar [/sql] А потом уже обновлять товар в основной таблице [sql] UPDATE tovar SET name=$name, date_update=$date, .... WHERE id=$id [/sql]