Сначала вам нужно добавить набор свойств к вашим таблицам:
- Версия - время последней модификации (также может быть автоинкрементный счетчик вместо времени).
- LastModifiedBy - ссылка на пользователя, сделавшего последнее изменение (если вы его сохранили).
Тогда у вас есть несколько вариантов, как сохранить историю версий. Ты сможешь
Создайте новую таблицу для каждой из основных таблиц, для которых вы хотите сохранить историю. Эти таблицы истории будут иметь все те же поля, что и основная таблица, но первичные и внешние ключи не будут применяться. Для каждого внешнего ключа также сохраните версию записи, на которую ссылаются, на момент создания версии.
ИЛИ вы можете сериализовать все, что интересно о вашей сущности, и хранить все эти сериализованные большие двоичные объекты для всех сущностей, которые вы хотите версионировать, в одной глобальной таблице истории (лично я предпочитаю первый подход).
Как вы заполняете свои таблицы истории? Через триггеры обновления и удаления.
- В триггере обновления для вашей сущности скопируйте все предыдущие значения в таблицу истории. Для каждого внешнего ключа также скопируйте текущую версию объекта, на который делается ссылка.
- В триггере удаления - в основном сделайте то же самое.
Обратите внимание, что все больше и больше современных систем ничего НЕ удаляют. Они просто отмечают вещи как удаленные. Если вы хотите следовать этому шаблону (у которого есть несколько преимуществ) - вместо удаления добавьте флаг IsDeleted к своим объектам (конечно, вам придется везде отфильтровывать удаленные объекты).
Как вы смотрите на свою историю? Просто используйте таблицу истории, так как она имеет все те же свойства, что и основная таблица - не должно быть проблемой. Но при расширении внешних ключей убедитесь, что версия ссылочного объекта совпадает с той, которую вы храните в своей таблице истории. Если это не так, вам нужно перейти в таблицу History этого объекта, на который ссылаются, и получить там значения. Таким образом, у вас всегда будет снимок того, как объект выглядел в ЭТОТ момент, включая все ссылки.
Помимо всего вышеперечисленного - вы также можете восстановить состояние вашей сущности до любой предыдущей версии.
Обратите внимание, что эта реализация, хотя и проста, может занимать некоторое пространство, поскольку она сохраняет моментальный снимок, а не только внесенные изменения. Если вы хотите просто сохранить изменения - в триггере обновления вы можете определить, какие поля были изменены, сериализовать их и сохранить в таблице глобальной истории. Таким образом, вы можете хотя бы показать в пользовательском интерфейсе, что было изменено и кем (хотя у вас могут возникнуть проблемы с возвратом к какой-либо предыдущей версии).
person
Evk
schedule
27.05.2016
EF
), который можно использовать в качестве основы для корпоративного приложения (относительно действия удаления и отношений m-m) - person Anyname Donotcare   schedule 25.05.2016