Wymiar śmieciowy (tzw. junk dimension)
Jak radzić sobie z prostymi wymiarami o niewielkiej liczbie możliwych wartości.
Spis Treści
Opis problemu
Przyjmuje się, że poprawna architektura modelu wielowymiarowego to maksymalnie ok. 15 wymiarów oraz „zgrabnie” zaprojektowana tabela faktów zawierająca z reguły klucze obce wymiarów (składające się na jej złożony klucz główny) oraz miary.
W praktyce spotykamy się jednak często z różnymi sytuacjami wyjątkowymi. Niejednokrotnie, po zaprojektowaniu kluczowych wymiarów (takich jak np. czas, klient, produkt, lokalizacja, itp.) oraz miar, zostaje nam kilka osobliwych wymiarów, które nie posiadają zbyt wielu atrybutów, nie posiadają wewnętrznych hierarchii, ani nie przyjmują zbyt wielu unikanych wartości. Są to z reguły pewne wskaźniki, czy flagi (jak np. typ płatności).
Możliwe (niepoprawne) rozwiązania
Z pozoru wydaje się, że można zastosować tutaj kilka różnych rozwiązań.
- Pozostawienie flag i wskaźników jako atrybutów (kolumn) w tabeli faktów. Wstawianie nieskompresowanych, tekstowych atrybutów do tabeli faktów będzie zaburzać jednak poprawny design modelu wielowymiarowego. Będzie to też powodowało nienaturalny rozrost tabeli faktów i niepotrzebną konsumpcję bajtów. Poza kluczami obcymi do tabel wymiarów, miarami oraz ew. wymiarami zdegenerowanymi, nic innego w tabeli faktów nie powinno się znajdować.
- Stworzyć dla każdej flagi, czy wskaźnika osobny wymiar. Takie podejście może spowodować, że model zawierać będzie zbyt dużo wymiarów, co będzie skutkować problemami wydajnościowymi. Będzie to też rozwiązanie analogiczne do poprzedniego, z dokładnością do tego, że zaoszczędzimy trochę miejsca. Rozwiązanie takie nie będzie eleganckie.
- Nie uwzględnianie kłopotliwych elementów w modelu. Jest to rozwiązanie dopuszczalne tylko w sytuacjach, gdy pozwalają na to wymagania biznesowe, flagi i wskaźniki nie mają znaczenia analitycznego, lub mają bardzo niską jakość danych. Warto rozważyć nie uwzględnianie tych elementów względem wymagań, jednak nie powinno się traktować ich pomijania, jako rozwiązania problemu.
Poprawne rozwiązanie - wymiar śmieciowy
Poprawnym i polecanym rozwiązaniem w takiej sytuacji jest stworzenie tzw. wymiaru śmieciowego (ang. junk dimension). W ramach tego wymiaru umieszczamy wszystkie możliwe kombinacje wartości wszystkich rozpatrywanych flag i wskaźników (ich iloczyn kartezjański). Jest to rozwiązanie analogiczne np. do kategorii „Inne” dla produktów w sklepach internetowych. Trafia tam przeważnie wszystko, dla czego nie warto jest tworzyć osobnej kategorii produktów.
Rozwiązanie takie może wydawać się dość pamięciożerne. Przykładowo dla 7 wymiarów dwuwartościowych oraz 3 wymiarów trójwartościowych otrzymamy 3 456 (2^7 * 3^3) wierszy w tabeli wymiaru śmieciowego, co nie jest przerażające w porównaniu np. z wymiarem Klient. Rozwiązanie to pozwala nam jednak zastąpić 10 kluczy obcych w tabeli faktów (lub 10 atrybutów) jednym kluczem obcym, co jest znaczącą optymalizacją.
W przypadku flag i wskaźników, które mogą przyjmować więcej unikalnych wartości, wymiar śmieciowy może się jednak rozrosnąć do irracjonalnych wymiarów. W takiej sytuacji zalecane jest logiczne podzielenie wskaźników i flag na grupy i stworzenie kilku osobnych wymiarów śmieciowych.
Pewną optymalizacją, którą można zastosować, jest strategia wstawiania wierszy do tabeli wymiaru śmieciowego. Gdy możliwych wartości wymiaru jest stosunkowo niewiele, tabelę wymiaru możemy wypełnić apriori. Jeżeli wartości jest relatywnie wiele, a występować w praktyce będzie tylko niewielki ich podzbiór, możemy uzupełniać wartości w czasie kiedy będą pojawiały się odpowiadające im wiersze w tabeli faktów.
Innym zastosowaniem wymiarów śmieciowych, jest tworzenie wymiaru dla komentarzy tekstowych, odnoszących się do faktów. Z reguły niewielki podzbiór faktów będzie miał komentarz, stąd tabela wymiaru nie powinna rozrosnąć się do zbyt wielkiego rozmiaru.



