Избегнувајте транзитивни зависности за да се обезбеди нормализација
Транзитивната зависност во базата на податоци е индиректен однос помеѓу вредностите во истата табела која предизвикува функционална зависност . За да го постигнете нормалниот стандард на третата нормална форма (3NF), мора да ја елиминирате транзитивната зависност.
По својата природа, транзитивната зависност бара три или повеќе атрибути (или колона на база на податоци) кои имаат функционална зависност меѓу нив, што значи дека колоната А во табела се потпира на колона Б преку посредната колона В.
Ајде да видиме како ова може да функционира.
Пример за транзитивна зависност
АВТОРИ
Author_ID | Автор | Книга | Author_Nationality |
---|---|---|---|
Auth_001 | Орсон Скот картичка | Играта на Ендер | Соединети Држави |
Auth_001 | Орсон Скот картичка | Играта на Ендер | Соединети Држави |
Auth_002 | Маргарет Атвуд | Приказна за слугинката | Канада |
Во горниот пример AUTHORS:
- Книга → Автор : Еве, атрибутот Книга го одредува атрибутот Автор . Ако го знаете името на книгата, можете да го научите името на авторот. Сепак, авторот не одредува Книга , бидејќи авторот може да напише повеќе книги. На пример, само затоа што го знаеме името на авторот Орсон Скот Карт, сè уште не го знаеме името на книгата.
- Автор → Авторски назив : Исто така, атрибутот на авторот го одредува Авторското име , но не и обратно; само затоа што знаеме дека националноста не значи дека можеме да го одредиме авторот.
Но, оваа табела воведува транзитивна зависност:
- Книга → 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_ID → Author_Nationality: Националноста може да се одреди од Author_ID преку атрибутот на авторот . Сè уште имаме транзитивна зависност.
Треба да додадеме трета табела за нормализирање на овие податоци:
COUNTRIES
Country_ID | Земја |
---|---|
Coun_001 | Соединети Држави |
Coun_002 | Канада |
АВТОРИ
Author_ID | Автор | Country_ID |
---|---|---|
Auth_001 | Орсон Скот картичка | Coun_001 |
Auth_002 | Маргарет Атвуд | Coun_002 |
Сега имаме три табели, користејќи ги странските клучеви за поврзување меѓу табелите:
- Странскиот клуч на табелата на КНИГА е автор на линкот на книга до авторот во табелата AUTHORS.
- Странскиот клуч на табелата AUTHORS Country_ID го поврзува авторот со земја во табелата COUNTRIES.
- Табелата COUNTRIES нема странски клуч, бидејќи нема потреба да се поврзува со друга табела во овој дизајн.
Зошто транзитивните зависности се лоши База на податоци за дизајн
Која е вредноста на избегнување на транзитивни зависности кои ќе помогнат да се обезбеди 3NF? Ајде повторно да ја разгледаме нашата прва маса и да ги видиме проблемите што ги создава:
АВТОРИ
Author_ID | Автор | Книга | Author_Nationality |
---|---|---|---|
Auth_001 | Орсон Скот картичка | Играта на Ендер | Соединети Држави |
Auth_001 | Орсон Скот картичка | Деца на умот | Соединети Држави |
Auth_002 | Маргарет Атвуд | Приказна за слугинката | Канада |
Овој вид на дизајн може да придонесе за податоци аномалии и недоследности, на пример:
- Ако ги избришате двете книги "Деца на умот" и "Игра на ендер", ќе го избришете авторот "Орсон Скот картичка" и неговата националност целосно од базата на податоци.
- Не можете да додадете нов автор во базата на податоци, освен ако не додадете книга; што ако авторот сеуште не е публикуван или не го знаете името на книгата што ја напишала?
- Ако "Орсон Скот картичка" го промени своето државјанство, ќе треба да го промените во сите записи во кои тој се појавува. Имањето повеќе записи со истиот автор може да резултира со неточни податоци: што ако лицето за внес на податоци не сфаќа дека има повеќе записи за него и ги менува податоците само во еден запис?
- Не можете да избришете книга како "Приказна за слугинката", без целосно бришење на авторот.
Ова се само некои причини зошто нормализацијата и избегнувањето транзитивни зависности ги штитат податоците и обезбедуваат конзистентност.