Skip to main content

Транзитивная зависимость в базе данных

Основы баз данных. Третья нормальная форма (3nf) и транзитивная зависимость (Июнь 2026)

Основы баз данных. Третья нормальная форма (3nf) и транзитивная зависимость (Июнь 2026)
Anonim

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

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

Давайте посмотрим, как это может работать.

Пример транзитивной зависимости

АВТОРЫ

aUTHOR_IDавторКнигаAuthor_Nationality
Auth_001Карточка Орсона СкоттаИгра ЭндераСоединенные Штаты
Auth_001Карточка Орсона СкоттаИгра ЭндераСоединенные Штаты
Auth_002Маргарет ЭтвудСказка СлужанкиКанада

В приведенном выше примере АВТОРЫ:

  • Книга → автор : Здесь Книга атрибут определяет автор приписывать. Если вы знаете название книги, вы можете узнать имя автора. Тем не мение, автор не определяет Книга , потому что автор может писать несколько книг. Например, только потому, что мы знаем имя автора Orson Scott Card, мы все еще не знаем названия книги.
  • автор → Author_Nationality : Аналогичным образом, автор атрибут определяет Author_Nationality , но не наоборот; просто потому, что мы знаем, что национальность не означает, что мы можем определить автора.

Но эта таблица вводит транзитивную зависимость:

  • Книга → Author_Nationality: Если мы знаем название книги, мы можем определить национальность через колонку «Автор».

Избегайте транзитивных зависимостей

Чтобы обеспечить третью нормальную форму, удалим транзитивную зависимость.

Мы можем начать с удаления столбца «Книга» из таблицы «Авторы» и создания отдельной таблицы «Книги»:

КНИГИ

Book_IDКнигаaUTHOR_ID
Book_001Игра ЭндераAuth_001
Book_001Дети разумаAuth_001
Book_002Сказка СлужанкиAuth_002

АВТОРЫ

aUTHOR_IDавторAuthor_Nationality
Auth_001Карточка Орсона СкоттаСоединенные Штаты
Auth_002Маргарет ЭтвудКанада

Это исправить? Рассмотрим теперь наши зависимости:

Столы BOOKS:

  • Book_ID → Книга: Книга зависит от Book_ID .
  • В этой таблице нет других зависимостей, поэтому мы в порядке. Обратите внимание, что внешний ключ aUTHOR_ID связывает эту таблицу с таблицей AUTHORS через ее первичный ключ aUTHOR_ID , Мы создали связь, чтобы избежать транзитивной зависимости, ключевой дизайн реляционных баз данных.

Таблица АВТОРОВ:

  • aUTHOR_ID → Автор: автор зависит от aUTHOR_ID .
  • автор → Author_Nationality: Гражданство может быть определено автором.
  • aUTHOR_ID → Author_Nationality: Гражданство можно определить из aUTHOR_ID сквозь автор приписывать. У нас все еще есть транзитивная зависимость.

Для нормализации этих данных необходимо добавить третью таблицу:

СТРАНЫ

cOUNTRY_IDСтрана
Coun_001Соединенные Штаты
Coun_002Канада

АВТОРЫ

aUTHOR_IDавторcOUNTRY_ID
Auth_001Карточка Орсона СкоттаCoun_001
Auth_002Маргарет ЭтвудCoun_002

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

  • Внешний ключ таблицы BOOK aUTHOR_ID связывает книгу с автором в таблице АВТОРС.
  • Внешний ключ таблицы AUTHORS cOUNTRY_ID связывает автора с страной в таблице СТРАН.
  • Стол COUNTRIES не имеет внешнего ключа, поскольку ему не нужно ссылаться на другую таблицу в этом дизайне.

Почему транзитивные зависимости плохой дизайн базы данных

Какова ценность предотвращения переходных зависимостей, чтобы помочь обеспечить 3NF? Давайте снова рассмотрим нашу первую таблицу и рассмотрим проблемы, которые она создает:

АВТОРЫ

aUTHOR_IDавторКнигаAuthor_Nationality
Auth_001Карточка Орсона СкоттаИгра ЭндераСоединенные Штаты
Auth_001Карточка Орсона СкоттаДети разумаСоединенные Штаты
Auth_002Маргарет ЭтвудСказка СлужанкиКанада

Такой дизайн может способствовать аномалиям данных и несоответствиям, например:

  • Если вы удалите две книги «Дети разума» и «Игра Эндера», вы полностью удалите автора «Карту Орсона Скотта» и его гражданство из базы данных.
  • Вы не можете добавить нового автора в базу данных, если вы не добавите книгу; что, если автор еще не опубликован или вы не знаете названия книги, которую она написала?
  • Если «Орсон Скотт Кард» изменил свое гражданство, вам придется изменить его во всех рекордах, в которых он появляется. Наличие нескольких записей с одним и тем же автором может привести к неточным данным: что, если человек, вводящий данные, не понимает, что для него есть несколько записей и изменяет данные только в одной записи?
  • Вы не можете удалить книгу, такую ​​как «Сказка служанки», не удаляя автора полностью.

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