2010-06-18 3 views
0

У меня есть база данных MySQL, где я храню информацию, введенную с веб-страницы PHP. У меня есть страница, которая позволяет пользователю просматривать существующую строку и вносить изменения и сохранять их в базе данных. Я хочу знать лучший способ сохранить исходные записи, а также новое обновление и любые последующие обновления.Как архивировать изменения в строках таблицы?

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

Таким образом, я могу выполнить запрос основной таблицы и получить самые последние данные, и я также могу запросить таблицу архива, чтобы увидеть историю изменений. Это лучший способ добиться этого, или есть лучший способ?

ответ

0

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

+0

Мне нравится эта идея. Я немного проверил, и у меня есть вопрос. В настоящее время моя таблица содержит данные, которые добавляет рецензент, а также поле состояния и пользователя. Когда пользователь сначала открывает элемент, он устанавливает статус «в процессе», а также вводит свой идентификатор. Поскольку это операторы UPDATE, они вызовут триггер. Я не хочу фиксировать эти изменения, но когда пользователь нажимает «Отправить», и он вводит данные или вносит изменения позже. Кто-нибудь имеет пример того, как запускать, когда обновляются только определенные поля? – zoidberg

0

Таблицы аудита базы данных поиска. Есть несколько методов, мне нравится столбец active, который получает значение 0 при удалении или обновлении, и новая запись вставлена. У этого есть головная боль для уникальной проверки ключа. Альтернативой, которую я использовал, является та, которую вы упомянули, отдельную таблицу.

Как говорится в buckbova, вы можете использовать триггер для вторичной вставки на 'delete' или 'update'. В противном случае вы сможете управлять им в своем PHP-коде, если у вас нет этой способности.

0

Вам не нужен второй стол. Просто укажите дату начала и окончания каждой строки. Строка без даты окончания - активная запись. Я построил целые системы, используя этот метод, и просто пока вы индексируете поля даты, это очень быстро.

При получении текущей записи AND end_date IS NULL добавляется в пункт WHERE.

0

В этой ситуации я бы рекомендовал вам рассмотреть все свойства в одной таблице после добавления несколько столбцов:

  1. активных/не активного
  2. ID человека, который держал эти параметры
  3. метки времени добавления
Смежные вопросы