| 1 | == Нормализација == |
| 2 | |
| 3 | === Нормализација на !BookRequest === |
| 4 | |
| 5 | Првично: **!BookRequest = {__RequestId__, __!RequesterId*__, __!OwnerId*__, __!BookId*__, __!InventoryId*__, !RequestStatus, !RequestDate}** |
| 6 | |
| 7 | • !RequesterId референцира кон User(!UserId) |
| 8 | • !OwnerId референцира кон User(!UserId) |
| 9 | • !BookId референцира кон Book(!BookId) |
| 10 | • !InventoryId референцира кон Library(!InventoryId) |
| 11 | |
| 12 | ||= !RequestId =||= !RequesterId =||= !OwnerId =||= !BookId =||= !InventoryId =||= !RequestStatus =||= !RequestDate =|| |
| 13 | ||= 1 =||= 1 =||= 2 =||= 1 =||= 1 =||= Approved =||= 2024-04-15 =|| |
| 14 | ||= 2 =||= 1 =||= 4 =||= 3 =||= 2 =||= Pending =||= 2024-06-23 =|| |
| 15 | |
| 16 | 1НФ: Вредностите на атрибутите се атомични. |
| 17 | 2НФ: Сите атрибути се функционално определени од примарниот клуч !RequestId кој е составен од само еден атрибут (не е композитен). |
| 18 | |
| 19 | |
| 20 | 3НФ: Примарниот клуч !RequestId ги одредува сите атрибути. |
| 21 | |
| 22 | Но, ако ги погледнеме !InventoryId и !BookId, меѓу нив може да ја има функционалната зависност: |
| 23 | |
| 24 | **!InventoryId -> !BookId** |
| 25 | |
| 26 | Заради тоа што !InventoryId ќе биде поврзано за специфична книга, поради појавата на транзитивност !RequestId -> !InventoryId -> !BookId, и поради тоа што !InventoryId не е супер-клуч, ова може да ја наруши 3НФ. |
| 27 | Бидејќи веќе имаме релација !ContainsLibraryBook(!InventoryId*, !BookId*), можеме безбедно да го извадиме атрибутот !BookId од !BookRequest, бидејќи преку !InventoryId можеме лесно да стигнеме до !BookId, и точно да одредиме за која книга се работи. |
| 28 | |
| 29 | Па затоа можеме да ја смениме релацијата во: |
| 30 | **!BookRequest= {!RequestId, !RequesterId*, !OwnerId*, !InventoryId*, !RequestStatus, !RequestDate}** |
| 31 | |
| 32 | И сега да ја исполнува 3НФ. |
| 33 | |
| 34 | БКНФ: На левата страна од ФЗ има супер-клуч. |