Чтобы полностью понять смысл первоначального вопроса, вы должны кое-что понять о командной динамике в разработке систем и о типе поведения (или неправильного поведения), к которому предрасположены разные роли / типы людей. Нормализация важна, потому что это не просто беспристрастная дискуссия о шаблонах проектирования - она также имеет непосредственное отношение к тому, как системы проектируются и управляются с течением времени.
Люди из базы данных обучены тому, что целостность данных является первостепенной проблемой. Нам нравится думать о 100% правильности данных, поэтому, когда данные находятся в БД, вам не нужно думать о том, что они имеют дело с логической ошибкой. Эта школа мысли придает большое значение нормализации, потому что она заставляет (заставляет) команду осваивать основную логику данных и системы. Рассмотрим тривиальный пример - у клиента есть только одно имя и адрес, или у него может быть несколько? Кто-то должен принять решение, и система станет зависеть от того, будет ли это правило применяться последовательно. Это звучит как простая проблема, но умножьте эту проблему в 500 раз, когда вы проектируете достаточно сложную систему, и вы увидите проблему - правила не могут просто существовать на бумаге, их нужно применять. Хорошо нормализованный дизайн базы данных (с дополнительной помощью ограничений уникальности, внешних ключей, проверочных значений, триггеров принудительной логики и т. Д.) Может помочь вам иметь четко определенную базовую модель данных и правила корректности данных, что действительно важно, если Вы хотите, чтобы система работала так, как ожидалось, когда многие люди работают в разных частях системы (в разных приложениях, отчетах и т. д.), а со временем в системе работают разные люди. Или, другими словами, если у вас нет способа определить и оперативно применить модель данных с твердым ядром, ваша система будет отстойной.
Другие люди (часто менее опытные разработчики) так не считают. Они видят базу данных в лучшем случае как инструмент, который порабощен для приложения, которое они разрабатывают, или в худшем случае следует избегать бюрократии. (Обратите внимание, что я говорю «менее опытные» разработчики. Хороший разработчик будет иметь ту же осведомленность о необходимости надежной модели данных и правильности данных, что и человек, работающий с базой данных. Они могут отличаться в том, каков наилучший способ добиться этого, но по моему опыту, они достаточно открыты для выполнения этих вещей на уровне БД, если команда БД знает, что они делают, и может реагировать на них разработчиков). Эти менее опытные люди часто выступают за денормализацию, что является более или менее оправданием для быстрой и грязной работы по проектированию и управлению моделью данных. Таким образом, в итоге вы получаете таблицы базы данных 1: 1 с экранами приложений и отчетами, каждая из которых отражает различные предположения разработчика, а также полное отсутствие вменяемости / согласованности между таблицами. Я испытал это несколько раз в моей карьере. Это унылый и крайне непродуктивный способ разработки системы.
Таким образом, одна из причин, по которой у людей возникает сильное чувство нормализации, заключается в том, что эта проблема является заменой для других проблем, к которым они сильно относятся. Если вы вовлечены в дебаты о нормализации, подумайте о лежащей в основе (нетехнической) мотивации, которую стороны могут привнести в дебаты.
Сказав это, вот более прямой ответ на первоначальный вопрос:)
Полезно рассматривать вашу базу данных как состоящую из базового проекта, максимально приближенного к логическому, строго нормированному и ограниченному, и расширенного дизайна, который решает другие проблемы, такие как стабильные интерфейсы приложений и производительность.
Вы должны захотеть ограничить и нормализовать вашу базовую модель данных, потому что если вы этого не сделаете, это нарушит фундаментальную целостность данных и все правила / предположения, на которых строится ваша система. Если вы позволите этим проблемам уйти от вас, ваша система может работать довольно быстро. Протестируйте свою базовую модель данных на соответствие требованиям и реальным данным и повторяйте ее как сумасшедшие, пока она не заработает. Этот шаг будет больше походить на разъяснение требований, чем на построение решения, и это должно произойти. Используйте базовую модель данных в качестве принудительной функции, чтобы получить четкие ответы на эти вопросы проектирования для всех участников.
Заполните базовую модель данных, прежде чем переходить к расширенной модели данных. Используйте это и посмотрите, как далеко вы можете получить с этим. В зависимости от объема данных, количества пользователей и моделей использования вам может никогда не потребоваться расширенная модель данных. Посмотрите, как далеко вы можете продвинуться с помощью индексации, плюс 1 001 регуляторов, связанных с производительностью, которые вы можете включить в свою СУБД.
Если вы действительно задействуете возможности управления производительностью вашей СУБД, тогда вам нужно взглянуть на расширение вашей модели данных таким образом, чтобы добавить денормализацию. Обратите внимание, что речь идет не о денормализации вашей базовой модели данных, а скорее о добавлении новых ресурсов, которые обрабатывают денормальные данные. Например, если есть несколько огромных запросов, которые снижают вашу производительность, вы можете добавить несколько таблиц, которые предварительно вычисляют данные, которые будут получены в результате этих запросов - по существу, перед выполнением запроса. Важно сделать это таким образом, чтобы поддерживать согласованность денормализованных данных с основными (нормализованными) данными. Например, в СУБД, которые их поддерживают, вы можете использовать MATERIALIZED VIEW, чтобы сделать автоматическое ведение данных денорм. Если ваша СУБД не имеет этой опции, возможно, вы можете сделать это, создав триггеры для таблиц, в которых существуют базовые данные.
Существует огромная разница между выборочной денормализацией базы данных согласованным способом для решения проблемы реалистичной производительности по сравнению с просто слабым дизайном данных и использованием производительности в качестве оправдание этому.
Когда я работаю с опытными людьми и разработчиками баз данных низкого и среднего уровня, я настаиваю на том, чтобы они создавали абсолютно нормализованный дизайн ... тогда позже может быть привлечено небольшое количество более опытных людей к обсуждению выборочной денормализации. Денормализация более или менее всегда плоха в вашей базовой модели данных. За пределами ядра нет ничего плохого в денормализации, если вы делаете это продуманно и согласованно.
Другими словами, хорошо перенести денормализацию из нормального проекта в тот, который сохраняет нормальный, добавляя некоторый ненормальный - который имеет дело с физической реальностью ваших данных, сохраняя при этом их основную логику. Проекты, у которых нет ядра нормального дизайна - это даже не следует называть денормализованным, потому что они никогда не были нормализованы в первую очередь, потому что они никогда не были сознательно разработаны дисциплинированным образом - не хороши.
Не принимайте терминологию, согласно которой слабый недисциплинированный дизайн - это «денормализованный» дизайн. Я полагаю, что путаница между намеренно / осторожно денормализованными данными и простым старым дерьмовым дизайном базы данных, которая приводит к денормализованным данным, потому что дизайнер был небрежным идиотом, является основной причиной многих споров о денормализации.