Spec-Zone.ru › MariaDB

Нормализация базы данных: Нормальная форма Бойса-Кодда

Эта статья продолжает тему Нормализация базы данных: Нормальная форма 3NF

Имена Э.Ф. Кодда и Р.Ф. Бойса, двоих из тех, кто внес значительный вклад в разработку модели базы данных, увековечены в названии этой нормальной формы. Э.Ф. Кодд разработал и расширил реляционную модель, а также разработал нормализацию для реляционных моделей в 1970 году, в то время как Р.Ф. Бойс был одним из создателей языка структурированных запросов (тогда называемого SEQUEL).

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

Таблица, содержащая данные об отношениях студент-курс-преподаватель

Таблица Студент-Курс-Преподаватель
Студент
Курс
Преподаватель

Предположим, что для таблицы выше верно следующее:

  • Каждый преподаватель ведет только один курс
  • Каждый курс может иметь одного или более преподавателей
  • Каждый студент имеет только одного преподавателя на каждый курс
  • Каждый студент может изучать один или более курсов

Каким будет ключ? Ни одно из полей само по себе не достаточно для уникальной идентификации записи, поэтому вам нужно использовать два поля. Какие два следует использовать?

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

Использование студента и курса в качестве ключа

Таблица Студент-Курс-Преподаватель
Студент
Курс
Преподаватель

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

Но все еще есть некоторые аномалии данных. Посмотрите на пример данных ниже:

Дополнительные аномалии данных

Студент Курс Преподаватель
Конрад Пиеннар Биология Нкосизана Асмал
Дигаан Фортюн Математика Кадер Дламини
Гэрри Янтьес Наука Елена Гинвала
Марк Тобела Биология Нкосизана Асмал
Конрад Пиеннар Наука Питер Леон
Алисия Нцита Наука Питер Леон
Квинтон Эндрюс Математика Кадер Дламини

Тот факт, что Питер Леон преподает науку, хранится избыточно, как и Кадер Дламини по математике и Нкосизана Асмал по биологии. Проблема в том, что преподаватель определяет курс. Или, иначе, курс определяется преподавателем. Таблица соответствует правилам 3-й нормальной формы, потому что ни один атрибут, не являющийся ключом, не зависит от другого атрибута, не являющегося ключом! Снова, вы используете знакомый метод удаления этого поля и размещения его в другую таблицу вместе с его ключом:

Таблица Студент-Преподаватель после удаления Курса

Таблица Студент-Курс-Преподаватель
Студент
Преподаватель

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

Результирующая таблица Преподавателей

Таблица Студент-Курс-Преподаватель
Преподаватель
Курс

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

Таким образом, таблица находится в нормальной форме Бойса-Кодда, если:

  • она находится в 3-й нормальной форме
  • каждый детерминант является кандидатом в ключ

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

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

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

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

Использование студента и преподавателя в качестве ключа

Таблица Студент-Курс-Преподаватель
Студент
Преподаватель
Курс

Опять же, она находится в 1-й нормальной форме, потому что существует первичный ключ и нет повторяющихся групп. Однако на этот раз она не находится во 2-й нормальной форме, потому что курс определяется только частью ключа: преподавателем. Удаляя курс и его ключ, преподавателя, вы получаете структуру, показанную ниже:

Удаление курса

Таблица Студент-Преподаватель
Студент
Преподаватель

Создание новой таблицы с курсом

Таблица Студент-Курс-Преподаватель
Преподаватель
Курс

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

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

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/database-normalization-boyce-codd-normal-form/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API