В заданной предметной области аналитики логов для OLAP обсуждайте компромисс между нормализацией и денормализацией в схеме базы данных, приведите конкретные примеры структуры таблиц и объясните последствия для скорости запросов и объёма хранения

21 Ноя в 10:47
2 +1
0
Ответы
1
Коротко — компромисс сводится к выбору между меньшим объёмом хранения и гибкостью (нормализация) и скоростью выполнения аналитических запросов / простотой исполнения (денормализация). Ниже — объяснение с конкретными примерами и численными оценками.
1) Примеры структур
- Нормализованная (реляционная, фактовая таблица + размерности):
- fact_logs: ‘eventidPK‘,‘tsTIMESTAMP‘,‘useridINTFK‘,‘endpointidINTFK‘,‘statusidSMALLINT‘,‘bytessentBIGINT‘`event_id PK`, `ts TIMESTAMP`, `user_id INT FK`, `endpoint_id INT FK`, `status_id SMALLINT`, `bytes_sent BIGINT`eventi dPK,tsTIMESTAMP,useri dINTFK,endpointi dINTFK,statusi dSMALLINT,bytess entBIGINT - dim_user: ‘useridPK‘,‘emailVARCHAR‘,‘tenantidINT‘,…`user_id PK`, `email VARCHAR`, `tenant_id INT`, …useri dPK,emailVARCHAR,tenanti dINT, - dim_endpoint: ‘endpointidPK‘,‘pathVARCHAR‘,‘serviceVARCHAR‘`endpoint_id PK`, `path VARCHAR`, `service VARCHAR`endpointi dPK,pathVARCHAR,serviceVARCHAR - dim_status: ‘statusidPK‘,‘codeINT‘,‘descVARCHAR‘`status_id PK`, `code INT`, `desc VARCHAR`statusi dPK,codeINT,descVARCHAR
- Денормализованная (широкая строка, все поля вместе):
- events_wide: ‘eventidPK‘,‘tsTIMESTAMP‘,‘useremailVARCHAR‘,‘tenantidINT‘,‘endpointpathVARCHAR‘,‘serviceVARCHAR‘,‘statusINT‘,‘bytessentBIGINT‘`event_id PK`, `ts TIMESTAMP`, `user_email VARCHAR`, `tenant_id INT`, `endpoint_path VARCHAR`, `service VARCHAR`, `status INT`, `bytes_sent BIGINT`eventi dPK,tsTIMESTAMP,usere mailVARCHAR,tenanti dINT,endpointp athVARCHAR,serviceVARCHAR,statusINT,bytess entBIGINT
2) Последствия для скорости запросов
- При аналитике типовые запросы — агрегации по времени/эндпоинту/статусу. В нормализованной схеме требуется join fact → dim (по целым ключам). Если размеры dimension малы и ключи — целые, joins дешевы, но остаётся I/O: нужно сканировать факт-таблицу.
- В денормализованной схеме joins отсутствуют → меньше CPU на джоины и меньше случайных обращений к страницам, поэтому простые агрегирования обычно быстрее.
- Пример: пусть количество строк в факте за день N=108N = 10^8N=108. Оценим объём данных на строку:
- нормализованная: ключи и числа ≈ ‘ts‘8байт+‘userid‘4+‘endpointid‘4+‘status‘2+‘bytessent‘8+накладные20`ts` 8 байт + `user_id` 4 + `endpoint_id` 4 + `status` 2 + `bytes_sent` 8 + накладные 20ts‘8байт+useri d‘4+endpointi d‘4+status‘2+bytess ent‘8+накладные20≈46\approx 4646 байт/строка.
- денормализованная: добавляем строки для email/paths (средняя длина) ≈ ‘email‘64+‘path‘64`email` 64 + `path` 64email‘64+path‘64 → примерно ≈150\approx 150150 байт/строка.
- Суммарно: нормализ. объём ≈ N×46N \times 46N×46 байт = 4.64.64.6 ГБ (для N=108N=10^8N=108); денорм. объём ≈ N×150N \times 150N×150 байт = 151515 ГБ.
- Если дисковая/сетевая пропускная способность T=1T = 1T=1 ГБ/с, простой полный скан даст время:
- нормализ.: 4.6 ГБ1 ГБ/с=4.6 с \frac{4.6\ \text{ГБ}}{1\ \text{ГБ/с}} = 4.6\ \text{с}1 ГБ/с4.6 ГБ =4.6 с - денорм.: 15 ГБ1 ГБ/с=15 с \frac{15\ \text{ГБ}}{1\ \text{ГБ/с}} = 15\ \text{с}1 ГБ/с15 ГБ =15 с
3) Последствия для объёма хранения
- Нормализация уменьшает дублирование полей (строковые значения хранятся в одном месте в dim), поэтому сырой объём основной таблицы меньше.
- Денормализация увеличивает объём, но в колоннарных форматах (Parquet/ORC) повторяющиеся строки хорошо сжимаются: эффективность компрессии для повторяющихся строк может давать фактор сжатия ccc, поэтому эффективный объём денормализации может быть значительно меньше теоретического. Пример: если колонка `endpoint_path` имеет всего 10310^3103 уникальных значений на 10810^8108 строк, компрессия/строковое кодирование снизит стоимость хранения этой колонки почти до размера словаря + битных кодов.
- Итого: без учёта сжатия — денормализация ≈ ×3\times 3×3 объёма; с хорошей компрессией — разница может упасть до ×1.2–1.5 \times 1.2\text{–}1.5×1.21.5.
4) Другие факторы
- Частые вставки/стриминг: нормализованная схема проще поддерживать консистентность при обновлениях dim; денормализация усложняет обновления (нужно менять много строк).
- Индексы/сортировки/партиционирование: нормализованная факт-таблица легче партиционируется по времени и индексируется по целым ключам; в колоннарных хранилищах лучше проектировать широкой денормализацией только если выгоды операций перевешивают стоимость хранения.
- Материализованные представления / предварительные агрегаты: часто лучший компромисс — хранить нормализованную факт-таблицу + набор денормализованных/материализованных таблиц для «горячих» отчётов. Это даёт баланс между экономией места и скоростью запросов.
5) Практические рекомендации
- OLAP для логов: обычно использовать звёздную модель (факт + компактные измерения с суррогатными ключами) — меньше дублирования в факте и быстрые joins по целым ключам.
- Денормализовать (или хранить кеш/материализованные агрегаты) для часто выполняемых сложных запросов/дашбордов.
- Использовать колоннарное хранилище и кодирование словаря для строковых dimension-полей — это снижает стоимость денормализации.
- Измерять: сравнивать реальные байты на диск/скорость скана/латентность для ваших N и распределений cardinality, прежде чем решать.
Короткая формула выбора: если критична скорость ad‑hoc агрегации и джойны создают узкое место → денормализация/предагрегаты; если важны хранение и гибкость при изменениях размеров — нормализация (и материализованные представления для ускорения горячих запросов).
21 Ноя в 11:30
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир