Как определить, насколько необходимо нормализовать базу данных?

StackOverflow https://stackoverflow.com/questions/47711

Вопрос

Каким рекомендациям следует следовать при создании структуры базы данных или каковы хорошие способы определения степени нормализации базы данных?Стоит ли создавать ненормализованную базу данных и разбивать ее на части по ходу проекта?Стоит ли создавать его полностью нормализованным и комбинировать таблицы по мере необходимости для повышения производительности?

Это было полезно?

Решение

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

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

Есть пара хороших статей:

http://www.agiledata.org/essays/dataNormalization.html

Другие советы

@GrizzlyGuru Один мудрый человек однажды сказал мне: «нормализуйся, пока не станет больно, денормализуйся, пока не сработает».

Меня это еще не подвело :)

Я не согласен с тем, чтобы начинать с ненормализованной формы, однако, по моему опыту, легче адаптировать ваше приложение для работы с менее нормализованной базой данных, чем с более нормализованной.Это также может привести к ситуациям, когда он работает «достаточно хорошо», поэтому вы никогда не сможете его нормализовать (пока не станет слишком поздно!)

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

Это довольно огромная проблема, поэтому я бы сказал, что денормализация причиняет вред, а не наоборот.

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

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

Джефф довольно хорошо изложил свою философию в своем блоге: Может быть, нормализация — это ненормально.Главное:не переусердствуйте с нормализацией.Но я думаю, что еще более важным моментом является то, что это, вероятно, не имеет большого значения.Если вы не используете следующий Google, вы, вероятно, не заметите большой разницы, пока ваше приложение не вырастет.

Я считаю, что нормализация баз данных — это форма искусства.

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

Я придерживаюсь хорошего практического правила: нормализовать одну и ту же информацию, повторяемую снова и снова.

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

Однако если у вас есть только два типа контактов: деловые или личные, нужна ли вам таблица типов контактов, если вы знаете, что у вас будет только два?Для меня нет.

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

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

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

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

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

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

Я согласен, что обычно лучше начинать с нормализованной БД, а затем денормализовать ее для решения очень конкретных проблем, но я бы, вероятно, начал с Нормальная форма Бойса-Кодда вместо 3-й нормальной формы.

Правда в том, что «это зависит». Это зависит от множества факторов, включая:

  • Код (вручную или с помощью инструмента (например, пакеты ETL))
  • Основное приложение (обработка транзакций, хранилище данных, отчетность)
  • Тип базы данных (MySQL, DB/2, Oracle, Netezza и т. д.)
  • Архитектура базы данных (табличная, столбчатая)
  • Качество DBA (активное, реактивное, неактивное)
  • Ожидаемое качество данных (хотите ли вы обеспечить качество данных на уровне приложения или на уровне базы данных?)

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

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

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

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

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

Часто, если вы нормализуетесь настолько, насколько позволяет ваше другое программное обеспечение, все будет готово.

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

Просто постарайтесь руководствоваться здравым смыслом.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top