Как создать таблицу фактов истории?
У меня есть несколько объектов в моем хранилище данных:
Person - с атрибутами personId, dateFrom, dateTo и другими, которые могут быть изменены, например, фамилия, дата рождения и т. Д. - медленно меняющееся измерение
Document - идентификатор документа, номер, тип
Address - addressId, город, улица, дом, квартира
Отношения (Персона и Документ) - "Один ко многим", а (Персона и Адрес) - "Многие ко многим".
Моя цель - создать таблицу фактов истории, которая может ответить на следующие вопросы:
- Какие лица с какими документами проживали по указанному адресу на определенную дату?
2. Какая история резидентов имеет определенный адрес в определенный интервал времени?
Это не только для того, для чего разработан DW, но я думаю, что это самая сложная вещь в дизайне DW.
Например, мисс Браун с personId=1, документы с documentId=1 и documentId=2 жили по адресу с addressId=1 с 01.01.2005 по 02.02.2010, а затем перемещались в addressId=2, где был проживает с 03/03/2010 по настоящее время (NULL?). Но она поменяла фамилию на миссис Грин с 04/05/2006 и ее первый документ с documentId=1 на documentId=3 с 06/07/2007. Мистер Блэк с personId=2, documentId=4 проживал по адресу addressId=1 с 02/03/2010 по настоящее время.
Ожидаемый результат по нашему запросу для вопроса 2, где addressId=1 и интервал времени с 01.01.2000 г. по настоящее время, должен быть таким:
Ряды:
last_name="Brown", documentId=1, dateFrom=01/01/2005, dateTo=04/04/2006
last_name="Brown", documentId=2, dateFrom=01/01/2005, dateTo=04/04/2006
last_name="Green", documentId=1, dateFrom=04/05/2006, dateTo=06/06/2007
last_name="Green", documentId=2, dateFrom=04/05/2006, dateTo=06/06/2007
last_name="Green", documentId=2, dateFrom=06/07/2007, dateTo=02/01/2010
last_name="Green", documentId=3, dateFrom=06/07/2007, dateTo=02/01/2010
last_name="Black", documentId=4, dateFrom=02/03/2010, dateTo=NULL
У меня была идея создать таблицу фактов с составным ключом (personId, documentId, addressId, dateFrom), но я понятия не имею, как загрузить эту таблицу и затем получить ожидаемый результат с этой структурой.
Буду рад любой помощи!
1 ответ
Интересный вопрос @Argnist!
Итак, чтобы создать общий язык для моего примера, вы хотите
- DimPerson (PK=kcPerson, ключ suggorate для уникальных Persons=kPerson, тип 2 dim)
- DimDocument (PK = kcDocument, суггоратный ключ для уникальных документов =kDocument, тип 2 dim)
- DimAddress (PK = kcAddress, ключ suggorate для уникальных адресов =kAddress, тип 2 dim)
Коллега написал короткий блог об использовании двух суррогатных ключей, чтобы объяснить вышеперечисленные пункты " Использование двух суррогатных ключей в измерениях".
Я всегда добавлял бы DimDate с PK в форме yyyymmdd в любое хранилище данных с дополнительными столбцами атрибутов.
Тогда вы будете иметь свою таблицу фактов как
- FactHistory (FKs=kcPerson, kPerson, kcDocument, kDocument, kcPerson, kPerson, kDate) плюс любые дополнительные меры.
Затем, присоединившись к "kc", вы можете показать информацию о текущем измерении Person/Document/Address. Если вы присоединились к "k", вы можете отобразить историческую информацию об измерениях "Человек / Документ / Адрес".
Недостатком этого является то, что эта таблица фактов нуждается в одной строке для каждой комбинации человек / документ / адрес / дата. Но на самом деле это очень узкая таблица, так как в таблице просто есть несколько внешних ключей.
Преимущество этого в том, что вы можете легко задавать вопросы, которые вы задавали.
В качестве альтернативы вы могли бы иметь свою таблицу фактов как
- История фактов (FKs=kcPerson, kPerson, kcDocument, kDocument, kcPerson, kPerson, kDateFrom, kDateTo) плюс любые дополнительные меры.
Это, очевидно, намного более компактно, но запрос становится более сложным. Вы также можете просмотреть таблицу Fact, чтобы упростить запрос!
Выбор решения зависит от частоты изменения данных. Я подозреваю, что это не изменится так быстро, поэтому альтернативный дизайн таблицы фактов может быть лучше.
Надеюсь, это поможет.