Co jest nie tak z zależnością przechodnią?

Mam pewne zależności przechodnie w moim projekcie bazy danych. Moi przełożeni powiedzieli mi, że to może powodować błędy. Trudno mi znaleźć zasoby, które powiedzą mi, jak posiadanie tych zależności spowoduje błędy. Jakie problemy spowodują?

Nie kwestionuję tego faktu, po prostu chętnie się dowiem, jakie problemy mogą powodować.

Edytuj, aby uzyskać więcej szczegółów:

Z Wikipedii:

Zależność przechodnia
Zależność przechodnia jest pośrednią zależnością funkcyjną, w której X→z tylko na mocy X→Y I Y→Z.

Author: Brian Tompsett - 汤莱恩, 2012-03-31

5 answers

Wyjaśnię na przykładzie:

-------------------------------------------------------------------
|  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       |
-------------------------------------------------------------------
  • Jeśli masz Course możesz łatwo uzyskać jego Instructor więc Course ->Instructor.
  • Jeśli masz Instructor nie możesz go zdobyć Course ponieważ może uczyć różnych kursów.
  • Jeśli masz Instructor możesz łatwo uzyskać jego Phone więc Instructor->Phone.

Oznacza to, że jeśli masz Course to możesz uzyskać Instructor Phone co oznacza Course ->Instructor Phone (tj. zależność przechodnia)

A teraz problemy:

  1. Jeśli usuniesz oba kursy French i English wtedy usuniesz ich instruktora John Doe, a jego numer telefonu zostanie utracony na zawsze.
  2. nie ma możliwości dodania nowego Instructor do bazy danych, chyba że najpierw dodasz Course dla niego, lub możesz skopiować dane w Instructors table, co jest jeszcze gorsze.
  3. Jeśli instruktor John Doe zmieni swój numer telefonu, będziesz musiał zaktualizować wszystkie kursy, które uczy, o nowe informacje, które mogą być bardzo podatne na błędy.
  4. nie możesz usunąć Instruktor z bazy danych, chyba że usuniesz wszystkie kursy, których uczy lub ustawisz wszystkie jego pola NA null.
  5. Co jeśli zdecydujesz się zachować datę urodzenia swoich instruktorów? Musisz dodać pole Birth Date do tabeli Courses. Czy to w ogóle brzmi logicznie? Po co w pierwszej kolejności przechowywać informacje instruktora w tabeli kursów.
 49
Author: Songo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-30 22:16:55

Jednym ze sposobów wyrażenia 3NF jest:

Wszystkie atrybuty powinny zależeć od klucza, całego klucza i nic poza kluczem.

Zależność przechodnia X - > Y - > Z narusza tę zasadę, prowadząc do redundancji danych i potencjalnych anomalii modyfikacji.


Wyjaśnijmy to sobie:

  1. z definicji, dla funkcjonalnej zależności X->Y->Z, aby również być transitive, Xnie trzymać.
  2. If y was klucz, X(PRZYPIS1)
  3. ponieważ Y nie jest kluczem, każdy dany Y może być powtórzony w wielu wierszach.
  4. Y - > Z oznacza, że wszystkie wiersze posiadające to samo Y muszą również posiadać to samo Z. (PRZYPIS2)
  5. powtarzanie krotki tej samej krotki (Y, Z) w kilku wierszach nie wnosi żadnych użytecznych informacji do systemu. Jest to zbędne .

W skrócie, ponieważ Y nie jest kluczem, A Y - > Z, mamy naruszył 3NF.

Redundancje prowadzą do anomalii modyfikacji (np. aktualizacja niektórych , ale nie wszystkich Zs "podłączonych" do tego samego Y zasadniczo psuje dane, ponieważ nie wiesz już, która kopia jest poprawna). Jest to zazwyczaj rozwiązywane przez podział oryginalnej tabeli na dwie tabele, jedna zawierająca {X, Y} i druga zawierająca {Y, Z}, W ten sposób, Y może być kluczem w drugiej tabeli, a Z nie jest powtarzany.

