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.
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ć jegoInstructor
więcCourse ->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ć jegoPhone
więcInstructor->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:
- Jeśli usuniesz oba kursy
French
iEnglish
wtedy usuniesz ich instruktoraJohn Doe
, a jego numer telefonu zostanie utracony na zawsze. - nie ma możliwości dodania nowego
Instructor
do bazy danych, chyba że najpierw dodaszCourse
dla niego, lub możesz skopiować dane wInstructors table
, co jest jeszcze gorsze. - 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. - nie możesz usunąć Instruktor z bazy danych, chyba że usuniesz wszystkie kursy, których uczy lub ustawisz wszystkie jego pola NA null. 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.
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:
- z definicji, dla funkcjonalnej zależności X->Y->Z, aby również być transitive, Xnie trzymać.
- If y was klucz, X(PRZYPIS1)
- ponieważ Y nie jest kluczem, każdy dany Y może być powtórzony w wielu wierszach.
- Y - > Z oznacza, że wszystkie wiersze posiadające to samo Y muszą również posiadać to samo Z. (PRZYPIS2)
- 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_ID
s, ale zachowajmy tutaj prostotę.)
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 .
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ę.
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.
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/
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