Bazy znormalizowane i nieznormalizowane

Projektowanie baz danych

Lis Sulmont

Curriculum Manager

Powróćmy do przykładu księgarni

Nieznormalizowany: schemat gwiazdy

$$

Znormalizowany: schemat płatka śniegu

$$

Projektowanie baz danych

Zapytanie nieznormalizowane

Cel: uzyskać łączną ilość książek Octavii E. Butler sprzedanych w Vancouver w 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

Łącznie 3 złączenia

Projektowanie baz danych

Zapytanie znormalizowane

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
Projektowanie baz danych

Zapytanie znormalizowane (ciąg dalszy)

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

Łącznie 8 złączeń

Po co więc normalizować bazę danych?

Projektowanie baz danych

Normalizacja oszczędza miejsce

Bazy nieznormalizowane powodują redundancję danych

Projektowanie baz danych

Normalizacja oszczędza miejsce

Normalizacja eliminuje redundancję danych

Projektowanie baz danych

Normalizacja poprawia integralność danych

$$

1. Wymusza spójność danych

Wymagane przestrzeganie konwencji nazewnictwa ze względu na integralność referencyjną, np. 'California', nie 'CA' ani 'california'

2. Bezpieczniejsze aktualizowanie, usuwanie i wstawianie

Mniej redundancji = mniej rekordów do zmiany

3. Łatwiejsze przeprojektowanie przez rozszerzenie

Mniejsze tabele są łatwiejsze do rozbudowy

Projektowanie baz danych

Normalizacja baz danych

Zalety

  • Normalizacja eliminuje redundancję: oszczędność miejsca

  • Lepsza integralność danych: dokładne i spójne dane

Wady

  • Złożone zapytania wymagają więcej mocy CPU
Projektowanie baz danych

Pamiętasz OLTP i OLAP?

OLTP

np. bazy operacyjne

Zazwyczaj silnie znormalizowane

  • Intensywny zapis
  • Priorytet: szybkie i bezpieczne wstawianie danych

OLAP

np. hurtownie danych

Zazwyczaj słabiej znormalizowane

  • Intensywny odczyt
  • Priorytet: szybkie zapytania analityczne
Projektowanie baz danych

Czas na ćwiczenia!

Projektowanie baz danych

Preparing Video For Download...