Что именно делает нормализация базы данных? - PullRequest
13 голосов
/ 09 июля 2009

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

Ответы [ 5 ]

15 голосов
/ 09 июля 2009

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

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

10 голосов
/ 09 июля 2009

Нормализация происходит из математической концепции «нормальности». Другое слово будет «перпендикулярно». Представьте себе правильную двухосную систему координат. Перемещение вверх просто меняет координату y, перемещение в сторону просто меняет координату x. Таким образом, каждое движение может быть разбито на боковое и восходящее движение. Эти два не зависят друг от друга.

Нормализация в базе данных, по сути, означает то же самое: если вы изменяете часть данных, это должно изменить только одну единицу информации в базе данных. Представьте себе базу данных E-Mail: если вы храните идентификатор и имя получателя в таблице Mails, но таблица Users также связывает имя с идентификатором, то есть если вы меняете имя пользователя, вы не только изменить его в таблице пользователей, а также в каждом сообщении, с которым связан этот пользователь. Таким образом, ось «сообщение» и ось «пользователь» не являются «перпендикулярными» или «нормальными».

Если, с другой стороны, в таблице «Почты» есть только идентификатор пользователя, любое изменение имени пользователя будет автоматически применяться ко всем сообщениям, потому что при получении сообщения вся информация о пользователе собирается из таблицы «Пользователи» ( средство объединения).

6 голосов
/ 09 июля 2009

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

Первая нормальная форма может быть обобщена как:

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

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

И третья нормальная форма идет немного дальше: каждый столбец, не являющийся частью ключа-кандидата, не должен зависеть от любого другого столбца, не являющегося ключом-кандидатом. Другими словами, он может зависеть только для ключей-кандидатов. Это говорит о том, что 3NF зависит от ключа, всего ключа и ничего, кроме ключа, поэтому помогите мне Codd 1 .

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

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

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

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

И имейте в виду, что существуют также "более высокие" уровни нормализации, такие как (очевидно) четвертый, пятый и шестой, но также Бойс-Кодд и некоторые другие, которые я не могу вспомнить, не говоря уже о моей голове. В подавляющем большинстве случаев 3NF должно быть более чем достаточно.


1 Если вы не знаете, кто такой Эдгар Кодд (или Кристофер Дэйт, если на то пошло), вы, вероятно, должны исследовать их, они - отцы реляционной базы данных теория.

4 голосов
/ 09 июля 2009

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

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

1 голос
/ 09 июля 2009

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

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

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

Нормализация удерживает вас от многих из этих проблем ...

...