Подтвердить что ты не робот

Версии баз данных с сохраненными объектами, как бы вы?

(Не связано с версией схемы базы данных)

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

Для какого-либо объекта арбитражного домена, как бы вы разработали схему базы данных для обработки этого требования? Любой опыт для обмена?

4b9b3361

Ответ 1

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

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

Кроме того, Changed Data Capture проще для системы текущего состояния с внесением изменений в записи - первичные ключи записей не изменяется, поэтому вам не нужно сопоставлять записи, содержащие разные версии одного и того же объекта вместе. Эффективный механизм CDC сделает процесс инкрементной складской нагрузки довольно легким и может работать довольно часто. Если вам не требуется мгновенное отслеживание исторического состояния (почти, но не совсем и оксюморон), это может быть эффективным решением с гораздо более простой базой кода, чем полный механизм отслеживания истории, встроенный непосредственно в приложение.

Ответ 2

Метод, который я использовал для этого в прошлом, заключался в том, чтобы иметь концепцию "поколений" в базе данных, каждое изменение увеличивает текущий номер поколения для базы данных - если вы используете subversion, подумайте об изменениях. Каждая запись имеет два связанных с ней номера генерации (2 дополнительных столбца на таблицах) - генерация, для которой запись начинает действовать, и генерация, для которой она перестает быть действительной. Если данные в настоящее время действительны, вторым номером будет NULL или какой-либо другой общий маркер.

Итак, чтобы вставить в базу данных:

  • увеличить номер поколения
  • вставить данные
  • укажите время жизни этих данных с действительным значением и допустимым значением NULL

Если вы обновляете некоторые данные:

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

удаление - это всего лишь вопрос маркировки данных как завершающихся в текущем поколении.

Чтобы получить конкретную версию данных, найдите, какое поколение вам нужно, и найдите данные, действующие между этими версиями поколения.

Пример:

Создайте человека.

|Name|D.O.B  |Telephone|From|To  |
|Fred|1 april|555-29384|1   |NULL|

Обновить номер телефона

|Name|D.O.B  |Telephone|From|To  |
|Fred|1 april|555-29384|1   |1   |
|Fred|1 april|555-43534|2   |NULL|

Удалить fred:

|Name|D.O.B  |Telephone|From|To  |
|Fred|1 april|555-29384|1   |1   |
|Fred|1 april|555-43534|2   |2   |

Ответ 3

Альтернативой строгому управлению версиями является разделение данных на 2 таблицы: текущий и исторический.

Текущая таблица содержит все данные в реальном времени и имеет преимущества всей производительности, которую вы создаете. Любые изменения сначала записывают текущие данные в связанную таблицу "история" вместе с маркером даты, который говорит, когда он изменился.

Ответ 4

Если вы используете Hibernate JBoss Envers, это может быть вариант. Вам нужно только аннотировать классы @Audited, чтобы сохранить их историю.

Ответ 5

Вам понадобится основная запись в главной таблице, которая содержит информацию, общую для всех версий.

Затем каждая дочерняя таблица использует главную запись id + version no как часть первичного ключа.

Это можно сделать без основной таблицы, но, по моему опыту, это будет иметь тенденцию усложнять высказывания SQL.

Ответ 6

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

Ответ 7

ZoDB + ZEO реализует базу данных на основе изменений с полным откатом в любой момент времени. Пойдите, проверьте это.

Плохая часть: она привязана к Zope.

Ответ 8

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

Когда мы используем управление версиями, hibernate вставляет номер версии в ноль, когда когда-либо объект сохраняется в базе данных впервые. Более поздний спящий режим автоматически увеличивает эту версию автоматически, когда модификация выполняется на этом конкретном объекте. Чтобы использовать эту концепцию управления версиями, нам нужны следующие два изменения в нашем приложении:

Add one property of type int in our pojo class.

In hibernate mapping file, add an element called version soon after id element