Многозначные атрибуты хранилища данных

Заявление об ограничении ответственности: я никогда раньше не создавал хранилища данных. Я прочитал несколько глав из набора инструментов хранилища данных Kimball's Data Warehouse Toolkit.

Предыстория. Управленческая группа завода (фабрики) должна иметь возможность разрезать производственную информацию различными способами, и нам нужен согласованный формат отчетности для всех производственных предприятий в нашем подразделении. Проведя бизнес-анализ, мы пришли к выводу, что зернистость составляет 1 строку на завершенный процесс. Завершенный процесс может означать «машина» или «сборка». Я называю это «производственным фактом».

Бизнесу необходимо ответить на следующие вопросы:

  • Кто работал, когда процесс завершился?
  • Каково было время цикла процесса?
  • Какой серийный номер детали был произведен в процессе?

Моя схема включает следующие измерения первого уровня. У меня нет никаких измерений за пределами первого уровня, но есть некоторые перекрестные связи между размерами установки и типом детали, смещением и размерами процесса.

  • Тип детали (атрибуты: суррогатный ключ, номер детали, модель, вариант, название детали)
  • Растение (атрибуты: суррогатный ключ, название растения, аббревиатура растения)
  • Shift (атрибуты: суррогатный ключ, заводской ключ, начальный час 24, начальная минута, конечный час 24, конечная минута)
  • Процесс (атрибуты: суррогатный ключ, ключ завода, производственная линия, группа процессов, имя процесса, тип машины)
  • Дата (типичные атрибуты измерения даты)
  • Время суток (типичные атрибуты измерения времени суток)

К безразмерным фактам относятся:

  • Серийный номер детали (экземпляры типа детали)
  • Время цикла
  • Идентификаторы сотрудника * МНОГОЗНАЧЕННЫЕ *

Проблема

Моя проблема в том, что в то время над процессом могло работать более одного сотрудника. Итак, мне интересно, нужно ли мне изменить мою модель и как лучше всего представить сотрудника в модели. Мы не пытаемся хранить информацию о сотрудниках, а только идентификатор сотрудника их компании. Я рассмотрел следующие варианты:

  1. Разрешить использование нескольких идентификаторов сотрудников в столбце сотрудников в таблице фактов (например, через запятую). Недостаток: количество сотрудников, работающих над процессом, является переменной величиной. Нужно ли мне создать поле, достаточно большое, чтобы вместить до X сотрудников? Каким должен быть X?
  2. Создайте запись для каждого производственного факта на сотрудника. Это будет означать наличие более одной записи для одного и того же факта; это было бы плохо. :)
  3. Создайте измерение сотрудников и таблицу моста «Сотрудники процесса» между таблицей измерения сотрудников и таблицей фактов. Проблема: сотрудники, работающие над процессом в данный момент, не представлены в таблице фактов.
  4. Создайте измерение «Сотрудник», таблицу «Группа сотрудников процесса» и таблицу-мост между таблицей «Группа сотрудников процесса» и таблицей измерения «Сотрудник». Таблицы групп сотрудников и мостов должны быть: а) предварительно заполнены всеми возможными комбинациями сотрудников - это непрактично ни на каком уровне, поскольку у нас тысячи сотрудников; или б) заполняться на лету во время ETL. 4b потребуется проверка, чтобы увидеть, существует ли уже заданная группа сотрудников для каждого процесса; это может быть обременительным для системы СУБД / ETL, если исходные записи группируются чаще, чем несколько раз в день (например, 10 X в час для отчетов в режиме, близком к реальному времени).

Мои вопросы

Я думаю, что вариант 3 - наиболее жизнеспособный вариант, но у меня есть некоторые оговорки. Есть ли потенциальные наблюдатели? Есть ли другие альтернативы, которые мне следует рассмотреть? Можно ли исключить сотрудников, которые работали над процессом, из таблицы фактов?

Спасибо за любой совет.


person tonyapolis    schedule 15.05.2014    source источник


Ответы (2)


Есть такое понятие, как медленно меняющиеся размеры. Это считается размерами; в основном вот таблица, которую я назову PartEmployee;

Структура этой таблицы будет

PartId - PK
EmployeeId - PK
EmployeeStartDate - PK
EmployeeEndDate

Конечная дата будет нулевой, если сотрудник все еще работает над частью. Когда новый сотрудник начинает работать над деталью, предыдущая запись сотрудника для этой детали будет закрыта, и для детали будет создана новая запись с новым сотрудником.

Добавить сотрудника в таблицу PartFact;

EmployeeId

Этот столбец будет содержать текущего сотрудника; Эта запись фактов будет обновляться каждый раз, когда новый сотрудник начинает работать над этой частью ...

Это даст вам историческую перспективу того, какие сотрудники работали со стороны, а также информацию о сотруднике, который работал со стороны последним.

Надеюсь это поможет...

person DataGuru    schedule 17.05.2014
comment
Спасибо. Ваш ответ помог мне найти наиболее подходящее решение. - person tonyapolis; 19.05.2014

У меня было время подумать о своих вариантах, и ни один из 4 вариантов, перечисленных в моем исходном сообщении, не является правильным. Обсуждаемая проблема кажется классической проблемой «покрытия»; бизнесу необходимо знать, какие сотрудники над какими процессами работали в данный момент. Если у нас есть эта информация, мы будем знать, кто работал, кто работал над определенной частью, когда данный процесс завершился. Лучше всего это представить в виде таблицы фактов, не содержащей фактов, между измерением сотрудника и измерением производственного процесса.

Этот подход также помогает мне сэкономить место и повысить производительность запросов, поскольку один факт «охвата» одного сотрудника будет охватывать несколько фактов производственного процесса.

person tonyapolis    schedule 19.05.2014