Вопрос по database-normalization, database – Что именно делает нормализация базы данных?

13

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

Увидетьthis. Dhiral Pandya

Ваш Ответ

4   ответа
10

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

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

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

1

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

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

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

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

Нет ничего плохого в том, чтобы иметь строку для каждого адреса. Это только когда это присутствуетwhen certain other things are что нормализация уместна ... например, когда у нас есть несколько адресовand несколько собакand это не одна собака на дом или дом на собаку. Так что это действительно не объясняет аномалии. (См. Мои комментарии к ответу SteveTemple.)
6

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

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

no repeating groups in single tables. separate tables for related information. all items in a table related to the primary key.

Вторая нормальная форма добавляет еще одно ограничение, в основном этоevery column not part of a candidate key must be dependent on every candidate key (ключ-кандидат определяется как минимальный набор столбцов, которые нельзя дублировать в таблице).

И третья нормальная форма идет немного дальше, в этомevery column not part of a candidate key must not be dependent on any other non-candidate-key column. Другими словами, это может зависетьonly на ключи кандидата. Это приводит к поговорке, что 3NF зависит от ключа, всего ключа и ничего, кроме ключа, поэтому помогите мне Codd1.

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

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

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

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

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

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

@philipxy, хорошо, я пытался сделать этоlittle более формально, но я не хочу рисковать делать его настолько сухим, что никто не будет читать или понимать его, предпочитая (как вы говорите) «сосредоточиться на точке зрения читателя». Вероятно, они могут пойти купить книги Codd / Date, если они хотятreal мясо, или они могли бы купить мое, которое я действительно не использовал со времен Uni :-) Кстати, спасибо за ваши мысли / помощь.
+1 за каламбур Codd.
По поводу 1: Нет, это не так. Нормализация - это не какой-то расплывчатый повседневный термин, такой как «не имеет ничего общего с». Конкретный термин с конкретным определением, котороеis релевантным является «функционально зависит от».) (я полагаю, под «ключом» вы подразумеваете CK (ключ-кандидат). Adefinition CK - это набор столбцов, чьи вложенные строки являются уникальными, и который содержит не меньший набор столбцов, чьи вложенные строки являются уникальными. Re "каждый столбец зависит от каждого ключа" смотрите мои комментарии на другие ответы.
@philipxy, не уверен, что я не понимаю ваш первый пункт, я мог бы довольно легко добавить столбец, который не имеет ничего общего с ключом (например, абсолютно случайным числом) - это наверняка нарушит 1nf, да? Что касается второго пункта, я не могу видеть «первичный». где-нибудь в моем ответе, хотя фраза «ключ»; может ввести в заблуждение в этом направлении. Если у вас есть идея, как этого избежать, дайте мне знать, в противном случае я сделаю попытку, когда доберусь до реального компьютера.
По поводу 2: Да, единственный способ понять «ключ» является "ПК". (Что делает ваши пули неправильными.) "Как избежать этого": это будет связано с использованием "некоторых CK (ов)"; и / или «все CK»; по мере необходимости. Но если вы хотите написатьcorrect ответить своими словами для2NF & Амп;3NF тогда вам просто придется использовать язык и / или математику, чтобы четко выразить один и тот же контент. Что я могу сказать? Хорошее письмо требует усилий, чтобы сочинить & amp; многократно переделывать, ориентируясь на точку зрения читателя.
15

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

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

Если бы у вас был только список пользователей, у которых был только один адрес, не было бы необходимости разбивать данные на несколько таблиц. Я бы все же посоветовал использовать уникальный ключ для этих данных.
так что если нет дублирования, вы не должны нормализовать?
Нормализация разбивается на несколько небольших таблиц, которые объединяются с оригиналом. (И это не добавляет новые столбцы.) Изменение производительности зависит от использования. Например, это может дать огромное улучшение производительности в соотношении произведения меньших мощностей таблицы к их сумме. Люди всегда сосредотачиваются на стоимости соединения, когда нам нужен оригинал; но каждый раз, когда мы используем только некоторые из меньших, мы экономим. Фактически, когда мы начинаем с нескольких таблиц, мы интуитивно нормализуем по сравнению с использованием меньшего количества таблиц. (Т.е. удалил JD).
Нормализация включает в себя «устранение повторения данных», но эта повседневная фраза бесполезно расплывчата, тогда как нормализация на самом делеdefines одна конкретная вещь разумно назвала это. (Т.е. для включения обновлений через одну более короткую строку необходимо несколько более длинных рядов.) (Т.е. это "устраняет аномалии обновления".) Ваш пример делаетnot нужно нормализовать, и вы не нормализовали это. Также это не «повторение»; это обязательно плохо. Также нормализация не вводит новые столбцы, т.е. ключи, как в вашем примере. Например, введенные вами значения идентификатора & quot; повтор & quot; где, где они заменяют адреса точно так же, как адреса.

Похожие вопросы