Транзитивната зависимост в база данни е непряка връзка между стойностите в същата таблица, която причинява функционална зависимост. За да постигнете стандарт за нормализиране на третата нормална форма (3NF), трябва да премахнете всяка транзитивна зависимост.
По своята същност транзитивната зависимост изисква три или повече атрибута (или колони за бази данни), които имат функционална зависимост между тях, което означава, че колона А в таблица разчита на колона Б чрез междинна колона В.
Да видим как това може да работи.
Пример за транзитивна зависимост
АВТОРИТЕ
Author_ID | автор | Книга | Author_Nationality |
---|---|---|---|
Auth_001 | Орсън Скот карта | Играта на Ендър | Съединени щати |
Auth_001 | Орсън Скот карта | Играта на Ендър | Съединени щати |
Auth_002 | Маргарет Атууд | Приказката на Девалката | Канада |
В горния пример AUTHORS:
- Книга → автор : Тук, Книга атрибут определя автор атрибут. Ако знаете името на книгата, можете да научите името на автора. Въпреки това, автор не определя Книга , защото един автор може да напише няколко книги. Например, само защото знаем името на автора Орсън Скот Кар, все още не знаем името на книгата.
- автор → 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 | Маргарет Атууд | Канада |
Това ли го оправи? Нека разгледаме нашите зависимости сега:
КНИГИ таблица:
- 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 |
Сега имаме три маси, като използваме чужди ключове за свързване между масите:
- Външният ключ на таблицата в книгата Author_ID свързва книга с автор в таблицата АВТОРИ.
- Външният ключ на таблицата на AUTHORS Country_ID свързва автор към държава в таблицата COUNTRIES.
- Таблицата COUNTRIES няма чужд ключ, тъй като няма нужда да се свързва с друга таблица в този дизайн.
Защо транзитивните зависимости са лоши База данни
Каква е стойността на избягване на транзитивни зависимости, за да се гарантира, че 3NF? Да разгледаме отново първата ни маса и да видим създадените от нея проблеми:
АВТОРИТЕ
Author_ID | автор | Книга | Author_Nationality |
---|---|---|---|
Auth_001 | Орсън Скот карта | Играта на Ендър | Съединени щати |
Auth_001 | Орсън Скот карта | Децата на ума | Съединени щати |
Auth_002 | Маргарет Атууд | Приказката на Девалката | Канада |
Този вид дизайн може да допринесе за аномалии и несъответствия в данните, например:
- Ако сте изтрили двете книги "Децата на ума" и "Играта на Ендър", ще изтриете изцяло автора "Orson Scott Card" и неговата националност от базата данни.
- Не можете да добавяте нов автор към базата данни, освен ако не добавите и книга; какво ще стане, ако авторът все още не е публикуван или не познавате името на книгата, която е автор?
- Ако "Орсън Скот Карт" промени своето гражданство, ще трябва да го промените във всички записи, в които той се появява. Имайки множество записи със същия автор, това може да доведе до неточни данни: какво ще стане, ако човекът за въвеждане на данни не осъзнае, че има много записи за него и променя данните само в един запис?
- Не можете да изтриете книга като "Приказката на дервиката", без да изтривате напълно автора.
Това са само някои причини, поради които нормализирането и избягването на транзитивни зависимости защитават данните и осигуряват последователност.