Genormaliseerde en gedenormaliseerde databases

Databaseontwerp

Lis Sulmont

Curriculum Manager

Terug naar ons boekwinkelvoorbeeld

Gedenormaliseerd: ster-schema

$$

Genormaliseerd: sneeuwvlokschema

$$

Databaseontwerp

Gedenormaliseerde query

Doel: aantal verkochte boeken van Octavia E. Butler in Vancouver in Q4 2018

  SELECT SUM(quantity) FROM fact_booksales
    -- Join to get city
    INNER JOIN dim_store_star on fact_booksales.store_id = dim_store_star.store_id
    -- Join to get author
    INNER JOIN dim_book_star on fact_booksales.book_id = dim_book_star.book_id
    -- Join to get year and quarter
    INNER JOIN dim_time_star on fact_booksales.time_id = dim_time_star.time_id
  WHERE 
    dim_store_star.city = 'Vancouver' AND dim_book_star.author = 'Octavia E. Butler' AND
    dim_time_star.year = 2018 AND dim_time_star.quarter = 4;
7600

Totaal 3 joins

Databaseontwerp

Genormaliseerde query

SELECT
  SUM(fact_booksales.quantity)
FROM
  fact_booksales
  -- Join to get city
  INNER JOIN dim_store_sf ON fact_booksales.store_id = dim_store_sf.store_id
  INNER JOIN dim_city_sf ON dim_store_sf.city_id = dim_city_sf.city_id
  -- Join to get author
  INNER JOIN dim_book_sf ON fact_booksales.book_id = dim_book_sf.book_id
  INNER JOIN dim_author_sf ON dim_book_sf.author_id = dim_author_sf.author_id
  -- Join to get year and quarter
  INNER JOIN dim_time_sf ON fact_booksales.time_id = dim_time_sf.time_id
  INNER JOIN dim_month_sf ON dim_time_sf.month_id = dim_month_sf.month_id
  INNER JOIN dim_quarter_sf ON dim_month_sf.quarter_id =  dim_quarter_sf.quarter_id
  INNER JOIN dim_year_sf ON dim_quarter_sf.year_id = dim_year_sf.year_id
Databaseontwerp

Genormaliseerde query (vervolg)

WHERE
  dim_city_sf.city = `Vancouver`
  AND 
  dim_author_sf.author = `Octavia E. Butler`
  AND
  dim_year_sf.year = 2018 AND dim_quarter_sf.quarter = 4; 
sum
7600

Totaal 8 joins

Waarom zouden we een database normaliseren?

Databaseontwerp

Normaliseren bespaart ruimte

Gedenormaliseerde databases zorgen voor gegevensredundantie

Databaseontwerp

Normaliseren bespaart ruimte

Normaliseren elimineert gegevensredundantie

Databaseontwerp

Normaliseren verbetert dataintegriteit

$$

1. Borgt gegevensconsistentie

Houd naamgevingsconventies aan vanwege referentiële integriteit, bijv. ‘California’, niet ‘CA’ of ‘california’

2. Veiliger updaten, verwijderen en invoegen

Minder redundantie = minder records om te wijzigen

3. Makkelijker uitbreiden bij redesign

Kleinere tabellen zijn makkelijker uit te breiden dan grote

Databaseontwerp

Database-normalisatie

Voordelen

  • Normaliseren elimineert redundantie: bespaart opslag

  • Betere dataintegriteit: nauwkeurige en consistente data

Nadelen

  • Complexe queries vragen meer CPU
Databaseontwerp

Weet je OLTP en OLAP nog?

OLTP

bijv. operationele databases

Meestal sterk genormaliseerd

  • Schrijfintensief
  • Focus op sneller en veiliger invoeren

OLAP

bijv. datawarehouses

Meestal minder genormaliseerd

  • Leesintensief
  • Focus op snellere queries voor analytics
Databaseontwerp

Laten we oefenen!

Databaseontwerp

Preparing Video For Download...