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.
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 :
SQL Developer
Přečteno 31 974×
Přečteno 19 551×
Přečteno 19 506×
Přečteno 17 273×
Přečteno 16 236×