Глядя на ваш комментарий к ответу Павла, я чувствую, что мне следует перезвонить сюда. У нас есть несколько таблиц, в которых мы должны хранить историю каждой записи в этой таблице. Мы реализуем это путем создания отдельной таблицы для каждого. Например, у нас может быть таблица Comment
, а затем таблица CommentArchive
с ссылкой внешнего ключа на CommentId
в таблице Comment
.
Триггер в таблице Comment
гарантирует, что при каждом обновлении определенных полей в таблице Comment
«старая» версия (доступная через таблицу deleted
в триггере) передается в CommentArchive
стол. Очевидно, это означает, что для каждого Comment
может существовать несколько записей CommentArchive
, но если вы ищете только «активные» комментарии, просто посмотрите в таблицу Comment
. И если вам нужна информация об истории комментария, вы можете легко использовать LINQ to SQL, чтобы перейти от интересующего вас комментария к комментарию, который ссылается на него.
Поскольку триггеры, которые мы используем в приведенном выше примере, вставляют только одно значение в таблицу Archive для каждого обновления, они запускаются очень быстро, и мы получаем хорошую производительность. Недавно у нас были проблемы, когда я пытался сделать триггеры более сложными, и мы начали получать взаимные блокировки всего с 15 параллельными транзакциями. Итак, урок заключается в том, что вы должны упростить эти триггеры и сделать так, чтобы они касались как можно меньшего числа строк в минимальном количестве таблиц.