Hlavní navigace

RDBMS - Kontingenční tabulka

31. 10. 2017 8:05 Michal Šalko

Každý, kdo pracuje s daty někdy narazí na problém, že musí nastavit filtry taky, aby odpovídali realitě a podle nich vybrat data. Ne všechny cross řádky ve filtru (rozuměj náhodně pospojované podmínky) odpovídají existujícím datům. Tak zůstává pouze možnost vytvořit si pomocnou tabulku, která zahrnuje veškeré přípustné kombinace hodnot filtrů. Této tabulce říkám kontingenční tabulka.

Na rozdíl od Excelovského chápaní kontingenční tabulky, takto sestavená tabulka zahrnuje pouze povolené kombinace filtrů.

Klasické řešení v dimenzím modelování. Máme tři filtry (filtr1,filtr2, filtr3) a tabulku faktů. Jednotlivé dimenze jsou napojeny přímo na tabulku faktů přes primární klíče.

Klasické řešení datového skladu

V případě, že potřebujeme sestavit filtr nad daty, který se skládá z hodnot všech filtrů, musely bychom dělat select asi následujícím způsobem:

1. Výběr všech hodnot pro 1. filtr

   select filtr1_id, filtr1_nazev from filtr1; 

2. Po výběru hodnot pro 1. filtr, by se nabídli tyto možné kombinace pro 2. filtr.

   select distinct filtr2_id, filtr2_nazev
     from filtr2 f2
     inner join tabulka_faktů tf
       on tf.filtr2_id = f2.filtr2_id and tf.filtr1_id in (<vybrané hodnoty id filtru1> 

Což by dlouho trvalo vzhledem k možné velikosti tabulky_faktů.

Elegantnějším řešením je použít kontingenční tabulku. Řešení s ní vypadá asi takto:

Mezi tabulku faktů a filtry je vložena kontingeční tabulka.

Podmínka pro výběr povolených hodnot druhého filtru je :

    Select distinct filtr2_id, filtr2_nazev
       from filtr2 f2
       inner join  kontingeční_tabulka kt
          on kt.filtr2_id = f2.filtr2_id and kt.filtr1_id in (<vybrané hodnoty id filtru1>); 

Poznámka :

1. Nad kontingenční tabulkou by mněl být definovaný constraint unique nad sloupci pro filtry, abychom zabezpečili referenční integritu dat.

   alter table kontigencni_tabulka
   add constraint uk_kontigencni tabulka unique (filtr1_id, filtr2_id, filtr3_id); 

2. V případě, že se použije tabulka faktů taky na propagaci (zobrazení) dat je výhodné dát do ní redundatně identifikátory filtrů, abz se jednoduše sestavil pohled na data.

Já tohle řešení upřednostňuji a používám tabulku faktů pro sestavení kontingeční tabulky, kterou pak aktualizuji referenci kontingent_id. Pak schéma s řešením je tohle :

Sdílet