Что не так с транзитивной зависимостью? - PullRequest
26 голосов
/ 31 марта 2012

У меня есть некоторые переходные зависимости в моей базе данных. Мои начальники сказали мне, что это может вызвать ошибки. Мне трудно найти ресурсы, которые бы рассказывали мне, как наличие этих зависимостей приведет к ошибкам. Какие проблемы они вызовут?

Я не оспариваю этот факт, просто хочу узнать, какие проблемы они могут вызвать.

Изменить для более подробной информации:

Из википедии:

Переходная зависимость
Транзитивная зависимость - это косвенная функциональная зависимость, в которой X → Z только в силу X → Y и Y → Z.

Ответы [ 5 ]

50 голосов
/ 31 марта 2012

поясню на примере:

-------------------------------------------------------------------
|  Course  |    Field     |   Instructor   |  Instructor Phone    |
-------------------------------------------------------------------
|  English |  Languages   |  John Doe      |     0123456789       |
|  French  |  Languages   |  John Doe      |     0123456789       |
|  Drawing |  Art         |  Alan Smith    |     9856321158       |
|  PHP     |  Programming |  Camella Ford  |     2225558887       |
|  C++     |  Programming |  Camella Ford  |     2225558887       |
-------------------------------------------------------------------
  • Если у вас есть Course, вы можете легко получить его Instructor, поэтому Course ->Instructor.
  • Если у вас есть Instructor, вы не можете получить его Course, поскольку он может преподавать разные курсы.
  • Если у вас есть Instructor, вы можете легко получить его Phone, поэтому Instructor->Phone.

Это означает, что если у вас есть Course, то вы можете получить Instructor Phone, что означает Course ->Instructor Phone (т.е. транзитивная зависимость)

Теперь о проблемах:

  1. Если вы удалите оба курса French и English, вы также удалите их инструктора John Doe, и его номер телефона будет утерян навсегда.
  2. Невозможно добавить новый Instructor в вашу базу данных, если вы сначала не добавите Course для него, или вы не можете скопировать данные в Instructors table, что еще хуже.
  3. Если Инструктор John Doe изменит свой номер телефона, вам придется обновить все Курсы, которые он преподаёт, с новой информацией, которая может быть очень подвержена ошибкам.
  4. Вы не можете удалить Инструктора из своей базы данных, если не удалите все курсы, которые он преподает, или не установите все его поля на ноль.
  5. Что если вы решите сохранить дату рождения ваших инструкторов? Вам нужно будет добавить поле Birth Date в таблицу Courses. Это даже звучит логично? Зачем в первую очередь хранить информацию об инструкторе в таблице курсов.
10 голосов
/ 31 марта 2012

Один из способов выразить 3NF:

Все атрибуты должны зависеть от ключа, всего ключа и только от ключа.

Транзитивная зависимость X-> Y-> Z нарушает этот принцип, приводя к избыточности данных и потенциальным аномалиям модификации.


Разобьем это:

  1. По определению для того, чтобы функциональная зависимость X-> Y-> Z также была транзитивной , X <-Y должен <strong>не удерживаться.
  2. Если бы Y был ключом, то X <-Y удерживал бы, поэтому Y не может быть ключом.<em> (FOOTNOTE1)
  3. Поскольку Y не является ключом, любой заданный Y может повторяться в нескольких строках.
  4. Y-> Z подразумевает, что все строки, содержащие одинаковыеY также должна содержать один и тот же Z. (FOOTNOTE2)
  5. Повторение одинакового одинакового (Y, Z) кортежа в нескольких строках не дает никакой полезной информации системе,Это избыточно .

Короче говоря, поскольку Y не является ключом, а Y-> Z, мы нарушили 3NF.

Избыточности приводят к модификациианомалии (например, обновление некоторых , но не всех Zs, «подключенных» к одному и тому же Y, по существу повреждает данные, поскольку вы больше не знаете, какая копия является правильной).Обычно это решается разделением исходной таблицы на две таблицы, одна из которых содержит {X, Y}, а другая - {Y, Z}. Таким образом, Y может быть ключом во второй таблице, а Z не повторяется.

С другой стороны, если X <-Y действительно удерживается (то есть X-> Y-> Z не является транзитивным), то мы можем сохранить одну таблицу, где X и Y являются ключами.В этом сценарии Z не будет излишне повторяться.

(FOOTNOTE1) Ключ - это (минимальный) набор атрибутов, которые функционально определяют все атрибуты в отношении.Обоснование: если K является ключом, не может быть нескольких строк с одинаковым значением K, поэтому любое заданное значение K всегда связано точно с одним значением каждого другого атрибута (при условии 1NF).По определению (см. FOOTNOTE2) «быть связанным именно с одним» означает то же самое, что и «быть в функциональной зависимости».

(FOOTNOTE2) По определению , Y-> Z тогда и только тогда, когда каждое значение Y связано только с одним значением Z.


Пример:

Предполагая каждоесообщение имеет ровно одного автора, и каждый автор имеет ровно один основной адрес электронной почты, попытка представить сообщения и пользователей в одной таблице приведет к повторению сообщений электронной почты:

MESSAGE                         USER    EMAIL
-------                         ----    -----
Hello.                          Jon     jon@gmail.com
Hi, how are you?                Rob     rob@gmail.com
Doing fine, thanks for asking.  Jon     jon@gmail.com

(На самом деле,это будет MESSAGE_ID с, но давайте здесь все упростим.)

Теперь, что произойдет, если Джон решит сменить свою электронную почту, скажем, на "jon2@gmail.com"?Нам нужно обновить обе строки Джона.Если мы обновим только один, то у нас будет следующая ситуация ...

MESSAGE                         USER    EMAIL
-------                         ----    -----
Hello.                          Jon     jon2@gmail.com
Hi, how are you?                Rob     rob@gmail.com
Doing fine, thanks for asking.  Jon     jon@gmail.com

... и мы больше не будем знать, какой из писем Джона является правильным.Мы по существу потеряли данные!

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

Однако, если вы разделите таблицу ...

MESSAGE                         USER
-------                         ----
Hello.                          Jon 
Hi, how are you?                Rob 
Doing fine, thanks for asking.  Jon 

USER    EMAIL
----    -----
Jon     jon@gmail.com
Rob     rob@gmail.com

... теперь есть только одна строка, которая знает об электронной почте Джона, поэтому двусмысленность невозможна.

Кстати, все это можно рассматривать как еще одно выражение DRYпринцип .

5 голосов
/ 31 марта 2012

Если в вашей таблице есть транзитивные зависимости, значит, она не совместима с 3NF;так что есть большая вероятность того, что в вашей таблице есть избыточные данные.Отметьте this , чтобы уточнить эту концепцию.

3 голосов
/ 31 марта 2012

Взгляните на эту ссылку:

http://en.wikipedia.org/wiki/Transitive_dependency

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

SELECT TOP 1

1 голос
/ 09 июля 2014

Я только что собрал пост, в котором говорится, почему переходные зависимости вообще плохая идея: http://www.essentialsql.com/get-ready-to-learn-sql-11-database-third-normal-form-explained-in-simple-english/

...