Хранить перекрывающиеся диапазоны дат для фильтрации с использованием настраиваемого диапазона дат
Мне нужна помощь относительно того, как структурировать перекрывающиеся диапазоны дат в моем хранилище данных. Моя цель - смоделировать данные таким образом, чтобы можно было выполнять фильтрацию на уровне дат в отчетах.
У меня есть размеры - DimEmployee, DimDate и факт под названием FactAttendance. Записи в этом факте хранятся следующим образом -
Чтобы представить это графически -
Из этих данных необходимо создать отчет, который позволит конечному пользователю отфильтровать его, выбрав диапазон дат. Давайте предположим, что пользователь выбирает диапазон дат от D1 до D20. Сделав этот выбор, пользователь должен увидеть значение того, сколько дней хотя бы один из сотрудников находился в отпуске. В этом конкретном примере я должен увидеть добавление голубых сегментов внизу, то есть 11 дней.
Подход, который я рассматриваю, заключается в сохранении одной строки на сотрудника на дату для каждого отпуска. Единственная проблема этого подхода заключается в том, что он будет экспоненциально увеличивать количество записей в таблице фактов. Кроме того, есть и другие столбцы, в которых будут избыточные данные.
Как такие перекрывающиеся проблемы даты / времени обычно решаются на складе? Есть ли лучший способ, который не включает в себя вставку многочисленных строк?
1 ответ
Попробуйте смоделировать свой факт следующим образом:
fact_attendance (date_id,employee_id,hours,...)
Это позволит вам ответить на исходный вопрос, просто отфильтровав измерение "Дата", но вы также сможете обрабатывать такие вопросы, как отпускные кредиты и использование неполного дневного отпуска.
Да, он может использовать немного больше места для хранения, чем ваше первое предложение, но это лучшее размерное представление и будет удовлетворять более (потенциальным) требованиям.
Если вы действительно беспокоитесь о хранилище - возможно, не очень беспокоитесь - используйте СУБД с колонным сжатием, и вы увидите большую экономию на диске.
Причина, по которой я говорю "не особо беспокоюсь" о хранилищах, заключается в том, что ваши сбережения не имеют смысла в современном мире хранилищ. 1000 сотрудников с 20-дневным отпуском каждый год, в течение пяти лет означают 100 000 строк. Ваша СУБД, вероятно, будет выполнять все соединения звезды в оперативной памяти. Даже одному миллиону сотрудников потребуется менее одного терабайта перед сжатием.