Почему многие проекты игнорируют нормализацию в RDBMS?

23

Я видел много проектов, которые нормализация не была первым соображением в фазе принятия решения.

Во многих случаях эти проекты включали более 30 столбцов, и основным подходом было «поставить все на одно место»

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

Редактировать:

Правда ли, что хорошие архитекторы и эксперты выбирают денормализованный дизайн, а неопытные разработчики - наоборот? Каковы аргументы против запуска вашего проекта с учетом нормализации?

Йоси Дахари
источник
7
потому что нормализованным базам данных нужно много объединений даже для самых тривиальных запросов
ratchet freak
1
эти объединения все равно должны будут происходить, даже скрытые взглядами
странный урод
29
Многие программисты не знают основ реляционной модели.
mike30
10
«Нормализуй, пока не болит, денормализуй, пока не заработает». codinghorror.com/blog/2008/07/… имеет несколько хороших ответов.
Мэтью Стиплс
3
Они игнорируют это, потому что им не нужно отвечать администраторам баз данных, аналитикам BI или аудиторам безопасности.
Aaronaught

Ответы:

19

Что интересно в этой теме вопросов и ответов, так это то, что на самом деле есть 3 вопроса. Все ответили по-разному, и почти никто не ответил на первый:

  1. Почему не некоторые базы данных в дикой природе нормализовались?
  2. Почему / когда нормализованная база данных должна быть денормализована ?
  3. В каких ситуациях это в первую очередь вредно или не нужно нормализовать?

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

Кроме того, в этом ответе я предполагаю, что «нормализация» подразумевает «BCNF, 3NF или, по крайней мере, 2NF» , поскольку это уровень нормализации, который обычно стремятся достичь разработчики. Реже можно увидеть дизайн 4NF или 5NF; хотя они, безусловно, не являются невозможными целями, они озабочены не только их представлением , но и семантикой отношений , что требует значительно большего знания предметной области.

Итак, вперед и вверх:

1. Почему некоторые базы данных в дикой природе не нормализуются?

Ответом на это может быть «потому что они не должны быть», но сделать такое предположение сразу же - это довольно бедная детективная работа. Мы не достигли бы большого прогресса в обществе, если бы всегда действовали исходя из того, что все должно быть.

Реальные причины, по которым базы данных не нормализуются в первую очередь, более сложны. Вот лучшие 5, с которыми я столкнулся:

  • Разработчики, которые проектировали это , не знали или не понимали, как нормализовать. Убедительным доказательством этого является множество других сопутствующих неудачных вариантов дизайна, таких как использование столбцов varchar для всего или наличие спагетти-беспорядка бессмысленных имен таблиц и столбцов . И я вас уверяю, я видел «настоящие» базы данных, которые ничуть не хуже, чем в статьях TDWTF.

  • Разработчикам, которые его разработали, было все равно или они активно выступали против нормализации в принципе . Обратите внимание, здесь я не говорю о случаях, когда было принято преднамеренное решение не нормализоваться на основе контекстного анализа, а о командах или компаниях, где нормализация более или менее понятна, а просто игнорируется или избегается по привычке. Опять удивительно часто.

  • Программное обеспечение было / было сделано как проект Brownfield . Многие пуристы игнорируют этот совершенно законный бизнес, а не техническую причину не нормализации. Иногда на самом деле вам не удается спроектировать новую базу данных с нуля, вы должны использовать существующую унаследованную схему, и попытка нормализации на этом этапе потребует слишком много боли. 3NF не был изобретен до 1971 года, и некоторые системы - особенно финансовые / бухгалтерские системы - имеют свои корни еще дальше!

  • Первоначально база данных была нормализована , но накопление небольших изменений за длительный период времени и / или широко распространенная команда представили тонкие формы дублирования и другие нарушения любой нормальной формы, которая изначально была на месте. Другими словами, потеря нормализации была случайной , и слишком мало времени было потрачено на рефакторинг.

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

