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

Проектирование баз данных

Lis Sulmont

Curriculum Manager

Вернёмся к примеру с книжным магазином

Денормализованная: схема «звезда»

$$

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

$$

Проектирование баз данных

Денормализованный запрос

Цель: получить количество проданных книг Октавии Батлер в Ванкувере в 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 соединения

Проектирование баз данных

Нормализованный запрос

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 соединений

Так зачем же нормализовывать базу данных?

Проектирование баз данных

Нормализация экономит место

Денормализованные базы данных допускают избыточность данных

Проектирование баз данных

Нормализация экономит место

Нормализация устраняет избыточность данных

Проектирование баз данных

Нормализация повышает целостность данных

$$

1. Обеспечивает согласованность данных

Соблюдение соглашений об именовании обязательно благодаря ссылочной целостности, например: «California», а не «CA» или «california»

2. Безопасное обновление, удаление и вставка

Меньше избыточности — меньше записей для изменения

3. Простое расширение схемы

Маленькие таблицы легче расширять, чем большие

Проектирование баз данных

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

Преимущества

  • Нормализация устраняет избыточность данных: экономия места

  • Улучшенная целостность данных: точность и согласованность

Недостатки

  • Сложные запросы требуют больше ресурсов CPU
Проектирование баз данных

Вспомним OLTP и OLAP

OLTP

Например, операционные базы данных

Как правило, высоко нормализованы

  • Интенсивная запись
  • Приоритет — быстрая и надёжная вставка данных

OLAP

Например, хранилища данных

Как правило, менее нормализованы

  • Интенсивное чтение
  • Приоритет — быстрые запросы для аналитики
Проектирование баз данных

Давайте потренируемся!

Проектирование баз данных

Preparing Video For Download...