Как отслеживать изменения в записи, охватывающей несколько таблиц
-
28-09-2020 - |
Вопрос
Передо мной стоит задача разработать новую базу данных с использованием СУБД, точнее Oracle.В этой базе данных будет одна конкретная запись/документ, который может охватывать несколько таблиц.
С минимальным дублированием я хочу отслеживать изменения, внесенные в эту запись, и предложить простой способ создания измененных копий этой записи.
я не хочу история таблица, которая будет суммировать изменения в тексте, потому что я хочу иметь возможность получить document x
именно так, как это выглядело time t
.Но я также не хочу иметь полную копию для каждой записи истории.
Здесь лучшие практики или шаблоны как этого добиться?
У меня может быть идея, как решить эту проблему, используя стратегию, имитирующую git
, но прежде чем идти по этому пути, мне хотелось бы получить некоторые мнения.
Решение
В частности, в Oracle 12c есть новая функция, называемая «временные флэшбэк-запросы», которая служит именно этой цели.(Аналогичные функции доступны и в других базах данных:DB2, SQL Server, Vertica и это лишь некоторые из них.)
Чтобы включить временные запросы, вы:
- Убедитесь, что каждая из таблиц, представляющих ваш документ, имеет пару дат, указывающих дату начала и окончания (время), когда конкретная запись была действительной (активной), и
- Сохраняйте исторические записи, не обновляя их на месте, а добавляя новые версии записей, обновляя только даты окончания исторических записей.
После этого вы сможете отправлять запросы к вашим таблицам, которые очень похожи на SELECT whatever FROM mytable AS OF some_date
, который вернет записи, которые были активны на указанную дату.
Вы можете прочитать подробное описание здесь.