2. Почему / когда нормализованная база данных должна быть денормализована?

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

  • Создайте индексированные представления, которые инкапсулируют наиболее распространенные проблемные области. Современные СУБД способны сделать их вставляемыми или обновляемыми (например, INSTEAD OFтриггеры SQL Server ). Это требует небольших затрат на операторы DML в базовых таблицах / индексах, но, как правило, это первый вариант, который вы должны попробовать, потому что его практически невозможно испортить и почти ничего не стоит обслуживать. Конечно, не каждый запрос можно превратить в индексированное представление - агрегированные запросы являются наиболее проблемными. Что приводит нас к следующему пункту ...

  • Создайте денормализованные таблицы агрегирования, которые автоматически обновляются триггерами. Эти таблицы существуют в дополнение к нормализованным таблицам и образуют своего рода модель CQRS . Другая модель CQRS, более популярная в наши дни, заключается в использовании pub / sub для обновления моделей запросов, что дает преимущество асинхронности, хотя это может не подходить в очень редких случаях, когда данные не могут быть устаревшими.

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

3. В каких ситуациях нормализовать вредно или нет необходимости?

На самом деле, здесь есть несколько хороших примеров:

  • Если база данных используется только для отчетности / анализа. Как правило, это подразумевает, что для OLTP используется дополнительная нормализованная база данных, которая периодически синхронизируется с базой данных анализа посредством ETL или обмена сообщениями.

  • При применении нормализованной модели потребовался бы излишне сложный анализ поступающих данных. Примером этого может быть система, которая должна хранить телефонные номера, которые собраны из нескольких внешних систем или базы данных. Вы можете денормализовать код вызова и код города, но вам придется учитывать все возможные форматы, недопустимые номера телефонов, туалетные номера (1-800-GET-STUFF), не говоря уже о разных локалях. Обычно это больше проблем, чем стоит, и телефонные номера обычно просто помещаются в одно поле, если только у вас нет особой бизнес-потребности в коде города.

  • Когда реляционная база данных в первую очередь предназначена для обеспечения поддержки транзакций для дополнительной нереляционной базы данных. Например, вы можете использовать реляционную базу данных в качестве очереди сообщений или для отслеживания статуса транзакции или саги, когда первичные данные хранятся в Redis, MongoDB или чем-то еще. Другими словами, данные являются «контрольными данными». Обычно нет смысла нормализовывать данные, которые на самом деле не являются бизнес-данными .

  • Сервис-ориентированные архитектуры, которые совместно используют физическую базу данных. Это немного странным один, но в истинном SOA, вы будете время от времени необходимо иметь данные физически дублируется , поскольку услуги не могут напрямую запрашивать данные друг друга. Если они случаются , чтобы делить ту же физическую базу данных, данные будут отображаться не будут нормализованы - но , как правило, данные , принадлежащие каждой отдельной услуги является еще нормализованы , если один из других смягчающих факторов не на месте. Например, службе выставления счетов может принадлежать объект счета, но службе учета необходимо получать и хранить дату и сумму счета, чтобы включить ее в доход за этот год.

Я уверен, что есть больше причин, которые я не перечислил; По сути, я понимаю, что они весьма специфичны и будут достаточно очевидны, когда они появятся на практике. Предполагается, что в базах данных OLAP используются схемы типа «звезда», SOA должны иметь некоторое дублирование и т. Д. Если вы работаете с хорошо известной моделью архитектуры, которая просто не работает с нормализацией, то вы не нормализуетесь; Вообще говоря, модель архитектуры имеет приоритет над моделью данных.

И ответить на самый последний вопрос:

Правда ли, что хорошие архитекторы и эксперты выбирают денормализованный дизайн, а неопытные разработчики - наоборот? Каковы аргументы против запуска вашего проекта с учетом нормализации?

Нет, это полная и полная BS Это также BS, что эксперты всегда выбирают нормализованный дизайн. Эксперты не просто следуют мантре. Они исследуют, анализируют, обсуждают, уточняют и повторяют, а затем выбирают подход, наиболее подходящий для их конкретной ситуации.

