Нормалізовані й денормалізовані бази даних

Проєктування баз даних

Lis Sulmont

Curriculum Manager

Повернімось до прикладу з книгарнею

Денормалізована: схема «зірка»

$$

Нормалізована: схема «сніжинка»

$$

Проєктування баз даних

Денормалізований запит

Мета: отримати кількість усіх книжок Octavia E. Butler, проданих у Ванкувері в IV кварталі 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

Усього 3 обʼєднання (JOIN)

Проєктування баз даних

Нормалізований запит

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
Проєктування баз даних

Нормалізований запит (продовження)

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

Усього 8 обʼєднань (JOIN)

То навіщо ж нормалізувати бази даних?

Проєктування баз даних

Нормалізація заощаджує місце

Денормалізовані бази даних створюють надлишковість даних

Проєктування баз даних

Нормалізація заощаджує місце

Нормалізація усуває надлишковість даних

Проєктування баз даних

Нормалізація підвищує цілісність даних

$$

1. Забезпечує узгодженість даних

Потрібно дотримуватися правил найменувань через посилальну цілісність, напр., «California», не «CA» чи «california»

2. Безпечніше оновлювати, вилучати й додавати

Менше надлишковості = менше записів для зміни

3. Легше розширювати під час редизайну

Менші таблиці легше розширювати, ніж великі

Проєктування баз даних

Нормалізація баз даних

Переваги

  • Нормалізація усуває надлишковість даних: економія сховища

  • Краща цілісність даних: точність і узгодженість

Недоліки

  • Складні запити потребують більше CPU
Проєктування баз даних

Пам'ятаєте OLTP і OLAP?

OLTP

напр., операційні бази даних

Зазвичай високонормалізовані

  • Інтенсивний запис
  • У пріоритеті швидше й безпечніше внесення даних

OLAP

напр., сховища даних

Зазвичай менш нормалізовані

  • Інтенсивне читання
  • У пріоритеті швидші аналітичні запити
Проєктування баз даних

Давайте потренуємось!

Проєктування баз даних

Preparing Video For Download...