Visto la popolarità di questa domanda, aggiungerò la mia vera soluzione al mix in modo che le persone abbiano un esempio da cui lavorare, che per qualche motivo è davvero difficile da trovare per un problema così comune ...
Ho proceduto alla creazione di una tabella di collegamento. Questa soluzione fino ad oggi sembra un trucco perché crea un enorme tavolo contenente il prodotto cartesiano di ciascuna delle tue chiavi in tutte le tabelle dei fatti ... ma funziona.
Il problema: nel database sono presenti più tabelle dei fatti; un'occorrenza in quasi tutti i database di sempre. Alcune (o tutte) di queste tabelle dei fatti condividono gli stessi campi chiave; nessun problema, giusto? Sbagliato. Sfortunatamente, a causa della natura associativa di Qlik, invece di ciascuna delle tabelle dei fatti che si collegano bene alle loro tabelle di ricerca, le tabelle dei fatti ora si associano tra loro e provocano il caos sul modello dei dati; creare riferimenti circolari e quantità incalcolabili di chiavi sintetiche.
La soluzione: creare una tabella di collegamento. Sembra semplice, giusto? Beh, lo è, ma è anche molto scarsamente documentato e difficile da capire senza una spiegazione iniziale. Forse ti starai chiedendo ... cos'è un Link Table? È il prodotto cartesiano di tutte le chiavi di tutte le tabelle dei fatti. In che modo questo corregge il problema? Rimuove tutte le associazioni indesiderate tra le tabelle dei fatti poiché ciascuna di esse contiene ora una sola chiave concatenata univoca. Queste uniche chiavi si assoceranno solo alla tabella di collegamento, che contiene tutte le chiavi concatenate univoche e tutte le singole chiavi. La Tabella collegamenti verrà successivamente associata alle tue tabelle di ricerca e tutto andrà bene.
Implementazione:
Questa implementazione userà i due tabelle contenute nella mia domanda di cui sopra; test_scores_fact
e 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
Come si può vedere, le due tabelle dei fatti hanno le chiavi sovrapposte, school_code
, grade_id
, gender_id
e ethnicity_id
. In un modello relazionale, ogni campo chiave ha una tabella corrispondente con informazioni aggiuntive sulla chiave. Questo modello non fa parte della natura associativa di Qlikview in quanto Qlikview associa le tabelle in base al nome di un campo; anche quando non lo vuoi. Si desidera che i campi denominati vengano associati alle rispettive tabelle di ricerca, tuttavia non si desidera che i campi denominati nelle tabelle dei fatti vengano associati. Sfortunatamente non puoi fermare questo comportamento. Devi implementare una tabella di link ...
Nel vostro script di QlikView, creare una tabella dei fatti temporanea, che carica in tutti i campi della tua tabella di database:
[temp_test_scores]:
LOAD school_code,
test_code,
grade_id,
gender_id,
ethnicity_id,
subject_id,
test_score;
SQL SELECT * FROM <database connection>
Concatenare le chiavi e rimuovere tutti i singoli tasti:
[test_scores]:
LOAD school_code & '_' test_code & '_' grade_id & '_' gender_id & '_' ethnicity_id & '_' subject_id as test_key,
test_score
RESIDENT [temp_test_scores];
Ripetere i passaggi 1 & 2 per ogni tabella dei fatti:
[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];
Crea la tabella di collegamento concatenando le chiavi individuali in un'unica tabella:
[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]
cadere il vostro tabelle temporanee in modo che non compaiono nel vostro modello di dati:
DROP TABLE [temp_test_scores];
DROP TABLE [temp_enrollment];
DROP TABLE [temp_link_table];
Questa operazione rimuoverà tutte le associazioni tra le tabelle dei fatti poiché non esiste alcun nome di campo comune tra di esse. Ogni tabella dei fatti si collegherà alla tabella dei collegamenti tramite la chiave concatenata creata. La tabella dei collegamenti verrà quindi associata a ogni singola tabella di ricerca. Il modello di dati di Qlikview non conterrà chiavi sintetiche o riferimenti circolari.
Se si crea un'altra tabella dei fatti in futuro, basta seguire nuovamente i passaggi 1 & 2 e aggiungere eventuali nuove chiavi individuali alla Tabella collegamenti e aggiungere anche la nuova chiave concatenata alla Tabella collegamenti. Scala con poco sforzo.
Buona fortuna!
Innanzitutto, grazie per aver trovato il tempo di rispondere. Secondo, ho modificato il mio post principale con un esempio più specifico. Prima di iniziare a implementare qualsiasi cosa voglio solo essere sicuro di capire quello che sto facendo. Qualify aggiunge un nome in due parti al campo, quindi se fosse grade_id, ora sarebbe enrollment_fact.grade_id. In che modo Qlikview associa il campo ora qualificato? – bdiamante
In realtà dovrete rinominare i campi nelle nuove tabelle per connettervi alla colonna corretta. Quindi, se vuoi il metodo registration_fact.grade_id, dovrai rinominare grade_id nell'altra tabella per collegarti ad esso. – AllGoldNinja