GOC644 — DAX základy (2 dny)
1. Úvod do Power BI 2. Datový model 3. Úvod do DAX 4. Oblasti použití DAX 5. Kontext výpočtu 6. Časová inteligence 7. Optimalizace DAX 8. Row Level Security 9. Nástroje
GOC6441 — Pokročilý DAX (2 dny)
1. Opakování & přehled 2. Dynamické reporty 3. DAX jako dotazovací jazyk 4. VertiPaq engine 5. Ladění výkonu 6. Composite Models 7. Workshop
Cvičení
1. Datový model 2. DAX základy 3. Kontext výpočtu 4. Časová inteligence
🏠 Rozcestník kurzů
Kapitola 2

Tvorba datového modelu

Naučte se konstruovat efektivní a měřítko schopné datové modely pro Power BI
⏱️ Přibližně 90 minut 📊 Pokročilé koncepty 💾 Praktické příklady

Co se naučíte

  • Porovnat tři způsoby načítání dat: Import, Direct Query
    📝
    Na blogu Jiřího Neorala: Power BI – Live connection vs. Import, comparison and limitations — podrobné srovnání Import vs Live Connection (anglicky)
    a Live Connection
  • Importovat a transformovat data z SQL Serveru v Power Query
  • Vytvářet a spravovat relace mezi tabulkami
  • Návrh optimalních schémat (Star vs Snowflake)
  • Implementovat many-to-many relace s bridge tabulkami
  • Respektovat best practices pro pojmenování a strukturu modelu
2.1

Načítání dat: Tři přístupy

Power BI nabízí tři hlavní způsoby, jak zaintegovat data do vašeho modelu. Každý přístup má své výhody a omezení, které je nutné pochopit pro správný výběr v kontextu vaší situace.

Import (Storage Mode: Import)

Import zkopíruje data do paměti Power BI, kde se komprimují pomocí VertiPaq enginu. Toto je nejrychlejší přístup pro analytiku, ale vyžaduje správu kapacity.

Aspekt Popis
Výhody Nejrychlejší, offline dostupnost, plná podpora DAX
Omezení 1 GB na Shared/Pro; Premium/Fabric s Large Dataset Format až 400 GB+; Power BI Desktop bez pevného limitu (závisí na RAM); refresh nutný pro aktuálnost
Kdy používat Historická data, < 1 miliarda řádků, interaktivní analýza

DirectQuery (Storage Mode: DirectQuery)

DirectQuery vytvoří Connect s podkladovým zdrojem dat. Dotazy se překládají do nativního SQL nebo jiného dialektu a vrací se výsledky v reálném čase bez kopírování dat.

Aspekt Popis
Výhody Vždy aktuální data, bez omezení kapacity, nízké paměti
Omezení Pomalejší, někdy nedostupné DAX funkce, výkon závisí na source
Kdy používat Real-time data, velké datové sady, high-frequency updates

Live Connection (Storage Mode: Live Connection)

Live Connection se připojuje k Analysis Services (SSAS) nebo ke sdíleným sémantickým modelům v Power BI Service. Data zůstávají na serveru, Power BI Desktop slouží pouze jako frontendový nástroj. Pro připojení ke sdíleným modelům v Service stačí licence Pro — Premium není podmínkou.

Aspekt Popis
Výhody Centralizovaný model, bezpečnost, Enterprise standardy
Omezení SSAS Tabular nebo sdílený sémantický model v Power BI Service (Pro/Premium)
Kdy používat Enterprise setup, sdílený Tabular model na serveru
💡
Composite Model (Hybrid přístup): Můžete kombinovat Import a DirectQuery v jednom modelu — například importovat referenční data (dimenze) a DirectQuery pro fakta. Live Connection je exkluzivní — při jeho použití nelze přidávat lokální Import ani DirectQuery tabulky (přidání lokálních tabulek vyžaduje přepnutí do Composite Mode).
2.2

Import z SQL Serveru (AdventureWorks DW 2019)

Praktická implementace: Importování tabulek z AdventureWorks DW 2019 do Power BI a transformace v Power Query.

1
Připojení k SQL Serveru

V Power BI Desktop: Get Data > SQL Server > Enter server, authentication, database.

2
Výběr tabulek

Vyberte z dostupných: FactResellerSales, DimDate, DimProduct, DimReseller, DimEmployee.

3
Power Query transformace

Odeberte nepotřebné sloupce, přejmenujte, normalizujte data, stanovte datové typy.

SQL
SELECT
  frs.SalesOrderNumber,
  frs.OrderDate,
  frs.SalesAmount,
  dp.EnglishProductName,
  dr.ResellerName,
  dd.FullDateAlternateKey
FROM FactResellerSales frs
INNER JOIN DimProduct dp ON frs.ProductKey = dp.ProductKey
INNER JOIN DimReseller dr ON frs.ResellerKey = dr.ResellerKey
INNER JOIN DimDate dd ON frs.OrderDateKey = dd.DateKey

Alternativně můžete importovat celé tabulky a relace nastavit později v modelu.

⚠️
Performance tip: Import voláním SQL dotazu (Native Query) je lepší než import celé tabulky + filtrování později. Snižuje objem transferovaných dat.
2.3

Relace mezi tabulkami

Relace (relationships) spojují tabulky v modelu a definují, jak se filtry šíří. Klíčová rozlišení: kardinalita a směr filtrace.

Kardinalita relací

