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