Что такое нормализация (или нормализация)? - PullRequest
99 голосов
/ 29 октября 2008

Почему ребята из базы данных продолжают нормализацию?

Что это? Как это помогает?

Применимо ли это к чему-либо за пределами баз данных?

Ответы [ 9 ]

164 голосов
/ 29 октября 2008

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

Существует ряд уровней нормализации от 1. нормальной формы до 5. нормальной формы. Каждая нормальная форма описывает, как избавиться от какой-то конкретной проблемы, обычно связанной с избыточностью.

Некоторые типичные ошибки нормализации:

(1) Наличие более одного значения в ячейке. Пример:

UserId | Car
---------------------
1      | Toyota
2      | Ford,Cadillac

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

UserId | Car
---------------------
1      | Toyota
2      | Ford
2      | Cadillac

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

(2) Наличие избыточных неключевых данных (т. Е. Данных, излишне повторяемых в нескольких строках). Пример:

UserId | UserName | Car
-----------------------
1      | John     | Toyota
2      | Sue      | Ford
2      | Sue      | Cadillac

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

UserId(FK) | Car               UserId(PK) | UserName
---------------------          -----------------
1          | Toyota            1          | John
2          | Ford              2          | Sue
2          | Cadillac

Теперь может показаться, что у нас все еще есть избыточные данные, потому что идентификаторы UserId повторяются; Однако ограничение PK / FK гарантирует, что значения не могут быть обновлены независимо, поэтому целостность безопасна.

Это важно? Да, это очень важно. Имея базу данных с ошибками нормализации, вы рискуете получить неверные или поврежденные данные в базу данных. Поскольку данные «живут вечно», очень трудно избавиться от поврежденных данных, когда они впервые вошли в базу данных.

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

Существует множество заблуждений относительно нормализации:

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

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

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

44 голосов
/ 29 октября 2008

Правила нормализация (источник: неизвестен)

  • Ключ ( 1НФ )
  • Весь ключ ( 2NF )
  • и ничего, кроме ключа ( 3NF )

... Так помогите мне Кодд.

19 голосов
/ 29 октября 2008

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

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

Мой совет - начинать с хорошей степени нормализации и делать денормализацию только тогда, когда это действительно необходимо

P.S. также проверьте эту статью: http://en.wikipedia.org/wiki/Database_normalization чтобы узнать больше о предмете и о так называемых нормальных формах

7 голосов
/ 29 октября 2008

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

Существует несколько нормальных форм, обычно обозначаемых числом. Чем больше число, тем меньше избыточностей и зависимостей. Любая таблица SQL находится в 1NF (первая нормальная форма, в значительной степени по определению). Нормализация означает изменение схемы (часто деление таблиц) обратимым образом, давая модель, которая функционально идентична, за исключением меньшей избыточности и зависимостей.

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

5 голосов
/ 29 октября 2008

Предназначено для уменьшения избыточности данных.

Более формальное обсуждение см. В Википедии http://en.wikipedia.org/wiki/Database_normalization

Я приведу несколько упрощенный пример.

Предположим, что база данных организации обычно содержит членов семьи

id, name, address
214 Mr. Chris  123 Main St.
317 Mrs. Chris 123 Main St.

может быть нормализовано как

id name familyID
214 Mr. Chris 27
317 Mrs. Chris 27

и семейный стол

ID, address
27 123 Main St.

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

Идея заключается в том, что избыточная информация сводится к одной записи. Это особенно полезно в таких полях, как адреса, где г-н Крис представляет свой адрес в виде Мейн-стрит 123 на 7-м блоке, а миссис Крис перечисляет Мэйн-стрит 123 на 7-м корпусе, который в исходной таблице будет отображаться как два разных адреса.

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

3 голосов
/ 31 октября 2008

Цитата CJ Дата: Теория практична.

Отклонения от нормализации приведут к определенным аномалиям в вашей базе данных.

Отклонения от первой нормальной формы приведут к аномалиям доступа, а это значит, что вам придется разложить и отсканировать отдельные значения, чтобы найти то, что вы ищете. Например, если одним из значений является строка «Ford, Cadillac», как указано в предыдущем ответе, и вы ищете все вхождения «Ford», вам придется взломать строку и посмотреть на подстроки. Это в некоторой степени противоречит цели сохранения данных в реляционной базе данных.

Определение первой нормальной формы изменилось с 1970 года, но эти различия не должны беспокоить вас сейчас. Если вы разрабатываете свои таблицы SQL с использованием реляционной модели данных, ваши таблицы автоматически будут в 1NF.

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

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

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

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

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

2 голосов
/ 29 октября 2008

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

В базах данных конкретно означает, что две (или более) таблицы не содержат одинаковые данные, т.е. не имеют избыточности.

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

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

1 голос
/ 27 июля 2015

Что такое нормализация?

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

Процесс нормализации
enter image description here Предоставлено

Первая нормальная форма тогда и только тогда, когда домен каждого атрибута содержит только атомарные значения (атомарное значение - это значение, которое не может быть разделено), а значение каждого атрибута содержит только одно значение из этот домен (пример: - домен для столбца пола: "M", "F".).

Первая нормальная форма применяет эти критерии:

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

Вторая нормальная форма = 1NF + нет частичных зависимостей, т. Е. Все неключевые атрибуты полностью функциональны в зависимости от первичного ключа.

Третья нормальная форма = 2NF + нет транзитивных зависимостей, т. Е. Все неключевые атрибуты являются полностью функционально зависимыми ПРЯМО только от первичного ключа.

Нормальная форма Бойса-Кодда (или BCNF или 3.5NF) является несколько более сильной версией третьей нормальной формы (3NF).

Примечание: - Вторые, третьи и нормальные формы Бойса-Кодда связаны с функциональными зависимостями. Примеры

Четвертая нормальная форма = 3NF + удалить многозначные зависимости

Пятая нормальная форма = 4NF + удалить зависимости соединения

0 голосов
/ 29 октября 2008

Это помогает предотвратить дублирование (и, что еще хуже, противоречивых) данных.

Может оказать негативное влияние на производительность.

...