Z drugiej strony, jeśli X Y - > Z nie jest przechodni), wtedy możemy zachować jedną tabelę, gdzie zarówno X jak i Y są kluczami. Z nie będzie niepotrzebnie powtarzany w tym scenariuszu.

(PRZYPIS1) klucz jest (minimalnym) zestawem atrybutów, które funkcjonalnie określają wszystkie atrybuty w relacji. Uzasadnienie: jeśli K jest kluczem, nie może być wiele wierszy o tej samej wartości K, więc każda dana wartość K jest zawsze powiązana z dokładnie jedną wartością każdego innego atrybutu (zakładając 1NF). Z definicji (patrz PRZYPIS2), "bycie kojarzonym z jednym" to to samo, co "bycie w zależności funkcjonalnej".

(Przypisy 2) Z definicji , Y - > Z wtedy i tylko wtedy, gdy każda wartość Y jest związana dokładnie z jedną wartością Z.


Przykład:

Zakładając, że każda wiadomość ma dokładnie jednego autora i każdy autor ma dokładnie jeden główny e-mail, próba reprezentowania wiadomości i użytkowników w tej samej tabeli prowadziłaby do powtórzenia e-maile:

MESSAGE                         USER    EMAIL
-------                         ----    -----
Hello.                          Jon     [email protected]
Hi, how are you?                Rob     [email protected]
Doing fine, thanks for asking.  Jon     [email protected]

(w rzeczywistości byłyby to MESSAGE_IDs, ale zachowajmy tutaj prostotę.)

Co się stanie, jeśli Jon zmieni e-mail na: "[email protected]"? musielibyśmy zaktualizować oba rzędy Jona. Jeśli zaktualizujemy tylko jeden, mamy następującą sytuację...
MESSAGE                         USER    EMAIL
-------                         ----    -----
Hello.                          Jon     [email protected]
Hi, how are you?                Rob     [email protected]
Doing fine, thanks for asking.  Jon     [email protected]

...i nie wiemy już, który z e-maili Jona jest poprawny. W zasadzie straciliśmy dane!

Sytuacja jest szczególnie zła, ponieważ tam nie jest ograniczeniem deklaratywnym, którego moglibyśmy użyć, aby zmusić DBMS do wymuszenia obu aktualizacji dla nas. Kod klienta będzie miał błędy i prawdopodobnie został napisany bez większego uwzględnienia złożonych interakcji, które mogą się zdarzyć w środowisku współbieżnym.

Jednakże, jeśli podzielisz stół...

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

USER    EMAIL
----    -----
Jon     [email protected]
Rob     [email protected]

...jest teraz tylko jeden wiersz, który wie o e-mailu Jona, więc dwuznaczność jest niemożliwa.

BTW, wszystko to można postrzegać jako kolejne wyrażenie suchego zasada .

 10
Author: Branko Dimitrijevic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-03 14:37:33

Jeśli w Twojej tabeli istnieją zależności przechodnie, to nie jest ona zgodna z 3NF; więc istnieje duże prawdopodobieństwo, że w Twojej tabeli znajdują się nadmiarowe dane. Sprawdź to , aby wyjaśnić tę koncepcję.

 5
Author: Carlos Gavidia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-30 21:10:57

Spójrz na ten link:

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

Na przykładzie, co by się stało, gdybym zaktualizował narodowość Juliusza Verne ' a w jednym rzędzie, a nie w drugim? Narodowość autora określa sam autor, a nie kombinacja książki i autora. Więc z przykładową strukturą danych, mógłbym potencjalnie zapytać bazę danych o narodowość Juliusza Verne ' a. Jeśli uruchomiłem następujące polecenie SQL

WYBIERZ TOP 1 autor_nationality z książek WHERE author= 'Jules Verne'

Mogę uzyskać inną odpowiedź w zależności od tego, jak Baza Danych wybiera TOP 1.

 3
Author: Sparky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-30 21:11:30

Właśnie stworzyłem post, w którym wyjaśniam, dlaczego zależności przechodnie są ogólnie złym pomysłem: http://www.essentialsql.com/get-ready-to-learn-sql-11-database-third-normal-form-explained-in-simple-english/

 1
Author: Kris Wenzel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-09 02:46:02