Увидев популярность этого вопроса, я собираюсь добавить свое фактическое решение в микс, чтобы у людей был пример для работы, который по какой-то причине очень трудно найти для такой общей проблемы ...
Я приступил к созданию таблицы ссылок. Это решение по-прежнему по сей день выглядит как хак, поскольку он создает одну огромную таблицу, содержащую декартово произведение каждого из ваших ключей во всех ваших таблицах фактов ... но он действительно работает.
Проблема: У вас есть несколько таблиц фактов в вашей базе данных; появление почти в каждой базе данных. Некоторые (или все) эти таблицы фактов имеют одни и те же ключевые поля; не проблема, не так ли? Неправильно. К сожалению, из-за ассоциативной природы Qlik, вместо того, чтобы каждая из ваших таблиц фактов хорошо связывалась с таблицами поиска, ваши таблицы фактов теперь связываются друг с другом и разрушают вашу модель данных; создавая круговые ссылки и неисчислимые количества синтетических ключей.
Решение: Создать таблицу ссылок. Звучит просто, не так ли? Ну, это так, но это также очень плохо документировано и трудно понять без первоначального объяснения. Возможно, вам интересно ... что такое таблица ссылок? Это декартово произведение всех ключей из всех ваших таблиц фактов. Как это исправить проблему? Он удаляет все нежелательные ассоциации между вашими таблицами фактов, поскольку каждый из них теперь будет содержать только один уникальный конкатенированный ключ. Эти уникальные ключи будут связываться только с таблицей ссылок, которая содержит все ваши уникальные сцепленные ключи, а также все отдельные клавиши. Таблица ссылок впоследствии будет ассоциирована с вашими таблицами поиска, и все будет хорошо.
Реализация:
Эта реализация будет использовать две таблицы, содержащиеся в моем вопросе выше; test_scores_fact
и enrollment_fact
.
test_scores_fact | enrollment_fact | school | gender | ...
---------------- | --------------- | ------ | ------ | ---
school_code (FK) | school_code (FK) | school_code (PK) | gender_id (PK) |
test_code (FK) | grade_id (FK) | school_name (FK) | gender_desc |
grade_id (FK) | ethnicity_id (FK) | address | ... |
gender_id (FK) | gender_id (FK) | ... |
ethnicity_id (FK) | number_enrolled (F) |
subject_id (FK) |
test_score (F) |
FK = Foreign Key
PK = Primary Key
F = Fact
Как вы можете видеть, два таблицы фактов имеют перекрывающиеся ключи, school_code
, grade_id
, gender_id
и ethnicity_id
. В реляционной модели каждое поле ключа имеет соответствующую таблицу с дополнительной информацией о ключе. Эта модель не связана с ассоциативной природой Qlikview, поскольку Qlikview связывает таблицы, основанные на имени поля; даже если вы этого не хотите. Вы хотите, чтобы именованные поля ассоциировались с их таблицами поиска, однако вы не хотите, чтобы подобные имена полей в ваших таблицах фактов связывались. К сожалению, вы не можете остановить это поведение. Вы должны реализовать таблицу ссылок ...
В вашем сценарии QlikView, создать временную таблицу фактов, которая загружает все поля из базы данных таблицы:
[temp_test_scores]:
LOAD school_code,
test_code,
grade_id,
gender_id,
ethnicity_id,
subject_id,
test_score;
SQL SELECT * FROM <database connection>
Объединить ключи и удалить все отдельные клавиши:
[test_scores]:
LOAD school_code & '_' test_code & '_' grade_id & '_' gender_id & '_' ethnicity_id & '_' subject_id as test_key,
test_score
RESIDENT [temp_test_scores];
Повторите шаги 1 & 2 для каждой таблицы фактов:
[temp_enrollment]:
LOAD school_code,
grade_id,
ethnicity_id,
gender_id,
number_enrolled;
SQL SELECT * FROM <database connection>
[enrollment]:
LOAD school_code & '_' & grade_id & '_' & ethnicity_id & '_' & gender_id as enrollment_key,
number_enrolled
RESIDENT [temp_enrollment];
Создать свою таблицу связей пути конкатенации ваших индивидуальных ключей в одну таблицу:
[temp_link_table]:
LOAD DISTINCT
school_code,
test_code,
grade_id,
gender_id,
ethnicity_id,
subject_id
RESIDENT [temp_test_scores];
CONCATENATE ([temp_link_table])
LOAD DISTINCT
school_code,
grade_id,
ethnicity_id,
gender_id,
number_enrolled
RESIDENT [temp_enrollment];
/**
* The final Link Table will contain all of the individual keys one time as well as your concatenated keys
*/
[link_table]:
LOAD DISTINCT
school_code,
test_code,
grade_id,
gender_id,
ethnicity_id,
subject_id,
school_code & '_' test_code & '_' grade_id & '_' gender_id & '_' ethnicity_id & '_' subject_id as test_key,
school_code & '_' & grade_id & '_' & ethnicity_id & '_' & gender_id as enrollment_key
RESIDENT [temp_link_table]
Бросайте временные таблицы, чтобы они не появляются в вашей модели данных:
DROP TABLE [temp_test_scores];
DROP TABLE [temp_enrollment];
DROP TABLE [temp_link_table];
Это приведет к удалению всех ассоциаций между вашими таблицами фактов, поскольку между ними нет общих имен полей. Каждая таблица фактов будет ссылаться на таблицу ссылок через созданный конкатенированный ключ. Затем таблица ссылок связывается с каждой отдельной таблицей поиска. Ваша модель данных Qlikview не будет содержать синтетических ключей или круговых ссылок.
Если вы создадите еще одну таблицу фактов в будущем, просто повторите шаги 1 & 2 и добавьте новые ключи в таблицу ссылок, а также добавьте новый конкатенированный ключ в таблицу ссылок. Он масштабируется без особых усилий.
Удачи!
Во-первых, спасибо, что нашли время ответить. Во-вторых, я редактировал свой основной пост с более конкретным примером. Прежде чем я начну реализовывать что-либо, я просто хочу быть уверенным, что понимаю, что я делаю. Квалификатор добавляет двухзначное имя в поле, поэтому, если оно было class_id, теперь это будет enrollment_fact.grade_id. Как Qlikview связывает теперь квалифицированное поле? – bdiamante
Вам нужно будет переименовать поля в новых таблицах, чтобы подключиться к правильному столбцу. Поэтому, если вы хотите enrollment_fact.grade_id, вам нужно будет переименовать class_id в другой таблице, чтобы связать его. – AllGoldNinja