В SQL Server 2008+ мы хотели бы включить отслеживание исторических изменений в таблице «Клиенты» в рабочей базе данных.
Это новая таблица, и наше приложение контролирует всю запись в базу данных, поэтому нам не нужны злые хаки, такие как триггеры. Вместо этого мы встроим отслеживание изменений в наш уровень бизнес-объектов, но нам нужно определить правильную схему базы данных для использования.
Количество строк будет меньше 100 000, а количество изменений на запись будет составлять в среднем 1,5 в год.
Есть как минимум два способа моделирования этого:
В виде таблицы медленно изменяющегося измерения типа 2 называется
CustomersHistory
со столбцами дляEffectiveStartDate
,EffectiveEndDate
(установлено значениеNULL
для текущей версии клиента) и столбцами аудита, такими какChangeReason
иChangedByUsername
. Затем мы создадим представлениеCustomers
для этой таблицы, которая отфильтрована доEffectiveEndDate=NULL
. Большинство частей нашего приложения будут запрашивать с использованием этого представления, и только части, которые должны учитывать историю, будут запрашивать базовую таблицу. Для повышения производительности мы могли бы материализовать представление и/или добавить отфильтрованный индекс для EffectiveEndDate=NULL.С отдельной таблицей аудита. Каждое изменение записи
Customer
записывается один раз в таблицуCustomer
и еще раз в таблицу аудитаCustomerHistory
.
Судя по быстрому обзору вопросов StackOverflow, № 2 кажется гораздо более популярным. Но связано ли это с тем, что большинству приложений БД приходится иметь дело с устаревшими и мошенническими авторами?
Учитывая, что мы начинаем с чистого листа, каковы плюсы и минусы того или иного подхода? Что бы вы порекомендовали?
CustomersCurrentView WHERE Customer = 'John Doe' JOIN CustomersHistory JOIN Transactions
. Мое предложение: если исторические данные используются нечасто, храните их в наборе отдельной таблицы аудита; используйте SCD 2 только в том случае, если компоненты, учитывающие историю, составляют важную часть приложения. +1 за очень интересный вопрос! - person Marek Grzenkowicz   schedule 24.06.2014