Связи и третья нормальная форма (3NF)

Базы Данных

Связи и третья нормальная форма (3NF)

Теперь определим связи между сущностями.

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

Для этого мы снова введём атрибут (столбец) “Автор”для сущности (таблицы) “Книга”. Но теперь мы поместим туда не фамилию автора, а идентификатор сущности “Автор” – т.е. значение поля ID в таблице “Автор”.

Таким образом мы установили связь между сущностями “Книга” и “Автор”. (Связь – ещё один важный термин реляционной модели.)

Чтобы описать связь, обычно приводят название и степень для каждой из её двух сторон (сущностей). Степень, иногда называемая также кардинальным числом, показывает, сколько экземпляров одной сущности может соответствовать экземпляру другой сущности. Обычно применяется всего два варианта значения степени – “1” (один экземпляр) и “N” (сколько угодно зкземпляров).

Например, описанная только что связь – это связь “Автор”/”Книга”, степени 1:N. Для каждой книги может быть только один автор. Но у каждого автора может быть сколько угодно книг.

Существует три типа связей: один-к-одному (1:1), один-ко-многим (1:N) и многие-ко-многим (N:N).

Связи вида 1:1 обычно лучше не использовать. Такая связь означает, что была выделена лишняя сущность. В самом деле – если каждая строка одной таблицы строго соответствует одной, и только одной, строке другой таблицы – не проще ли их объединить?

Связь вида 1:N наиболее просто отражается в реляционной БД. Для сущности, к которой относится степень N, добавляется атрибут, содержащий значение идентификатора второй сущности. (Проще говоря, в таблицу добавляется столбец, и значения в нём соответствуют значениям в поле ID другой таблицы). Такой атрибут называется внешний ключ (foreign key, FK).

На ER-диаграммах связи изображаются с помощью линий (не обязательно прямых – они могут быть ломаными). Степень связей указывается с помощью ромбиков на их концах: отсутствие ромбика указывает соответствует степени 1, а его наличие – степени N. Внешние ключи отмечаются как FK.

C помощью внешних ключей нам не удастся смоделировать отношение “многие-ко-многим” (N:N). В реальной библиотеке именно таким будет отношение “Автор”/”Книга” : ведь у каждой книги может быть несколько авторов.

Поэтому, чтобы определить связь N:N, применяется следующая технология:

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

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

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

При изменении структуры базы данных нужно внимательно следить – не пришло ли время выделить новую сущность. Так, в нашем примере атрибутов, мешающих нам признать, что модель данных находится в 3NF, нет. Но она может перестанет соответствовать требованиям 3NF, если мы добавим к сущности “Издательство” атрибут “Город”. В одном городе может быть несколько издательств, и одно издательство может иметь несколько представительств в различных городах. В такой ситуации нам придется выделить сущность “Город”, и установить связь “Город”/”Издательство” степени N:N.

Уражнение

Спроектируйте таблицу “Ученик” (“pupil”). Атрибуты для этой сущности выберите и нижеследующего списка:

      • ФИО
      • Имя
      • Адрес
      • Фамилия и Имя
      • Название города
      • Отчество
      • Фамилия
      • Телефон
      • Улица
      • Номер дома
      • Номер квартиры

Какие атрибуты являются элементарными? Как ие из них требуются для работы библиотеки?

Спроектируйте связь “Книга”-”Ученик”, с помощью которой можно будет узнать, сколько книг взял ученик в библиотеке. Какого типа эта связь? Как ее реализовать (с помощью внешних ключей или с помощью дополнительной таблицы-связки)?

Hosted by uCoz