Umgang mit mehreren Faktentabellen in Qlikview
Ich habe eine PostgreSQL-Datenbank, die verschiedene Daten zur Ausbildung wie Schule-level-test-scores und der Einschreibung zahlen. Muss ich separate Registrierung von Tests erzielt werden, da die Daten auf verschiedenen Körnern. Obwohl die Anmeldung ist auf eine unterschiedliche Granularität von der test-Ergebnis-Daten, viele von den Abmessungen sind die gleichen. Ich habe zum Beispiel:
~ ---------------------------------------------------------------------------------~
| Test Scores Fact |
|------------- | ----------- | ---------- | ----------- | -------------- | ------------ | -----|
| school_code | test_code | grade_id | gender_id | ethnicity_id | subject_id | ... |
|------------- | ----------- | ---------- | ----------- | -------------- | ------------ | -----|
~ --------------------------------------------------------~
| Enrollment Fact |
|------------- | ---------- | ----------- | -------------- | -----|
| school_code | grade_id | gender_id | ethnicity_id | ... |
|------------- | ---------- | ----------- | -------------- | -----|
Diese Struktur ist fein auf das backend, aber in Qlikview, dies erzeugt einen synthetischen Schlüssel. Die Lösung für synthetische Schlüssel scheint in der Regel ersetzen Sie es mit einer link-Tabelle über Qlikview scripting, das war mein Ansatz. Aber dies scheint nicht zu skalieren, als wenn ich eine Dritte hinzufügen Faktentabelle (auf noch anderes Getreide) mit der gleichen Abmessungen, ist, wenn ich einen anderen link, Tabelle, nun meine zwei Tabellen verknüpfen beginnen zu assoziieren, denn Sie enthalten einige Häufig benannte Felder und Qlikview die Antwort ist die Schaffung von mehr synthetische Schlüssel?
Ich bin relativ neu in Qlikview und arbeite von mir. Wie sind mehrere Fakten von verschiedenen Körnern mit gängigen Abmessungen in der Regel gehandhabt?
EDIT:
Habe ich meine Lösung für dieses problem, die gearbeitet hat, die in einer Produktionsumgebung für knapp ein Jahr! Siehe meine Antwort unten...
InformationsquelleAutor bdiamante | 2013-08-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen die Beliebtheit dieser Frage, ich werde meine tatsächliche Lösung, um die Mischung so Menschen, die haben ein Beispiel für die Arbeit aus, die für einige Grund ist wirklich schwer zu finden, für eine solche gemeinsame problem...
Begab ich mich mit dem erstellen einer Link-Tabelle. Diese Lösung immer noch zu diesem Tag fühlt sich wie ein hack wie schafft es eine riesige Tabelle mit dem kartesischen Produkt aus jeder Ihrer Schlüssel in allen Faktentabellen... aber es funktioniert.
Das problem: Sie haben in der Tat mehrere Tabellen in Ihrer Datenbank; ein vorkommen in fast jede Datenbank je. Einige (oder alle) dieser Tatsache Tabellen teilen, die den gleichen Schlüssel-Felder; kein problem, oder? Falsch. Leider, aufgrund von Qlik die assoziative Natur, statt jedem von Fakt-Tabellen verknüpfen nett zu Ihren lookup-Tabellen, Ihre Tatsache Tabellen sind jetzt Umgang mit einander und Unheil anrichten auf Ihre Daten-Modell; Schaffung von zirkulären Referenzen und unzählige Mengen von synthetischen keys.
Die Lösung: Erstellen Sie eine Link-Tabelle. Klingt einfach, Recht? Gut, es ist, aber es ist auch sehr schlecht dokumentiert und schwer zu verstehen ohne eine erste Erklärung. Sie werden sich vielleicht Fragen... was ist ein Link-Tabelle? Es ist das kartesische Produkt aller Schlüssel von allen Faktentabellen. Wie hat dies das problem beheben? Es entfernt alle unerwünschten Assoziationen zwischen Ihre fact-Tabellen als jeder nun enthalten nur eine einzige verkettete Schlüssel. Jene einzigartige Schlüssel wird eine Verbindung mit der Link-Tabelle, die enthält alle Ihre einzigartigen verketteten Schlüssel als auch alle einzelnen Tasten. Die Link-Tabelle wird anschließend eine Verknüpfung mit Ihrem lookup-Tabellen und alles wird gut.
Umsetzung:
Dieser Implementierung wird die beiden enthaltenen Tabellen in meiner Frage oben;
test_scores_fact
undenrollment_fact
.Wie Sie sehen können, die zwei Fakt-Tabellen mit überlappenden Tasten
school_code
,grade_id
,gender_id
, undethnicity_id
. In einem relationalen Modell, jedes Schlüsselfeld eine entsprechende Tabelle mit zusätzlichen Informationen über den Schlüssel. Dieses Modell funktioniert nicht jive mit Qlikview ist die assoziative Natur als Mitarbeiter Qlikview-Tabellen, basierend auf den Namen des Feldes an, auch wenn Sie das nicht wollen. Sie wollen, wie die benannten Felder zuordnen, um Ihre lookup-Tabellen, aber Sie wollen nicht wie benannte Felder in der Tatsache Tabellen zu verknüpfen. Leider Sie kann nicht aufhören, dieses Verhalten. Sie müssen implementieren eine Link-Tabelle...In Ihrem Qlikview script, erstellen Sie eine temporäre Faktentabelle, die lädt alle Felder aus der Datenbank-Tabelle:
Verketten Sie Ihre Schlüssel und entfernen Sie alle einzelnen Tasten:
Wiederholen Sie die Schritte 1 & 2 für jede Faktentabelle:
Erstellen Sie Ihre Link-Tabelle, durch die Verkettung Ihrer individuellen Schlüssel in eine einzige Tabelle:
Drop-temp-Tabellen, so erscheinen Sie auch nicht in Ihrem Daten-Modell:
Dies wird entfernen Sie alle Verknüpfungen zwischen der Tatsache Tabellen gibt es derzeit keine gemeinsamen Feldnamen zwischen Ihnen. Jede Faktentabelle wird ein link auf die link-Tabelle über die erstellte verkettete Schlüssel. Die link-Tabelle wird dann assoziieren mit jedem einzelnen lookup-Tabelle. Ihre Qlikview-Datenmodell enthält keine synthetischen keys oder zirkuläre Referenzen.
Wenn Sie erstellen ein Fakt-Tabelle in der Zukunft, Folgen Sie einfach die Schritte 1 & 2 erneut, und fügen Sie eine neue, einzelne Tasten der Link-Tabelle und fügen Sie die neuen verketteten Schlüssel, um die Link-Tabelle als auch. Es skaliert mit wenig Aufwand.
Glück!
InformationsquelleAutor bdiamante
Gibt es zwei Haupt-Strategien zur Modellierung von Daten in QlikView für den Umgang mit mehreren Faktentabellen:
Hängen Sie Ihre Fakt-Tabellen in einer einzigen Faktentabelle - Regel
bezeichnet als eine VERKETTETE TAT, wie QlikView ist die syntax für
anfügen von Daten in Tabellen, ist durch die Verwendung der VERKETTEN-Vorwahl (die
Entsprechung einer SQL-UNION-operation)
Aufbau einer link-Tabelle (was Sie bisher getan haben) Für eine Mehrzahl von
Implementierungen, option 1 ist die geeignete Methode. Attribute einer
VERKETTET Tatsache können wie folgt zusammengefasst werden:
Positiv:
Negative:
Erstellen Tabellen Verknüpfen ist ein Komplexes Thema, sondern verlässt sich auf traditionelle Datenbank-Verknüpfung von Tisch-design-Techniken. Es ist einfach falsch zu gehen und zu produzieren, verknüpfen von Tabellen, die scheinen mag, um richtige Ergebnisse in der front-end-aber ist übermäßig groß, verbraucht Speicher und CPU-Ressourcen.
In meiner Erfahrung, eine schlecht modellierte QlikView-Datenmodell ist die häufigste Ursache für die Entstehung von schlechter Leistung.
Ich hoffe, dass diese kurze, bei weitem nicht vollständig, Einführung in die multi-Tatsache Modellierung in QlikView beweist wenig helfen, und setzt Sie auf dem richtigen Kurs.
InformationsquelleAutor Jonas Valleskog
Die zwei schnellsten Möglichkeiten, die ich denken kann:
A) Sie kann nur left join mit der Faktentabelle in die entsprechenden Tabellen, die Sie benutzt werden. Sie müssen nur die Felder umbenennen, um Konflikte mit den anderen Tabellen.
B)benennen Sie die Allgemeinen Felder, die getan werden kann, durch
QUALIFY
(vor dem laden der fact tables) undUNQUALIFY
(nach dem laden der fact tables)
Unter der Annahme, dass die Tatsache Tabellen haben eindeutige id-Feldnamen, die verknüpft werden können, um die wichtigsten Tabellen , die Sie nicht haben sollte, benennen Sie alles, was in den Haupt-Tabellen
Dann würde ich mit B-1, denn das scheint ein wenig weniger Aufwand.
BEARBEITEN: Wenn Sie möchten, eine Verknüpfung zu erstellen, Tabelle von diesen, können Sie verketten die Tatsache Tabellen in einer Tabelle, wo du alle Spalten in es (es werden null-Werte für eine Menge von Spalten, aber QlikView ist gut, mit null).
Dem, was ich normalerweise tun ist, laden Sie die Tatsache Tabellen und erstellen Sie ein id-Feld (entweder RowNo() oder autonumberhash128([Liste von eindeutigen id-Feldnamen]), dann, wenn ich laden Sie in eine link-Tabelle habe ich auch das id-Feld in der link-Tabelle. Endlich, ich lasse die alle gemeinsamen Felder aus der Tatsache Tabellen, so Sie existieren nur in der link-Tabelle.
Werden Sie tatsächlich haben, um die Felder umbenennen, die in die neuen Tabellen zu verbinden, um die richtige Spalte. Also, wenn Sie wollen, dass die enrollment_fact.grade_id, die Sie umbenennen müssen, grade_id in der anderen Tabelle um zu verknüpfen.
InformationsquelleAutor AllGoldNinja
Einem der Eingänge, um Ihre kartesischen dimension sein würde, 'N/A' gegen die Subjekt-und Test-Code (denn das ist nicht in der Einschreibungen Tabelle)
So, wenn Sie Messen, indem Sie "Geschlecht" die Testergebnisse match gegen dimension records mit gültigen Themen und Test-Codes und die Registrierung von matches gegen Einträge mit 'N/A' Themen und Test-Codes
Dann, wenn Sie roll-up nach Geschlecht, everyhing 'funktioniert einfach' schön.
InformationsquelleAutor Nick.McDermaid