@danforth

Как хранить разные версии для каких-либо данных в БД?

Всем привет!

Предположим, у меня есть некая сущность, например транспортное средство - автомобиль. У автомобиля есть характеристики: мощность, крутящий момент, вес.

Предположим, некий пользователь добавил в базу данных какое-то новое авто, и заполнил только мощность - 100 л.с..
Спустя некоторое время, пришел другой юзер, и решил дополнить характеристики, указав крутящий момент: 200 Нм. Также, он располагает информацией, что мощность данного транспортного средства не 100 л.с., а 92 л.с., он редактирует эту информацию и нажимает кнопку "Отправить на модерацию".

Однако, пользователи продолжают видеть первую версию с мощностью 100 л.с.. На следующий день, модератор заходит в админку, и видит что для такого-то авто появилось дополнение данных, он смотрит внесенные изменения, нажимает применить, и после этого вторая версия становится актуальной, начиная с этого момента посетители сайта видят обновленную версию, а предыдущая становится неактуальной, при этом, в любой момент модератор может вернуть прошлое состояние, если данные окажутся не подтвержденными.

Эдакое подобие движка mediawiki или же постов в WordPress (если я не ошибаюсь).

Подскажите, как примерно спроектировать такую базу данных? Для версий заводить отдельную таблицу или хранить там-же и менять флаг? Может попадалось какое-то занимательное чтиво на эту тему?
  • Вопрос задан
  • 370 просмотров
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Все аттрибуты сущности храните не в таблице с сущностью, а в отдельной таблице, в которой дополнительно заводите поля: id сущности, ATTR - код аттрибута, DATEBEG - дата начала действия аттрибута, DATEEND - дата конца действия аттрибута.
При добавлении аттрибута, старый не удаляется, а просто изменяется его DATEEND, и добавляется новая запись аттрибута с DATEEND=null.
Таким образом, вы будете иметь всю историю изменений аттрибутов и можно легко откатиться на любую версию каждого конкретного аттрибута или всех аттрибутов какой-либо сущности.
Т.к. аттрибуты могут быть разных типов, то можно реализовать двумя способами:
1. 1 таблица для аттрибутов одной сущности, в которой содержаться поля для хранения значений аттрибутов всех типов. При этом заполняется только необходимое поле, остальные остаются null;
2.Несколько таблиц для аттрибутов одной сущности, по одной таблице на каждый тип данных аттрибута. Структура таблиц одинакова (возможно за исключением названия поля для значения аттрибута).
В жизни видел обе реализации, вполне приемлемо работают обе. Возможно в первом варианте будет небольшой перерасход дискового пространства за счет не используемых полей и индексов. Реализация в обоих случаях похожая.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
28 нояб. 2024, в 18:46
3000 руб./за проект
28 нояб. 2024, в 17:46
10000 руб./за проект
28 нояб. 2024, в 17:38
12000 руб./за проект