Все три подхода жизнеспособны и имеют одинаковую производительность в зависимости от скорости вашей сети, но каждый из них вызовет много головной боли в системе с множеством одновременных пользователей.
Поскольку вы будете вставлять / обновлять несколько таблиц в одной транзакции с совершенно другим шаблоном доступа (исходная таблица является случайной, таблица истории является последовательной), вы получите блокировку и / или взаимоблокировку.
Если существующая схема таблицы не может быть изменена
Если вы хотите иметь систему истории, управляемую вашей базой данных, в идеале вы поставите свои обновления в очередь, чтобы избежать проблем с блокировкой.
- Запустить триггер при обновлении таблицы
- Триггер отправит сообщение, содержащее информацию из вставленных / удаленных таблиц, в Компонент SQL Server Service Broker Очередь
- Хранимая процедура активации может извлечь информацию из очереди и записать ее в соответствующую таблицу истории
- При сбое новое сообщение отправляется в «очередь ошибок», где механизм повторных попыток может повторно отправлять исходную очередь (убедитесь, что в сообщение включен счетчик повторов)
Таким образом, ваши обновления истории будут неблокирующими и не могут потеряться.
Примечание: при работе с брокером SQL Server Service убедитесь, что вы полностью понимаете концепцию «Ядовитое сообщение».
Если существующая схема таблицы может быть изменена
Когда это опция, я рекомендую работать с системой «Управление версиями записей», в которой каждое обновление будет создавать новую запись, и ваше приложение будет правильно запрашивать самую последнюю версию данных. Чтобы обеспечить надлежащую производительность, таблицу можно разбить на части, чтобы сохранить самые последние версии данных в разделе и более старые версии в разделе архива. (У меня обычно есть поле end_date
или expiration_date
, которое установлено на 9999/12/31
для текущей действующей записи.)
Этот подход, конечно, требует значительных изменений кода в вашей модели данных и существующем приложении, что может быть не очень экономичным.