Приведите пример спроектированной базы данных с денормализацией.

Ответ

Да, я проектировал денормализованные схемы для витрин данных, чтобы ускорить выполнение аналитических запросов. Классический пример — таблица sales_denormalized в хранилище данных.

Пример схемы:

CREATE TABLE sales_denormalized (
    sale_id INT PRIMARY KEY,
    sale_date DATE,
    customer_id INT,
    customer_name VARCHAR(100),
    customer_city VARCHAR(50),
    product_id INT,
    product_name VARCHAR(100),
    product_category VARCHAR(50),
    quantity INT,
    unit_price DECIMAL(10,2),
    total_amount DECIMAL(12,2),
    salesperson_id INT,
    salesperson_name VARCHAR(100),
    region VARCHAR(50)
);

Почему денормализация:

  • Производительность: Отсутствие JOIN между таблицами sales, customers, products, employees ускоряет отчеты.
  • Упрощение запросов: Аналитикам не нужно знать сложные связи.
  • Сценарий использования: Эта таблица была создана как агрегированная витрина для ежедневных отчетов по продажам. Данные обновлялись один раз в сутки через ETL-процесс.

Компромисс: Денормализация увеличивает объем хранилища и требует строгого процесса обновления для поддержания консистентности данных.

Ответ 18+ 🔞

А, ну это классика, блядь! Да, приходилось проектировать такие денормализованные схемы под витрины данных, чтобы аналитические запросы летали, а не ползали, как черепаха в сиропе. Самый простой пример — вот эта таблица sales_denormalized в каком-нибудь хранилище.

Вот, смотри, как она выглядит:

CREATE TABLE sales_denormalized (
    sale_id INT PRIMARY KEY,
    sale_date DATE,
    customer_id INT,
    customer_name VARCHAR(100),
    customer_city VARCHAR(50),
    product_id INT,
    product_name VARCHAR(100),
    product_category VARCHAR(50),
    quantity INT,
    unit_price DECIMAL(10,2),
    total_amount DECIMAL(12,2),
    salesperson_id INT,
    salesperson_name VARCHAR(100),
    region VARCHAR(50)
);

А теперь, ёпта, почему это сделано именно так, а не по канонам святых нормальных форм?

  • Производительность, ёбана! Всё просто: чтобы не было этих ебучих JOIN'ов между sales, customers, products и employees. Когда их соединяешь, особенно на овердохуища данных, запрос начинает думать, как будто у него манда с ушами. А тут всё плоским лежит — взял и прочитал. Скорость — пизда рулю.
  • Запросы для ленивых (или умных). Аналитикам, которые отчёты строят, похуй на ваши связи и ключи. Им дай одну таблицу, где всё есть, и они счастливы. Не надо каждый раз объяснять, как что связано — доверия ебать ноль, что они не накосячат.
  • Для чего конкретно? Эту штуку заточили под ежедневные отчёты по продажам. Данные туда загружались раз в сутки через ETL-процесс, и всё — свежая картина готова.

Но, чувак, компромиссы же есть, куда без них. Денормализация — это как набить холодильник про запас: места жрёт дохуя (объём хранилища растёт), и если не следить, то там сосиска прошлогодняя заваляется (консистентность данных). Нужен строгий процесс обновления, иначе получится пиздопроебибна, когда имя клиента в одной витрине одно, а в системе — другое. В общем, хитрая жопа этот подход, но когда надо быстро — он незаменим.