Базовый контроль версий для таблицы MySQL - PullRequest
4 голосов
/ 08 ноября 2010

Я пытаюсь настроить (я думал) довольно простую систему управления версиями для статических html-страниц на сайте. Цель состоит в том, чтобы сохранить предыдущие версии содержимого, а затем восстановить их при необходимости (я полагаю, что в основном создаю новую версию, дублирующую старую), и при необходимости выкинуть данные, более старые, чем версии X назад.

Настройка таблицы довольно проста:

  • ID
  • reference_id (строка / используется для определения того, к какой странице относится элемент)
  • содержание (объем данных документа / html-страницы)
  • e_user (пользователь, который изменил его последним)
  • e_timestamp (когда он был изменен)

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

Какой лучший способ для этого? Должно ли все быть в одной таблице или распределено по нескольким разным?

Я прочитал несколько страниц на эту тему, но многие из них казались излишними из-за того, что я пытаюсь достичь (например, http://www.jasny.net/articles/versioning-mysql-data/)

Существуют ли какие-либо платформы / руководства, которые помогут мне в этом начинании?

Ответы [ 3 ]

5 голосов
/ 08 ноября 2010

В идеале вы хотели бы, чтобы все в одной таблице с чем-то в вашем запросе получало правильную версию, однако вы должны быть осторожны, как это сделать, так как неэффективный запрос создаст дополнительную нагрузку на ваш сервер.Если обычно, вы бы выбрали один элемент, подобный этому:

SELECT * FROM your_table WHERE id = 42

Затем он станет:

SELECT * FROM your_table
WHERE id = 42 
AND date < '2010-10-12 15:23:24'
ORDER BY date DESC
LIMIT 1

Индекс (id, e_timestamp), чтобы позволить этому эффективно выполнять.

Выбор нескольких строк в одном запросе более сложный и требует группового подхода, но это может быть сделано.

4 голосов
/ 08 ноября 2010

Вы можете использовать технику, называемую «одитинг». Вы бы настроить аудит таблицы. Затем вы либо записали бы его в свой код, либо установили триггеры на стороне БД, чтобы каждый раз, когда вносилось изменение, запись добавлялась в соответствующую таблицу аудита. Затем вы можете вернуться к таблице аудита и увидеть такие вещи, как: "О, вчера Сью вошла и исправила опечатку" «О-о, Стив случайно вычеркнул целый абзац ранее сегодня, пытаясь переписать этот раздел»

Ваша основная таблица, в которой хранятся данные, не хранит все эти данные, поэтому она может оставаться тонкой. Если вам когда-нибудь понадобится взглянуть на эти данные и сказать «откатить назад», вы можете посмотреть в своей таблице аудита и сделать это. Вы можете настроить таблицу аудита так, как вы хотите, чтобы каждая строка аудита могла иметь весь контент ДО редактирования, а не только то, что было отредактировано. Это должно сделать "откат" довольно легким.

1 голос
/ 08 ноября 2010

Добавьте столбец версии и столбец удаления (bool) и создайте некоторые функции, которые сравнивают версии строк с одинаковым идентификатором.Вы определенно хотите иметь возможность легко найти текущую версию и предыдущую версию.Чтобы избавиться от данных, вам нужно написать другую функцию, которая сортирует все версии id, определяет, какие версии достаточно стары, чтобы их удалить, и помечает их для удаления другой функцией.Возможно, вы захотите иметь возможность сделать определенные страницы невосприимчивыми к удалению или отложить их.

...