База данных 3NF или BCNF обычно является хорошей отправной точкой для анализа, поскольку она была опробована и доказана как успешная в десятках тысяч проектов по всему миру, но опять же, как и в случае с C. Это не означает, что мы автоматически используем C в каждом новый проект. В реальных ситуациях могут потребоваться некоторые модификации модели или использование другой модели в целом. Вы не знаете, пока не окажетесь в такой ситуации.

Aaronaught
источник
1
Вы должны скопировать и вставить это в статью блога ... это ЗОЛОТО.
Марсель Попеску
15

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

Нормализация дает вам несколько ключевых преимуществ:

  1. Минимизирует количество избыточных данных.
  2. Максимизирует степень, в которой встроенные в базу данных механизмы целостности (ограничения внешнего ключа, ограничения уникальности) могут быть использованы для обеспечения целостности данных.
  3. Уменьшает количество столбцов в строке, увеличивая эффективность ввода-вывода в некоторых случаях. Широкие ряды требуют больше времени для извлечения.

Тем не менее, есть много веских причин для денормализации:

  1. Производительность, особенно для аналитики, может быть снижена путем нормализации. Для анализа на основе реляционных баз данных стандартными являются денормализованные размерные модели .
  2. Преимущество обеспечения целостности данных внутри базы данных начинает уменьшаться. Поскольку все больше и больше разработок сосредоточено на объектно-ориентированном среднем уровне, который часто обеспечивает соблюдение бизнес-правил, зависимость от реляционных ограничений в базе данных менее важна.
  3. Как уже упоминалось, нормализация усложнит запросы, необходимые для получения соответствующих данных.

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

Статья Джеффа Этвуда, на которую ссылаются в комментариях выше, дает хорошее подробное обсуждение - «Возможно, нормализация - это не нормально» .

DemetriKots
источник
7
Привет Йоси, я понимаю вашу точку зрения. Нормализация является основой для реального понимания теории реляционных баз данных и имеет реальное применение на практике, поэтому неудивительно, что это большая тема в курсах. Хорошие инженеры должны понимать это и понимать, когда это следует применять. То, что, по-видимому, не рассматривается в курсовой работе, заключается в том, что выборочная денормализация может принести большую пользу, а некоторые проблемы действительно не поддаются нормированным моделям.
DemetriKots
1
Как насчет согласованности данных? Например, если у вас есть название магазина в каждой детали продаж, то у вас могут быть разные противоречивые описания, тогда как если данные нормализованы, название магазина отображается только одно (в таблице магазинов), и нет места для несогласованности.
Тулаинс Кордова
1
Я согласен. Я думаю, что нормализация иногда используется администраторами баз данных, которых учили, что это лучший дизайн. Я всегда говорил, что администраторы баз данных могут нормализовать таблицы в ETL все, что хотят, но когда дело касается таблиц ссылок на пользовательский интерфейс, мне нужны таблицы, которые можно легко запрашивать без чрезмерных объединений. Я столкнулся с таблицами, которые были настолько чрезмерно нормализованы, что едва могли решать проблемы пользователей, не тратя часов на устранение неполадок.
L_7337
1
Наоборот, аналитика безумно трудна, если вы не можете начать с нормализованной модели. Мне просто нужно было пройти это упражнение, и это был ад. Разработчики приложений никогда не должны предполагать, что денормализованная схема подойдет для нужд аналитики. А что касается пункта 3 против нормализации, это проблема, которая почти тривиально решается материализованными / индексированными представлениями.
Aaronaught
1
И № 2 звучит разумно, но на практике это вызывает недоверие - я не могу вспомнить ни одного случая за мои 10 с лишним лет, когда приложения действительно тщательно контролировали ограничения. Чаще всего разработчики либо неправильно приравнивают бизнес-правила к целостности данных, либо используют тот факт, что ORM теоретически могут применять реляционные ограничения в качестве предлога, чтобы вообще ничего не делать. Может быть, я просто циничен, но весь мой профессиональный опыт научил меня тому, что заявления типа «приложение обеспечит целостность данных» - это огромные красные флажки.
Aaronaught
11
  1. Многие разработчики не знают или не заботятся о нормализации, или о моделировании данных или базе данных.
  2. Для некоторых работ это действительно не важно.
  3. Иногда есть действительно веская причина для нормализации, например, для того, чтобы конкретная трудная рабочая нагрузка работала хорошо.
  4. Концепции реляционных баз данных в последнее время не так популярны, как в 1990-х и 2000-х годах. На разработчиков, как правило, влияет мода, даже если они утверждают, что они очень рациональны. Там нет смысла спорить о вкусе.

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

