Arhn - архитектура программирования

Денормализация: сколько это слишком много?

Я разработал базу данных для веб-приложения, которое создаю «по книге». То есть у меня:

  • Создана диаграмма E-R, содержащая сущности, атрибуты и отношения приложения.
  • Переведена диаграмма E-R в схему
  • Преобразовал схему в форму без схемы для моделирования базы данных (база данных - это база данных Cassandra (NoSQL)).

Все идет хорошо (пока). Раньше я денормализовал с отличными результатами, и сейчас я реализую часть приложения, которая будет использовать данные, которые еще не были денормализованы. Я предсказываю, что это существенно повысит производительность (чтение из 1 Column_Family («таблица» в реляционном мире) вместо 7).

Однако я боюсь, что могу слишком сильно денормализовать. Если бы я сделал это для рассматриваемой части, это бы в значительной степени уменьшило количество Column_Family / table в моем приложении примерно на 20%, а денормализованная часть моей базы данных по какой-то причине заставляет меня нервничать.

Если приложение окажется достаточно успешным, и я смогу привлечь к работе дизайнера или администратора базы данных, я бы хотел, чтобы он определил, что выполняемая мной денормализация необходима для производительности, которой я занимаюсь. ищущие (в лучшем случае) или, по крайней мере, не вредные (в худшем случае).

Есть ли конкретные вещи, на которые я должен обратить внимание при принятии решений по денормализации, которые могут указывать на то, будет ли это плохо, или это всегда сводится к скорости против ремонтопригодности?


  • Нормализуйте, пока не станет больно, денормализуйте, пока не заработает - анонимно. 15.12.2011
  • @MitchWheat: поиск этой цитаты привел меня к: stackoverflow.com/questions/47711/ И codinghorror.com/blog/2008/07/. Оба были полезны. Спасибо! 15.12.2011

Ответы:


1

Разработка схемы для cassandra сильно отличается от разработки схемы для базы данных sql. С базой данных sql ваши данные умещаются на одном компьютере, база данных будет поддерживать для вас индексы, вы можете выполнять соединения, и вы можете выполнять сложные запросы с помощью sql. Все это делает нормализацию данных практичной.

В cassandra ваши данные не помещаются на одном компьютере, поэтому вы не можете выполнять соединения, единственный запрос, который вы можете выполнить эффективно, - это получить диапазон столбцов по ключу, а cassandra будет поддерживать только ограниченные индексы для вас. Это делает невозможным нормализацию ваших данных.

В cassandra вы обычно разрабатываете свою схему для обслуживания запросов, которые вы собираетесь делать, и денормализуете их для этого. Мой любимый пример - то, что твиттер делает для своей статистики для Rainbird, как описано в этом сообщении. ,

For example, say someone clicks on a t.co link to blog.example.com/foo at 11:41am on 1st Feb. 
Rainbird would increment counters for:

 t.co click: com (all time)
 t.co click: com.example (all time)
 t.co click: com.example.blog (all time)
 t.co click: com.example.blog /foo (all time)
 t.co click: com (1st Feb 2011)
 t.co click: com.example (1st Feb 2011)
 t.co click: com.example.blog (1st Feb 2011)
 t.co click: com.example.blog /foo (1st Feb 2011)
 t.co click: com (11am-12 on 1st Feb)
 t.co click: com.example (11am-12 on 1st Feb)
 t.co click: com.example.blog (11am-12 on 1st Feb)
 t.co click: com.example.blog /foo (11am-12 on 1st Feb)
 t.co click: com (11:41-42 on 1st Feb)
 t.co click: com.example (11:41-42 on 1st Feb)
 t.co click: com.example.blog (11:41-42 on 1st Feb)
 t.co click: com.example.blog /foo (11:41-42 on 1st Feb)

Этот 1 щелчок копируется 16 раз, чтобы удовлетворить 16 возможных запросов.

Это хорошая презентация о том, как выполнять индексацию в кассандре.

15.12.2011

2

Как правило, требуется максимально возможное количество нормализации, особенно в отношении таблиц, которые, по вашему мнению, могут стать большими. Я пропустил нормализацию очень маленьких наборов данных или напрямую связанных данных, но никогда не для повышения производительности (для этого нужны серверы отчетов и ETL); Я считаю, что дополнительные усилия по дизайну и повторное объединение очень маленьких, напрямую связанных, редко меняющихся таблиц - это пустая трата времени с точки зрения разработки.

Больше всего меня беспокоит денормализация, это целостность данных и бесполезная трата места (на диске и в памяти) в этом порядке.

Единственное, что меня беспокоит при нормализации, - это ремонтопригодность; делать что-то очень простое гораздо более сложным, чем это действительно нужно, обычно бесплодно. Нормализация ради нормализации, насколько я понимаю, фанатична, и только ситхи имеют дело с абсолютом.

15.12.2011

3

Денормализация ради производительности - неплохая вещь. Вам необходимо учитывать цели вашего приложения / базы данных и то, как нормализация может помочь вам в их достижении.

Прежде всего, размещение таблицы в 1NF предполагает удаление избыточных данных или (Coronel, Rob 2009) «повторяющихся групп». Удаление данных в нескольких местах (будь то другие таблицы или строки) - это хорошо и помогает с обслуживанием, целостностью данных и производительностью.

Переход к 2NF предполагает устранение частичных зависимостей. Частичные зависимости существуют, когда у вас есть составной ключ (первичный ключ, состоящий из нескольких ключевых полей) и поля, значение которых определяется только одним или частью ключа. Обычно устранение частичных зависимостей начинается с того, что вы начинаете видеть таблицы мостов, созданные для обработки отношений «многие ко многим».

3NF - это еще один шаг в том, что он устраняет все транзитивные зависимости или поля, которые зависят от значения неключевых полей. Этот шаг часто обсуждается во имя производительности. В зависимости от размера или дисперсии значений транзитивных полей вы захотите взвесить проблемы, связанные с сохранением этих значений в таблице, по сравнению с тем, как часто вам придется ПРИСОЕДИНЯТЬСЯ, чтобы получить его.

Суть в том, что устранение избыточных данных и зависимых данных (частичных и транзитивных) - это хорошо. Но не позволяйте этому мешать вам делать то, что имеет смысл для вашего приложения.

С. Коронел, П. Роб (2009), «Системы баз данных: реализация проекта и управление», Курс «Технология», Бостон, Массачусетс (Глава 5)

15.12.2011
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..