Я создаю хранилище данных для своей компании. Недавно я только что осознал, что в моей реализации измерения SCD типа 2 есть некоторые дыры (потенциально очень опасные), так что я должен их пересмотреть.
Текущая «исходная дата» таблицы измерений SCD типа 2 - это дата, когда она поступила в хранилище данных, или дата, когда она заменила старую запись, а «текущая дата» обычно равна нулю, или дата новой записи с таким же Естественный ключ пришел на замену старой записи.
В настоящее время при загрузке факта я получаю суррогатный ключ для этого факта, используя естественный ключ и условие iscurrent = true или todate = null.
Я просто понимаю, что это не гарантирует правильность суррогатного ключа на самом деле, например:
Что, если изменение произошло в 11:00. Это означает: половина транзакций, совершенных в течение этого дня, будет связана со старой записью измерения, но половина из них будет связана с новой записью измерения. Но когда данные поступают в хранилище данных, все транзакции этого дня будут рассматриваться как связанные с новым измерением, а это неверно.
Если мы используем дату и время транзакций для более точного получения суррогатного ключа, то при загрузке записей фактов в хранилище данных вся транзакция, которая произошла до того дня, когда измерение поступит в хранилище данных, не сможет найти никакого связанного суррогатного ключа измерения. к нему. Например: я создал таблицу измерений вчера, поэтому вся дата начала в этой таблице измерений SCD 2 будет иметь минимальное значение вчерашнего дня, в то время как почти все старые транзакции (которые не были загружены в хранилище данных) произошли раньше. тот день. Таким образом, у них не будет суррогатного ключа. Такой парадокс.
Я даже пытаюсь сделать его более точным, консолидируя дату начала строки, пытаясь передать дату создания этой строки измерения в системе OLTP. Но до сих пор не могу найти наиболее правильный способ сделать это. Во-первых, дата и время в хранилище данных и в системе OLTP различаются (потому что они могут принадлежать разным GMT + X) ...
И многие другие проблемы .....
Я понимаю, что если мы хотим отслеживать историю с совершенно точной точностью, единственный способ - это реализовать ее в системе OLTP, напрямую записывая связанный объект в записи транзакции. Хранилище данных не может этого сделать. Но я все еще чувствую, что в концепции SCD 2 слишком много дыр или что я неправильно реализовал систему SCD Typ2 2. Поэтому, пожалуйста, научите меня, нормальны ли вышеуказанные проблемы, или укажите на ошибку в моем понимании.