Я создаю хранилище данных бедного человека с помощью RDBMS. Я определил ключевые 'атрибуты', которые будут зарегистрированы как:
Мои требования состоят в том, чтобы смочь выполнить запросы 'OLAP', которые позволяют мне:
После чтения на этом тематическом охвате, общее согласие, кажется, что это лучше всего реализовано с помощью таблиц измерений, а не нормализованных таблиц.
При предположении, что это утверждение верно (т.е. решение лучше всего реализован с помощью таблиц фактов и таблиц измерений), я хотел бы искать некоторую справку в дизайне этих таблиц.
'Естественный' (или очевидный) размеры:
Которые имеют иерархические атрибуты. Однако я борюсь с тем, как смоделировать следующие поля:
Причина я борюсь с этими полями, состоит в том что:
Возможно, эвристика, которую я использую выше, слишком сыра?
Я дам некоторые примеры на типе анализа, который я хотел бы к выходному сигналу переноса на хранилище данных - надо надеяться, который разъяснит вещи далее.
Я хотел бы агрегировать и проанализировать данные сексуальной и демографической классификацией - например, ответить на вопросы как:
и т.д.
Может любой разъясняться, является ли сексуальная и демографическая классификация частью таблицы фактов, или являются ли они (как я подозреваю), таблицы измерений.?
Также принятие они - таблицы измерений, кто-то мог уточнить структуры таблиц (т.е. поля)?
'Очевидная' схема:
CREATE TABLE sex_type (is_male int);
CREATE TABLE demographic_category (id int, name varchar(4));
может не быть корректный.
Не понимаю, почему вы считаете, что использование СУБД - плохое решение, но надеюсь, что это может помочь.
Таблицы dimGeography и dimDemographic являются так называемыми мини-измерениями; они позволяют выполнять срезы на основе демографических и географических данных без необходимости присоединяться к dimUser, а также фиксировать текущие демографические и географические данные пользователя на момент измерения.
И, кстати, в мире DW, подробный - Gender = 'female', AgeGroup = '30-35 ', EducationLevel =' University 'и т. Д.
Как правило, все числовые величины и меры являются столбцами в таблицах фактов. Тогда все остальное - размерный атрибут. К какому измерению они принадлежат, довольно прагматично и зависит от данных.
В дополнение к предложениям, которые вы уже получили, я не видел упоминания о вырожденных измерениях. В этих случаях такие вещи, как номер счета-фактуры или временная метка порядкового номера, которая различается для каждого факта, должны быть сохранены в факте, иначе таблица измерений станет 1-1 с таблицей фактов.
Ключевым дизайнерским решением в вашем случае, вероятно, является анализ данных, связанных с возрастом, если исследование продолжается. Поскольку возраст людей меняется со временем, в какой-то момент они перейдут в другую возрастную группу. В зависимости от того, зафиксированы ли группы в начале исследования или нет, это может определить, как вы хотите агрегировать.Я не обязательно говорю, что у вас должно быть групповое измерение, и вы должны достичь возраста через него, но вам может потребоваться определить правильный возраст / демографический аспект во время ETL. Но это зависит от конечного использования (или совместимость с двумя ролями измерения, связанными из таблицы фактов - исходная демография, которая никогда не меняется, и текущая демография, которая будет меняться со временем).
То же самое можно сказать и о географии. Хотя вы, очевидно, можете отслеживать географию человека, анализируя текущие географические изменения с течением времени, суть размерного DW состоит в том, чтобы все соответствующие измерения были напрямую связаны с фактом (то, что вы обычно можете получить в нормализованной модели через сеть Модель Entity-Relationship - они заблокированы во время ETL). Эта избыточность ускоряет анализ размерной модели в традиционных СУБД.
Обратите внимание, что многое из этого не применяется в массивно-параллельных DW, таких как Teradata, которые плохо работают со звездообразными схемами - им нравятся все данные, нормализованные и связанные с одним и тем же первичным индексом, потому что они являются первичным индексом для распределения. данные по блокам обработки.
Поиск по звездной схеме - это SQL-эквивалент точек пересечения диаграмм Венна. Как ясно видно из ваших примеров запросов, SEX_TYPE и DEMOGRAPHIC_CATEGORY - это наборы, по которым вы хотите искать, и, следовательно, они должны быть размерными.
Что касается структур таблиц, я думаю, что ваш дизайн для SEX_TYPE ошибочен. Для начала, проще и интуитивно понятнее разрабатывать запросы на основе
where sex_type.name = 'FEMALE'
чем
where sex_type.is_male = 1
Кроме того, в реальном мире пол не является булевой величиной. Большинство приложений должны также собирать UNKNOWN и TRANSGENDER, и это, конечно, верно для приложений для здоровья/медицины, что вы, похоже, и делаете. Кроме того, это позволит избежать неприятных споров в офисе, если у вас есть коллеги-женщины.
Редактировать
"Я думаю о том, как справиться с случаями новых типов_пола и демографических категорий, которых еще нет в в базе данных"
Была мода на отказ от внешних ключей в Хранилищах данных. Но они предоставляют полезные метаданные, которые оптимизатор запросов может использовать для выработки наиболее эффективного пути поиска. Это особенно важно, когда нужно обработать большое количество данных и специальных запросов. Работа с новыми значениями размерности всегда будет сложной, если только ваши исходные системы не предоставят вам уведомление. Это действительно зависит от вашей установки.
Какой OLAP / инструмент уровня представления вы собираетесь использовать? Они часто имеют собственные функции для поддержки построения кубов, иерархий, агрегаций и т.д.
Нормальная форма обычно является наиболее надежной основой для гибкого и эффективного Хранилища данных, хотя Марты иногда денормализуются для поддержки определенного набора требований к отчетности. В отсутствие какой-либо другой информации я предлагаю вам стремиться к тому, чтобы ваша база данных находилась, по крайней мере, в нормальной форме Бойса-Кодда / 5-й нормальной форме.