joshp
источник
Я бы добавил к этому, что иногда реляционный не совсем правильный дизайн для базы данных; например, каталог LDAP является иерархическим, некоторые другие типы могут лучше обслуживаться плоским дизайном.
Максимус Минимус
1
Что касается пункта № 4, я бы сказал, что реляционные базы данных не так популярны, и их начинают заменять на разновидности nosql, и это на самом деле замечательно в большинстве случаев. Но я не вижу много движителей и шейкеров, собирающих нереляционные модели данных с использованием РСУБД. Это просто глупо.
Aaronaught
@joshp - Спасибо, хорошее резюме. пункт № 3 - это тот, который лично меня больше интересует. Почему другие факторы «побеждают» необходимость нормализации.
Йоси Дахари
@JimmyShelter Я согласен. Помимо моды, реляционные отношения - не всегда лучший выбор.
Joshp
4
@Yosi - причина, по которой некоторые факторы могут превзойти нормализацию, состоит в том, что нормализация - это метод, позволяющий избежать распространенных проблем согласованности данных при вставке, обновлении и удалении данных. Если данные записываются один раз, а затем считываются только после этого, то C, U и D CRUD больше не имеют значения. В таком случае преимущества нормализации в основном не имеют смысла, поэтому другие конкурирующие давления могут иметь приоритет, такие как производительность чтения или простота запроса.
Джоэл Браун
9

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

Проектирование базы данных является одним из навыков, необходимых для построения систем качества. Сказав это, некоторые разработчики не знают достаточно о дизайне базы данных и все еще получают задание на моделирование данных и проектирование базы данных. Некоторые проекты даже пропускают моделирование данных. Основное внимание во многих проектах уделяется кодированию и дизайну внешнего интерфейса.

Другим фактором плохого проектирования баз данных является тот факт, что нормализация не является тривиальной темой, особенно когда речь идет о 4-й НФ, 5-й НФ и т. Д. Большинство книг, которые я видел, не могли четко объяснить эти формы. Обычно есть плохие примеры и слишком много теории. Это делает тему менее популярной, чем следовало бы.

Трудно обнаружить ошибки в дизайне базы данных, если вы не ищете их или не столкнетесь с ними во время тестирования. Отсутствие стандартов качества проектирования баз данных позволяет более вероятно возникновение ошибок.

Добавьте к этому тот факт, что некоторые проекты не следуют строгой методологии разработки (которая способствует проектированию баз данных), в результате чего смешиваются обязанности и теряются задачи между бизнес-аналитиком, разработчиками и администраторами баз данных. Разработчики говорят на OO и UML, где администраторы баз данных говорят на DD, а некоторые на ERD, и, вероятно, многие не получают UML или OO. Короче говоря, виноваты нехватка знаний, отсутствие хороших ясных ресурсов, отсутствие единого языка для описания данных и недостаток методологии.

Без шансов
источник
Можете ли вы предложить качественные (не только схемы, но и процедуры) документы / статьи по дизайну базы данных?
Тилак
«Наличие множества столбцов в одной таблице не идет вразрез с нормализацией» - конечно. Мое намерение было #entailments. В вопросе, который я упомянул #columns просто для простоты, я предположил, что читатель поймет корреляцию и под тем, что я имел в виду
Йоси Дахари
@ Тилак, я не уверен, есть ли конкретная ссылка, чтобы получить лучшие рекомендации, но вы можете собрать свой список из литературы по моделированию данных и проектированию баз данных. Извините, если это не ответит на ваш вопрос. Я думаю, что это может быть хорошим предметом для книги.
NoChance