Как создать контрольный журнал для совокупных корней?

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

Я вижу, как это будет хорошо работать для простых сущностей, данные которых содержатся в одной таблице.

А как насчет совокупных корней, содержащих потомков?

Пример:

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

tblOrders --> Trigger --> tblOrdersAudit
tblOrderLines --> Trigger --> tblOrderLinesAudit

Теперь предположим, что мы что-то меняем в Заказе, но не вносим изменений ни в одну из его Строк Заказов. В результате обновляется tblOrders, а триггер вставляет новую запись аудита, отражающую изменения в tblOrdersAudit. Однако в tblOrderLines не было внесено никаких изменений, и в результате в tblOrderLinesAudit нет соответствующей записи аудита.

Некоторое время спустя мне нужно увидеть более раннее состояние Ордена, возможно, для отката данных. Как согласовать записи аудита?


person Casey Wilkins    schedule 14.05.2011    source источник
comment
Я не уверен, что понимаю. Кажется, это работает так, как задумано. Не должно быть записей аудита для tblOrderLines, так как ничего не изменилось, верно? Вам по какой-то причине нужна запись аудита для tblOrderLines? Что бы он сказал?   -  person IAmTimCorey    schedule 14.05.2011
comment
Я недостаточно хорошо это объясняю. Если мне нужно вернуться в какой-то момент времени и увидеть снимок Ордера, мне нужны соответствующие Строки Ордера, чтобы присоединиться к нему. Я загружаю запись аудита для заказа ... как мне узнать, какая запись аудита OrderLine идет с ним, чтобы состояние всего агрегата было действительным?   -  person Casey Wilkins    schedule 14.05.2011
comment
Хорошо, я понимаю, о чем вы говорите. Посмотрите ответ от @YetAnotherUser, чтобы узнать ответ. По сути, вы выполняете откат к моменту времени, а не пытаетесь связать архивные таблицы друг с другом.   -  person IAmTimCorey    schedule 14.05.2011
comment
@BiggsTRC Прочтите мой комментарий к нему о незнании Т-1. Я, вероятно, недостаточно хорошо объяснил это, но на самом деле я ищу возможность воссоздать каждое состояние, в котором находился агрегат с момента его создания. Это позволило бы мне увидеть, где возникла проблема, и, возможно, исправить данные. Надеюсь, это имеет смысл, мне действительно не стоит задавать вопросы так поздно после того, как весь день ломал голову :)   -  person Casey Wilkins    schedule 14.05.2011


Ответы (2)


В случае отката, разве вы не будете делать это на основе таблицы? Предположим, что единственное изменение, которое когда-либо было внесено в базу данных, произошло с момента, когда T-1 был обновлением tblOrders. В таком случае

  1. tblOrders будет откат к моменту T-1: значения аудита будут использоваться, чтобы вернуть tblOrders к тому состоянию, которое было в момент T-1.

  2. tblOrdersLines будет откат к моменту T-1: в tblOrdersLineAudit нет записи и, следовательно, ничего не будет обновлено.

В конце концов, ваши столы находятся в том же состоянии, в котором они были в T-1.

Несколько ссылок для получения дополнительной информации -

person YetAnotherUser    schedule 14.05.2011
comment
Я согласен с этим, но что, если я не знаю время Т-1? Например, я знаю, что с Заказом что-то не так (пользователь ввел неверные данные и т. Д.). Мне нужно увидеть список изменений состояния, через которые прошел агрегат, чтобы я мог видеть, где возникла проблема. Могу ли я воссоздать каждое состояние агрегата с момента его создания из двух таблиц аудита? Извините, если это не имеет смысла, трудно точно объяснить, о чем я думаю. - person Casey Wilkins; 14.05.2011
comment
@Casey: Да, вы сможете воссоздать каждое состояние. Помните, что в вашем сценарии вы будете использовать таблицы аудита для воссоздания основных таблиц, но для просмотра данных в определенное время вы посмотрите на свои основные таблицы. - person YetAnotherUser; 14.05.2011
comment
@Casey: Я предполагаю, что у вас будут метки времени как в основной таблице, так и в таблице аудита, чтобы поместить их на единую временную шкалу. Что, вероятно, будет полезно, так это если вы попытаетесь создать сценарий, скажем, в Excel, и посмотрите, как меняются данные и как выглядят разные таблицы. Это прояснило бы многие ваши сомнения. - person YetAnotherUser; 14.05.2011

Некоторое время спустя мне нужно увидеть более раннее состояние Ордена, возможно, для отката данных. Как согласовать записи аудита?

Непросто, как вы правильно определили.

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

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

person Denis de Bernardy    schedule 14.05.2011