Здравствуйте, Michael_Y, Вы писали:
M_Y> Всем привет.
M_Y> Господа ГУРУ проектирования, нуждаюсь в вашем совете.
M_Y> Есть база данных с где-то 20 таблицами, из которых 10 справочники. База содержит данные о подразделениях компании. Есть главная таблица "Подразделение" и все остальные связаны с ней.
M_Y> Задача — вносить изменения в базу "проектами". Т.е. выбираем подразделение для редактирования, правим что хотим, сохраняем изменения в какую-то "корзинку", через пару недель возвращаемся к редактированию этого подразделения. Еще через неделю одним махом применяем изменения на базе.
M_Y> Осложняет задачу наличие информации вида "список зданий подразделения", "список фотографий каждого здания". И это тоже надо редактировать.
M_Y> Сейчас остановился на варианте заведения таблицы вида (ИД проекта, имя таблицы, имя поля, новое значение поля, операция (удаление, изменение, вставка)). Пытаюсь _красиво_ реализовать загрузку и сохранение данных в эту таблицу.
M_Y> Вариант с дублирование таблиц и тем более заведением отдельной базы для хранения изменений отбросил из соображений неэкономности и "некрасивости".
M_Y> У кого-то есть опыт реализации такой задачи? Поделитесь плиз
Добавляешь к каждой таблице 3 поля: идентификатор "длительной транзакции", код действия (запись изменена/удалена/добавлена), номер версии (таймстамп) оригинальной записи (для разрешения конфликтов)
Когда пользователь начинает транзакцию, создаёшь в спец. табличке запись с описанием этой транзакции.
Далее когда он изменяет какую-либо запись, то делаешь её копию, заполняешь идентификатор транзакции, версию оригинальной записи, код действия — изменение.
Аналогично для удаления/создания, только код действия другой.
Кодга пользователь коммитит транзакцию, то ищешь все записи, помеченные идентификатором этой транзакции, сверяешь номера версий оригинальной записи (не изменили ли её ещё) и вносишь изменение.
Соответственно надо учитывать, что при просмотре данных записи, относящиеся к транзакциям, не должны быть видны.
А при редактировании транзакции, наоборот, вместо оригинальных записей должны быть видны записи из данной транзакции.
Что бы не искать все изменённые записи относящиеся к транзакции, можно в отдельную табличку вынести пары (код таблицы, номер записи) для изменённых записей и привязать к транзакции. Тогда можно будет удобно посмотреть список всех изменений в транзакции.