Какова наилучшая архитектура для отслеживания изменений полей на объектах?

У нас есть веб-приложение, построенное на базе данных SQL. Некоторые из этих объектов нуждаются в отслеживании на уровне полей, аналогичном тому, как отслеживаются изменения полей в большинстве систем отслеживания проблем (например, статус, назначение, приоритет). Мы хотели бы показать, кем является изменение, каким было Предыдущее значение и какое новое значение.

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

7 ответов


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

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

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

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

Итак, вы могли бы:

Problem_Ticket (ticket_id, ticket_name) Problem_Ticket_History (ticket_id, change_datetime, описание, комментарий, имя пользователя)

кроме того, вы можете использовать:

Problem_Ticket (ticket_id, ticket_name) Problem_Ticket_Comments (ticket_id, change_datetime, комментарий, имя пользователя) Problem_Ticket_Statuses (ticket_id, change_datetime, status_id, username)


Я не уверен в конкретном подходе "отслеживания проблем", но я бы не сказал, что есть один окончательный способ сделать это. Есть несколько вариантов для этого, каждый из которых имеет свои преимущества и недостатки как показано здесь.

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

одно часто упускаемое решение можно использовать Изменить Захват Данных. Это может дать вам больше экономии места / производительности, если вы действительно обеспокоены.

удачи.


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


вот решение, которое я бы рекомендовал для достижения вашей цели.

дизайн вашего аудит модели как показано ниже.



  ----------------  1      *  ------------                       
 | AuditEventType |----------| AuditEvent |                      
  ----------------            ------------                       
                                | 1    | 1                       
                                |      |                         
               -----------------        -------------            
              | 0,1                                  | +         
    -------------------                       ----------------   
   | AuditEventComment |                     | AuditDataTable |  
    -------------------                       ----------------   
                                                     | 1         
                                                     |           
                                                     |           
                                                     | +         
          -----------------  +             1  --------------     
         | AuditDataColumn |------------------| AuditDataRow |   
          -----------------                   --------------     



.

AuditEventType

содержит список всех возможных типов событий в системе и общее описание для них.

.

AuditEvent

содержит информацию о конкретном даже том, что triggerd это действие.

.

AuditEventComment

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

.

AuditDataTable

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

.

AuditDataRow

содержит список одного или нескольких определение строк в соответствующем AuditDataTable, которые были затронуты соответствующим AuditEvent

.

AuditDataColumn

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

.

AuditBuilder

реализовать AuditBuilder (шаблон Builder). Создайте экземпляр в начале события и сделайте его доступным в запросить контекст или передать его вместе с другими DTO. Каждый раз, когда вы вносите изменения в данные, вызывайте соответствующий вызов AuditBuilder, чтобы уведомить его об этом изменении. В конце вызовите build () на AuditBuilder для формирования структуры выше, а затем сохраните ее в базе данных.

убедитесь, что все ваши действия на событие в одной транзакции БД с сохранением данных аудита.


Я не понимаю фактических сценариев использования для проверенных данных... вам нужно просто следить за изменениями? Вам нужно будет "откатить" некоторые изменения? Как часто (и гибко) вы хотите, чтобы отчет журнала аудита/поиск был?

лично я бы расследовал что-то подобное:

Создать AuditTable. Это имеет идентификатор, номер версии, идентификатор пользователя и поле clob.

  • при создании объекта #768795 добавьте строку в AuditTable, с значениями: Id=#768795 Версия:0 User: (Id пользователя, создавшего новый объект) clob: xml-представление всего объекта. (если пространство является проблемой, и доступ к этой таблице не часто, вы можете использовать blob и "zip" xml-представление на лету).

каждый раз, когда вы что-то меняете, создайте новую версию и сохраните весь объект "сериализованным" как XML Если вам нужно создать журнал аудита, у вас есть все, что вам нужно, и вы можете использовать простой " текст сравните " инструменты или библиотеки, чтобы увидеть, что изменилось во времени (немного похоже на Википедию).

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


Я знаю, что этот вопрос очень старый, но другая возможность, которая встроена в sql ИЗМЕНЕНИЯ ТРЕКА:

вы можете найти более подробную информацию по этой ссылке: Введение в изменение системы сбора данных (CDC) в SQL Server 2008 http://www.simple-talk.com/sql/learn-sql-server/introduction-to-change-data-capture-(cdc)-in-sql-server-2008/


Я думаю, что Observer является идеальным шаблоном в этом сценарии.