Способы реализации управления версиями данных в PostreSQL

Можете ли вы поделиться своими мыслями о том, как реализовать внедрение версий данных в PostgreSQL. (Я задал аналогичный вопрос относительно Cassandra и MongoDB. Если у вас есть мысли, которые db лучше для этого, пожалуйста, поделитесь)

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

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

Я рассматриваю следующие подходы:

  • Создайте новую таблицу объектов для хранения истории записей с копией схемы таблицы адресной книги и добавьте временную метку и внешний ключ в таблицу адресной книги.

  • Создайте таблицу с меньшим количеством схем, чтобы сохранить изменения в записи адресной книги. Такая таблица будет состоять из: AddressBookId, TimeStamp, FieldName, Value. Таким образом, я бы сохранил только изменения в записях, и мне не пришлось бы синхронизировать таблицу таблицы истории и таблицы адресов.

  • Создайте таблицу для хранения записей в адресной книге Seralized (JSON) или изменений в записи адресной книги. Такая таблица выглядит следующим образом: AddressBookId, TimeStamp, Object (varchar). Опять же, это схема меньше, поэтому мне не нужно синхронизировать таблицу истории с таблицей адресной книги. (Это моделируется после Simple Document Versioning с CouchDB)

Ответ 1

Я делаю что-то вроде вашего второго подхода: располагайте таблицу с фактическим рабочим набором и историю с изменениями (timestamp, record_id, property_id, property_value). Это включает в себя создание записей. Третья таблица описывает свойства (id, property_name, property_type), которые помогают в преобразовании данных выше в приложении. Таким образом, вы также можете легко отслеживать изменения отдельных свойств.

Вместо метки времени вы также можете иметь int-like, который вы увеличиваете для каждого изменения на record_id, поэтому у вас есть реальная версия.

Ответ 2

У вас могут быть start_date и end_date.

Когда end_date имеет значение NULL, это фактическая запись.

Ответ 3

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

Адрес
id [pk]
fullname [uk]
день рождения [uk]

Версия
id [pk]
address_id [uk]
timestamp [uk]
адрес

Таким образом, вы получаете объекты адреса, определяемые полным именем и днем ​​рождения (не должны изменяться путем управления версиями) и версиями записей, содержащих адреса. address_id должен быть связан с адресом: id через внешний ключ. С каждой записью в таблице версий вы получите новую версию для темы Address: id = address_id с определенной меткой времени, в которой вы можете иметь ссылку на историю.