Obsługa danych hierarchicznych
Hierarchie stanowią ważny element każdego rozwiązania Business Intelligence. Umożliwiają one do opisywanie wymiarów, które ze swej natury obejmują różne poziomy szczegółowości. Niektóre hierarchie są proste i intuicyjne, podczas gdy inne są bardziej złożone i prawidłowe ich zamodelowanie wymaga dokładnego przemyślenia.
Przechodząc od szczytu hierarchii do jej dołu, kolejne poziomy są coraz bardziej szczegółowe. Na przykład w wymiarze obejmującym poziomy Rynek, Kraj, Stan i Miasto element Ameryki będzie należeć do pierwszego poziomu hierarchii, element Stany Zjednoczone do drugiego poziomu, element Kalifornia do trzeciego, a element San Francisco do poziomu najniższego. Kalifornia to wartość bardziej szczegółowa niż Stany Zjednoczone, a San Francisco to z kolei wartość bardziej szczegółowa niż Kalifornia.
Przechowywanie hierarchii w relacyjnym modelu danych jest znanym problemem o licznych rozwiązaniach. Istnieje tu kilka podejść:
- hierarchia pozioma,
- model list sąsiadowania,
- metoda wyliczania ścieżki,
- model zbiorów zagnieżdżonych,
- lista węzłów nadrzędnych.
Dla potrzeb tego kursu utworzymy listę węzłów nadrzędnych, ponieważ pozwala ona zapisać hierarchię w formacie bezpośrednio nadającym się do wykonywania zapytań. Więcej informacji na temat innych strategii można znaleźć w temacie Qlik Community.
Prefiks Hierarchy
Prefiks Hierarchy to polecenie skryptu umieszczane przed instrukcją LOAD lub SELECT w celu załadowania tabeli węzłów sąsiadujących. Instrukcja LOAD musi zawierać co najmniej trzy pola: identyfikator stanowiący niepowtarzalny klucz węzła, odwołanie do węzła nadrzędnego i nazwę.
Zastosowanie prefiksu spowoduje przekształcenie załadowanej tabeli do postaci tabeli z węzłami rozwiniętymi, zawierającej kilka dodatkowych kolumn – po jednej dla każdego poziomu hierarchii.
Wykonaj następujące czynności:
- Utwórz nową aplikację i nadaj jej nazwę.
- Dodaj nową sekcję skryptu w edytorze ładowania danych.
- Wywołaj sekcję Wine.
-
W sekcji DataFiles dostępnej po prawej stronie kliknij przycisk Wybierz dane.
- Prześlij, a następnie wybierz Winedistricts.txt.
- W oknie Wybierz dane z usuń zaznaczenie pól Lbound i RBound, aby nie zostały one załadowane.
- Kliknij polecenie Wstaw skrypt.
- Wprowadź następujące dane powyżej instrukcji LOAD:
- Kliknij polecenie Ładuj dane.
- W sekcji Podgląd w Przeglądarce modelu danych wyświetl wynikową tabelę.
- Jedna kolumna zawiera wszystkie nazwy węzłów, więc można jej używać w wyszukiwaniach.
- Poszczególne poziomy węzłów zostały rozwinięte w osobne pola, których można używać w grupach hierarchicznych lub jako wymiary w tabelach przestawnych.
- Poszczególne poziomy węzłów zostały rozwinięte w osobne pola, których można używać w grupach hierarchicznych.
- Można sprawić, by tabela zawierała unikatową ścieżkę prowadzącą do określonego węzła, zawierającą wszystkie elementy nadrzędne w odpowiedniej kolejności.
- Można sprawić, by tabela zawierała głębokość węzła, czyli jego odległość od węzła głównego.
Hierarchy (NodeID, ParentID, NodeName)
Skrypt powinien wyglądać następująco:
Hierarchy (NodeID, ParentID, NodeName)
LOAD
NodeID,
ParentID,
NodeName
FROM [lib://DataFiles/Winedistricts.txt]
(txt, utf8, embedded labels, delimiter is '\t', msq);
Wynikowa tabela węzłów rozwiniętych zawiera dokładnie tyle samo rekordów, co tabela źródłowa, czyli po jednym dla każdego węzła. Tabela węzłów rozwiniętych to bardzo praktyczna postać danych, ponieważ spełnia szereg wymogów dotyczących analizowania hierarchii w modelu relacyjnym:
Wynikowa tabela wygląda następująco:
Prefiks HierarchyBelongsTo
Podobnie jak Hierarchy prefiks HierarchyBelongsTo to polecenie skryptu umieszczane przed instrukcją LOAD lub SELECT w celu załadowania tabeli węzłów sąsiadujących.
Również w tym przypadku instrukcja LOAD musi zawierać co najmniej trzy pola: identyfikator stanowiący niepowtarzalny klucz węzła, odwołanie do węzła nadrzędnego i nazwę. Prefiks powoduje przekształcenie załadowanej tabeli w tabelę węzłów nadrzędnych, czyli taką, która zawiera osobny wiersz dla każdej kombinacji węzła nadrzędnego i podrzędnego. Dzięki temu bardzo łatwo jest znaleźć wszystkie węzły nadrzędne lub podrzędne określonego węzła.
Wykonaj następujące czynności:
- Zmodyfikuj instrukcję Hierarchy w Edytorze ładowania danych do następującej postaci:
HierarchyBelongsTo (NodeID, ParentID, NodeName, BelongsToID, BelongsTo)
- Kliknij polecenie Ładuj dane.
- W sekcji Podgląd w Przeglądarce modelu danych wyświetl wynikową tabelę.
- Podczas gdy identyfikator węzła reprezentuje tylko pojedynczy węzeł, identyfikator węzła nadrzędnego może reprezentować całe drzewo hierarchii lub poddrzewo w jej obrębie.
- Wszystkie nazwy węzłów istnieją zarówno w roli węzłów, jak i w roli drzew, i mogą być używane w wyszukiwaniach w obu rolach.
- Można sprawić, by tabela zawierała różnicę głębokości węzła i określonego węzła nadrzędnego, czyli odległość od węzła głównego poddrzewa.
Tabela nadrzędna spełnia szereg wymogów dotyczących analizowania hierarchii w modelu relacyjnym:
Wynikowa tabela wygląda następująco:
Autoryzacja
Częstym zastosowaniem hierarchii jest dokonywanie autoryzacji. Typowym przykładem jest hierarchia organizacyjna. Każdy menedżer powinien oczywiście mieć wgląd w działalność wszystkich jednostek w obrębie swojego działu, w tym wszelkich poddziałów. Niekoniecznie musi jednak mieć uprawnienia wglądu do innych działów.
Oznacza to, że różne osoby mogą widzieć różne poddrzewa w ramach organizacji. Tabela autoryzacji może wyglądać następująco:
DOSTĘP | NTNAME | OSOBA | STANOWISKO | UPRAWNIENIA |
---|---|---|---|---|
USER | ACME\JRL | John | CPO | HR |
USER | ACME\CAH | Carol | CEO | CEO |
USER | ACME\JER | James | Dyrektor ds. inżynierii | Inżynieria |
USER | ACME\DBK | Diana | CFO | Finanse |
USER | ACME\RNL | Bob | COO | Sprzedaż |
USER | ACME\LFD | Larry | CTO | Produkt |
W tym przypadku Carol ma uprawnienia do wyświetlania wszystkiego od węzła CEO w dół, Larry ma uprawnienia do wyświetlania całej organizacji Product, a James widzi tylko organizację Engineering.
Przykład:
Często hierarchia jest przechowywana w tabeli węzłów sąsiadujących. W tym przykładzie, aby rozwiązać ten problem, można załadować tabelę węzłów sąsiadujących za pomocą HierarchyBelongsTo, a polu nadrzędnemu nadać nazwę Tree.
Jeśli chcesz użyć Section Access, załaduj kopię Tree zapisaną wielkimi literami i wywołaj to nowe pole PERMISSIONS. Na koniec należy załadować tabelę autoryzacji. Dwa ostatnie kroki można wykonać, używając poniższego kodu. Zauważ, że tabela TempTrees została utworzona przez instrukcję HierarchyBelongsTo.
Należy pamiętać, że jest to tylko przykład. Nie ma żadnego ćwiczenia towarzyszącego, które należy wykonać w Qlik Sense.
Na podstawie tego przykładu powstałby następujący model danych: