Избегайте переходных зависимостей, чтобы помочь обеспечить нормализацию
Транзитивная зависимость в базе данных – это косвенная связь между значениями в одной и той же таблице, которая вызывает функциональную зависимость. Чтобы достичь стандарта нормализации третьей нормальной формы (3NF), вы должны устранить любые переходные зависимости.
По своей природе транзитивная зависимость требует трех или более атрибутов (или столбцов базы данных), которые имеют функциональную зависимость между ними, что означает, что столбец A в таблице опирается на столбец B через промежуточный столбец C. Давайте посмотрим, как это может работать.
Пример транзитивной зависимости
АВТОРЫ
Auth_001 | Орсон Скотт Кард | Игра Эндера | Соединенные Штаты |
Auth_001 | Орсон Скотт Кард | Игра Эндера | Соединенные Штаты |
Auth_002 | Маргарет Этвуд | История о горничной | Канада |
В примере АВТОРЫ выше:
- Книга → Автор : . Здесь атрибут Книга определяет атрибут Автор . Если вы знаете название книги, вы можете узнать имя автора. Однако Автор не определяет Книгу , поскольку автор может написать несколько книг. Например, только потому, что мы знаем имя автора Орсон Скотт Кард, мы до сих пор не знаем название книги.
- Автор → Author_Nationality : Аналогично, атрибут Author определяет Author_Nationality , но не наоборот; только то, что мы знаем национальность, не означает, что мы можем определить автора.
Но эта таблица вводит транзитивную зависимость:
- Книга → Author_Nationality: Если мы знаем название книги, мы можем определить национальность через столбец Автор.
Избежание переходных зависимостей
Чтобы обеспечить третью нормальную форму, давайте удалим транзитивную зависимость.
Мы можем начать с удаления столбца Book из таблицы Authors и создания отдельной таблицы Books:
Книги
Book_001 | Игра Эндера | Auth_001 |
Book_001 | Дети разума | Auth_001 |
Book_002 | История о горничной | Auth_002 |
АВТОРЫ
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 через Author приписывать. У нас все еще есть транзитивная зависимость.
Нам нужно добавить третью таблицу для нормализации этих данных:
Страны
Coun_001 | Соединенные Штаты |
Coun_002 | Канада |
АВТОРЫ
Auth_001 | Орсон Скотт Кард | Coun_001 |
Auth_002 | Маргарет Этвуд | Coun_002 |
Теперь у нас есть три таблицы, использующие внешние ключи для связи между таблицами:
- Внешний ключ таблицы BOOK Author_ID связывает книгу с автором в таблице AUTHORS.
- Внешний ключ таблицы AUTHORS Country_ID связывает автора со страной в таблице COUNTRIES.
- Таблица COUNTRIES не имеет внешнего ключа, поскольку в этом дизайне нет необходимости ссылаться на другую таблицу.
Почему транзитивные зависимости плохой дизайн базы данных
Какова ценность избегания транзитивных зависимостей, чтобы помочь обеспечить 3NF? Давайте снова рассмотрим нашу первую таблицу и посмотрим на проблемы, которые она создает:
АВТОРЫ
Auth_001 | Орсон Скотт Кард | Игра Эндера | Соединенные Штаты |
Auth_001 | Орсон Скотт Кард | Дети разума | Соединенные Штаты |
Auth_002 | Маргарет Этвуд | История о горничной | Канада |
Такая конструкция может способствовать аномалиям и несоответствиям данных, например:
- Если вы удалили две книги «Дети разума» и «Игра Эндера», вы полностью удалили из базы данных автора «Карту Орсона Скотта» и его гражданство.
- Вы не можете добавить нового автора в базу данных, если вы также не добавите книгу; Что делать, если автор еще не опубликован или вы не знаете название книги, которую она написала?
- Если «Орсон Скотт Кард» изменил свое гражданство, вам придется изменить его во всех записях, в которых он появляется. Наличие нескольких записей с одним и тем же автором может привести к получению неточных данных: что, если лицо, занимающееся вводом данных, не понимает, что для него существует несколько записей, и изменяет данные только в одной записи?
- Вы не можете удалить такую книгу, как «Сказка о служанке», не удалив также полностью автора.
Это всего лишь несколько причин, по которым нормализация и избежание транзитивных зависимостей защищают данные и обеспечивают согласованность.