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


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

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

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

10 88

10 ответов:

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

существует ряд уровней нормализации от 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

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

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

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

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

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

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

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

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

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

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

  • клавишу (1NF)
  • весь ключ (2NF)
  • и ничего, кроме ключа (3NF)

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

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

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

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

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

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

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

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

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

более формальное обсуждение см. В Википедии 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, следующим шагом обычно является денормализация это логично для ускорения запросов и снижения сложности некоторых распространенных вставок. Однако вы не можете сделать это хорошо, не нормализовав его должным образом.

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

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

цитирование даты CJ: теория является практической.

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

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

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

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

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

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

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

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

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

что такое избыточность данных и аномалия обновления / модификации?

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

пример:

enter image description here

здесь "student_age" для студента Алекса повторяется излишне, что естественно увеличивает избыточность данных. Когда столбец 'student_age' должен быть изменен в будущем, то обновление должно быть выполнено на обеих строках student Alex, как в таблице выше. Этот сценарий известен как аномалия обновления. Если пользователь обновляет только одну строку и забывает обновить другую строку, что приведет к несогласованности данных.

что такое аномалия вставки?

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

пример:

enter image description here

здесь предполагается, что 'student_name' и ' exam_registered’ являются составной первичный ключ (первичный ключ, содержащий несколько столбцов). Первичный ключ должен быть всегда уникальным, не должен содержать нулевых значений и должен однозначно идентифицировать каждую строку в таблице. Теперь предположим, что старшая школа пытается ввести новый экзамен под названием химия. В начале ни один студент не был зарегистрирован в этом курсе. Поскольку приведенная выше таблица не будет принимать нулевое значение в столбце "student_name", нам нужно подождать, пока не будет зарегистрирован хотя бы один студент, чтобы сделать запись на экзамен Химия в приведенной выше таблице.

что такое аномалия удаления?

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

пример:

enter image description here

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

что такое частичное зависимость?

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

пример:

enter image description here

Рассмотрим таблицу, которая имеет 3 столбца с именами 'student_name’, ‘student_age’ и 'exam_registered', как указано выше. Здесь 'student_name’ и 'exam_registered' могут вместе образовать составной первичный ключ. Обычно каждый столбец первичного ключа в хорошо нормализованной таблице всегда должен зависеть от комплектации составного первичного ключа. Здесь 'student_age' зависит только от’ student_name ‘и не относится к’ exam_registered', что приводит к тому, что эта таблица находится в частичной зависимости.

что такое транзитивная функциональная зависимость?

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

пример:

enter image description here

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

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

данные зависят от ключа [1NF], всего ключа [2NF] и ничего, кроме ключ [3NF]

стол без нормализации

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

В приведенном ниже примере для student_id=2, есть 2 здесь мы можем предположить, как Parent_id=1 представляет отца и Parent_id=3 представляет мать этого студента, чей student_id=2.

пример:

enter image description here

первая нормальная форма (1NF)

правила: 1. Атрибуты должны содержать только атомарные значения 2. Нет двух строк данных должна содержать повторяющуюся группу информации 3. Каждая таблица должна иметь первичный ключ

Шаг 1:

enter image description here

Правило 1 выполняется на приведенном выше шаге, но все же оно не удовлетворяет правилу 2 и правилу 3.

Шаг 2: Приведенные ниже таблицы теперь удовлетворяют правилу 1, правилу 2 и правилу 3 из 1NF.

enter image description here

вторая нормальная форма (2NF)

правила:

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

кроме первой таблицы все остальные таблицы из 1NF удовлетворяют 2NF. В первой таблице столбец ‘возраст’ зависит только от столбца ‘student_id’. Это нарушает правило 2 из 2NF. Потому что все неключевые столбцы должны полностью зависеть от Столбцов первичного ключа. Таким образом, нормализованные таблицы в соответствии с 2NF приведены под.

enter image description here

третья нормальная форма (3NF)

обычно таблица реляционной базы данных часто описывается как "нормализованная", если она соответствует 3NF. Большинство таблиц 3NF свободны от вставки, обновления и удаления аномалий.

правила:

  1. таблицы должны удовлетворять второй нормальной форме (2NF)
  2. не должно быть транзитивных функциональных зависимостей в таблицы

кроме последней таблицы все остальные таблицы из 2NF удовлетворяют 3NF. Это связано с тем, что столбец "город" более сильно зависит от столбца "postal_code", чем первичный ключ "student_id", который делает столбец "город" транзитивным функциональным зависимым от столбца "student_id". Таким образом, окончательные нормализованные таблицы в соответствии с 3NF приведены ниже.

enter image description here

*атрибутов:

– Рассмотрим таблицу студентов. Здесь student_name, возраст и т. д. рассматриваются как атрибуты, которые будут заголовок соответствующего столбца.

======================================================================== простые примеры - нормализация базы данных

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

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

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

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

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

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

Процесс Нормализации
enter image description here вежливость

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

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

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

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

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

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

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

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

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

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

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