Typ Příklad Popis
1:N (One-to-Many) DimProduct (1) → FactSales (N) Nejčastější. Jeden produkt má mnoho prodejů.
1:1 (One-to-One) DimEmployee (1) → DimEmployeePhoto (1) Vzácnější. Jeden zaměstnanec má jednu fotku.
M:N (Many-to-Many) DimProduct (M) ↔ DimCategory (N) Power BI podporuje přímou M:N od 2018. Bridge tabulka doporučena tam, kde hrozí double-counting (fact-to-fact M:N).

Směr filtrace (Filter Direction)

Jednosměrný (One Direction): Filtry z jedné strany (obvykle dimenze) se šíří na druhou stranu (fakta).

Obousměrný (Both Directions): Filtry se šíří oběma směry. Používejte opatrně—může zpomalit výkon.

DAX
-- Syntaxe TMDL / Tabular Editor (ve formula baru Power BI Desktop
-- píšete jen tělo výrazu bez klíčového slova MEASURE)
-- USERELATIONSHIP aktivuje neaktivní relaci v CALCULATE
MEASURE FactSales[Sales by Active Rel] =
  SUM(FactSales[Amount])

MEASURE FactSales[Sales by Inactive Rel] =
  CALCULATE(
    SUM(FactSales[Amount]),
    USERELATIONSHIP(FactSales[DateKey], DimDate[DateKey])
  )
ℹ️
Aktivní vs Neaktivní relace: Pokud máte více relací mezi stejnými tabulkami, Power BI aktivuje jednu jako výchozí. Ostatní musíte aktivovat explicitně pomocí USERELATIONSHIP v DAX.
2.4

Hierarchie dat

Hierarchie umožňují drill-down z vyšší úrovně (rok) na nižší (den). Typicky se používají s kalendárními daty.

Hierarchie kalendáře: Year → Quarter → Month → Day

Úroveň DAX výraz Příklad
Year YEAR([Date]) 2023
Quarter "Q" & FORMAT([Date], "Q") Q3
Month FORMAT([Date], "mmmm") August
Day [Date] 2023-08-15

V Power BI Desktop: Vyberte sloupce v Field listu → pravý klik → New hierarchy → drag sloupce v pořadí.

💡 Zobrazit nápovědu
Hierarchie jsou особливě užitečné pro vizualizace s drill-down v Matthew clustered column chartech nebo Table vizualizacích.
2.5

Star Schema vs Snowflake Schema

Star Schema (Hvězda)

Jedna centrální fact tabulka obklopena dimenzemi bez dalšího normalizace.

  • ✓ Jednoduchý model, rychlé dotazy
  • ✓ Méně relací, méně CALCULATE potřeba
  • ✗ Redundance v dimenzích (e.g., City → State → Country opakovaně)

Snowflake Schema (Sníh)

Dimenze jsou dále normalizovány do Related tabulek (e.g., DimGeography > DimCity > DimState).

  • ✓ Nízká redundance, čistší struktura
  • ✓ Lepší pro správu údajů (jedna záznamu geography jednou)
  • ✗ Více relací, složitější CALCULATE výrazy
✓
Doporučení: Začněte se Star schema. Snowflake použijte, pokud máte significantní redundanci či komplexní hierarchie v dimenzích.
2.6

Many-to-Many relace

Power BI podporuje přímou M:N kardinalitu nativně od roku 2018 — bez bridge tabulky. Bridge tabulka je doporučená best practice zejména v situacích, kde hrozí double-counting (typicky fact-to-fact M:N, např. FactSales ↔ FactBudget). Pro dimension-to-dimension M:N (produkt ve více kategoriích) přímá M:N obvykle funguje správně.

Implementace s Bridge tabulkou

1
Vytvořit BridgeTable

BridgeProductCategory: ProductKey, CategoryKey (bez duplikátů)

2
Relace

FactSales → BridgeProductCategory (1:N) a BridgeProductCategory → DimCategory (N:1)

DAX
-- Power Query: vytvoření Bridge tabulky z Excel/SQL
let
    Source = Sql.Database("server", "database"),
    ProductCategories = Table.Distinct(
        Table.SelectColumns(..., {"ProductKey", "CategoryKey"})
    )
in
    ProductCategories
⚠️
Pozor na double-counting: Přímá M:N relace mezi dvěma fact tabulkami (např. FactSales ↔ FactBudget) může vést k nesprávným agregacím. V takovém případě bridge tabulka zajistí správnou granularitu. Dimension-to-dimension M:N (produkt ↔ kategorie) přímou M:N zvládne bezpečně.
2.7

Best Practices pro datový model

Pojmenování

  • Tabulky: CamelCase, singulární (DimProduct, FactSales, ne DimProducts)
  • Sloupce: CamelCase, popisný (OrderDate, ne OD; SalesAmount, ne SA)
  • Míry: Bez prefixu tabulky ([Total Sales], ne [FactSales Total Sales])
  • Sloupce klíčů: Prefix Key (ProductKey, DateKey) pro jasnost

Struktura

  • Skryjte všechny sloupce klíčů (Properties > Hidden)
  • Skryjte referenční sloupce, které nejsou potřebné v UI
  • Organizujte dimenze a fakta do skupin (Folders)
  • Vytvořte datum tabulka (CALENDAR) s kompletní hierarchií

Ověření

  • Zkontrolujte kardinalitu relací (ne opačně: N:1 místo 1:N)
  • Ověřte referenční integritu (všechny FK v dimenzích existují)
  • Otestujte filtry v vizualizacích—měly by se šířit správně
💡
Model cleanup: Pravidelně odeberte nevyužívané tabulky, sloupce a míry. Čistý model je snadněji spravovatelný a výkonnější.