Как можно разрешить управление версиями записей базы данных (данных)?
Подумайте о способностях систем управления контентом, чтобы отменить изменения статей.
Каковы их плюсы / минусы?
Как можно разрешить управление версиями записей базы данных (данных)?
Подумайте о способностях систем управления контентом, чтобы отменить изменения статей.
Каковы их плюсы / минусы?
Ответы:
Существует два основных подхода: таблица аудита, в которой хранятся все предыдущие значения, или указание даты начала / окончания как части таблицы, и все обновления создают новую запись, закрывая старую.
Обновление: SQL SERVER 2016 поддерживает это как шаблон дизайна / тип таблицы - https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017.
Одна идея состоит в том, чтобы использовать «Базы данных только для вставки». Основная идея заключается в том, что вы никогда не удаляете и не обновляете данные в строке .
Каждая таблица, которую необходимо отслеживать, будет иметь два datetime
столбца from
и to
. Они начинаются со значения NULL
в каждом (начало времени до конца времени). Когда вам нужно «изменить» строку, вы добавляете новую строку, и в то же время вы обновляете to
в предыдущей строке до Now
и from
в строке, к которой вы добавляетеNow
.
Для более подробной информации смотрите:
Этот метод призван AuditTrail
управлять устаревшими данными, и его история хранит историю изменений.
Похоже, вопрос такого рода уже опубликован:
Я думаю, что вы можете использовать триггеры для каждой таблицы и поддерживать данные в _history (или вы можете дать любое имя), и при каждой вставке, обновлении, удалении в основной таблице будет запускаться ваш триггер, и вы можете сохранить детали в этой таблице. Механизм триггера также доступна с базой данных SQLite, если вы ее используете.
Этот механизм полезен и для крупных проектов. В этой таблице вы можете записать информацию о пользователе, который внес изменения, вместе с отметкой времени изменений. Затем вы можете восстановить свою таблицу с любой отметкой времени, соответствующей вашим требованиям.
Каждая база данных имеет свой собственный способ записи и кодирования триггеров. Если вы используете SQLite, посетите SQLite.org для синтаксиса. Для других баз данных вы можете посетить их официальные сайты.
Вы, наверное, знаете о двигателе Sqlite . Вся БД сохраняется в одном файле. API также поддерживает виртуальные файловые системы, поэтому в основном вы можете организовать хранилище в любом месте и в любом формате, просто реагируя на операции чтения и записи при определенных смещениях файлов. Возможными приложениями для этого могут быть шифрование, сжатие и так далее. Самое приятное, что контейнерный уровень не должен ничего знать о базах данных, форматах файлов sql или sqlite, просто подчиняется обратным вызовам xRead и xWrite.
Одной из идей было реализовать функцию машины времени. Таким образом, любая операция xWrite сохраняет каждый сегмент, который она будет перезаписывать в истории «отмены», и пользователь может выбрать дату в прошлом, чтобы увидеть, что содержится в БД (возможно, только для чтения). Я не работаю уже пример еще (была дискуссия об этом в SQLite списке почты), но , возможно , другие двигатели поставляют VFS API , так что- то подобное возможно. И как только он будет реализован, он должен быть совместим со структурами базы данных любой сложности.
Метод, который мы используем для управления версиями записей базы данных, заключается в использовании таблицы аудита. Таблица имеет схему в соответствии с:
Seq - Int ' Unique identifier for this table
Event - Char ' Insert / Update / Delete
TblName - Char ' Table that had field value changed
FldName - Char ' Field that was changed
KeyValue - Char ' delimited list of values for fields that make up the PK of table changed
UsrId - Char ' User who made the change
OldValue - Char ' Old value (converted to character)
NewValue - Char ' New value (converted to character)
AddTs - DateTime ' When the change was made
Затем у нас есть триггеры на вставку / обновление / удаление таблиц, которые мы хотим отслеживать.
Плюсы:
Минусы:
Я делаю версию этого сейчас. для каждой записи у меня есть дата вставки, дата изменения и логический флаг активной записи. Для начальной вставки даты Inserted и Modified установлены на Now () (этот пример в Access), а флаг активной записи установлен на true
. затем, если я изменяю эту запись, я копирую все это в новую запись, изменяя поля, которые изменяет пользователь, я оставляю дату вставки равной оригиналу и изменяю дату изменения на Now (). Затем я переворачиваю флаг активной записи исходной записи в false
и новой записи в true
. У меня также есть поле для ModifiedRecordsParentID, где я сохраняю идентичность исходной записи.
Тогда, если мне даже нужно запросить, я могу просто вернуть записи, где ActiveRecord = true
и я буду получать только самую последнюю информацию.
ActiveRecord
флага. Строка MAX (*) всегда должна быть текущей записью. Восстановление предыдущей версии просто вставляет указанную строку в таблицу снова.
select top 1 order by id descending
подойдет.
Кроме того, если вы хотите сохранить ВСЕ изменения в БД с течением времени, вы можете проверить ведение журнала ( /programming/3394132/where-can-i-find-the-mysql-transaction-log )