| | 1 | == Нормализација == |
| | 2 | |
| | 3 | === Нормализација на Transaction === |
| | 4 | |
| | 5 | Првично: **Transaction = {__TransactionId__, __!RequestId*__, __!BorrowerId*__, __!LenderId*__, __!InventoryId*__, !BorrowDate, !ReturnDate, !BorrowDuration}** |
| | 6 | |
| | 7 | • !RequestId референцира кон !BookRequest(!RequestId) |
| | 8 | • !BorrowerId референцира кон !AppUser(!UserId) |
| | 9 | • !LenderId референцира кон !AppUser(!UserId) |
| | 10 | • !InventoryId референцира кон Library(!InventoryId) |
| | 11 | |
| | 12 | ||= !TransactionId =||= !RequestId =||= !BorrowerId =||= !LenderId =||= !InventoryId =||= !BorrowDate =||= !ReturnDate =||= !BorrowDuration =|| |
| | 13 | ||= 1 =||= 1 =||= 2 =||= 3 =||= 1 =||= 2024-04-15 =||= 2024-04-25 =||= 10 =|| |
| | 14 | ||= 2 =||= 2 =||= 3 =||= 2 =||= 2 =||= 2024-06-23 =||= 2024-06-28 =||= 5 =|| |
| | 15 | |
| | 16 | **1НФ**: Вредностите на атрибутите се атомични. |
| | 17 | |
| | 18 | **2НФ**: Сите атрибути се функционално определени од примарниот клуч !TransactionId кој е составен од само еден атрибут (не е композитен). |
| | 19 | |
| | 20 | |
| | 21 | **3НФ**: Примарниот клуч !TransactionId ги одредува сите атрибути. |
| | 22 | |
| | 23 | Но, ако го знаеме !RequestId, исто така ги знаеме и !BorrowerId, !LenderId, и !InventoryId, и со тоа, следува функционалната зависност: |
| | 24 | |
| | 25 | **!RequestId -> !BorrowerId, !LenderId, !InventoryId.** |
| | 26 | |
| | 27 | Што пак води до транзитивност: |
| | 28 | |
| | 29 | **!TransactionId -> !RequestId -> !BorrowerId** |
| | 30 | |
| | 31 | **!TransactionId -> !RequestId -> !LenderId** |
| | 32 | |
| | 33 | **!TransactionId -> !RequestId -> !InventoryId** |
| | 34 | |
| | 35 | Бидејќи !RequestId не е супер-клуч, односно не ги одредува сите атрибути, ја нарушува 3НФ. |
| | 36 | За да го поправиме ова, може едноставно да се извадат !BorrowerId, !LenderId, и !InventoryId од релацијата Transaction, кои можеме лесно да ги добиеме преку !RequestId. |
| | 37 | |
| | 38 | |
| | 39 | |
| | 40 | |
| | 41 | |
| | 42 | Така новата релација станува: |
| | 43 | |
| | 44 | **Transaction = {__TransactionId__, __!RequestId*__, !BorrowDate, !ReturnDate, !BorrowDuration}** |
| | 45 | |
| | 46 | |
| | 47 | **БКНФ**: Новата релација е во БКНФ, со тоа што единствената ФЗ тука е **!TransactionId -> !RequestId, !BorrowDate, !ReturnDate, !BorrowDuration** со примарен клуч на левата страна. |
| | 48 | |
| | 49 | |
| | 50 | |
| | 51 | === Нормализација на !BookRequest === |
| | 52 | |
| | 53 | Првично: **!BookRequest = {__RequestId__, __!RequesterId*__, __!OwnerId*__, __!BookId*__, __!InventoryId*__, !RequestStatus, !RequestDate}** |
| | 54 | |
| | 55 | • !RequesterId референцира кон !AppUser(!UserId) |
| | 56 | • !OwnerId референцира кон !AppUser(!UserId) |
| | 57 | • !BookId референцира кон Book(!BookId) |
| | 58 | • !InventoryId референцира кон Library(!InventoryId) |
| | 59 | |
| | 60 | ||= !RequestId =||= !RequesterId =||= !OwnerId =||= !BookId =||= !InventoryId =||= !RequestStatus =||= !RequestDate =|| |
| | 61 | ||= 1 =||= 1 =||= 2 =||= 1 =||= 1 =||= Approved =||= 2024-04-15 =|| |
| | 62 | ||= 2 =||= 1 =||= 4 =||= 3 =||= 2 =||= Pending =||= 2024-06-23 =|| |
| | 63 | |
| | 64 | **1НФ**: Вредностите на атрибутите се атомични. |
| | 65 | |
| | 66 | **2НФ**: Сите атрибути се функционално определени од примарниот клуч !RequestId кој е составен од само еден атрибут (не е композитен). |
| | 67 | |
| | 68 | |
| | 69 | **3НФ**: Примарниот клуч !RequestId ги одредува сите атрибути. |
| | 70 | |
| | 71 | Но, ако ги погледнеме !InventoryId и !BookId, меѓу нив може да ја има функционалната зависност: |
| | 72 | |
| | 73 | **!InventoryId -> !BookId** |
| | 74 | |
| | 75 | Заради тоа што !InventoryId ќе биде поврзано за специфична книга, поради појавата на транзитивност !RequestId -> !InventoryId -> !BookId, и поради тоа што !InventoryId не е супер-клуч, ова може да ја наруши 3НФ. |
| | 76 | Бидејќи веќе имаме релација !ContainsLibraryBook(!InventoryId*, !BookId*), можеме безбедно да го извадиме атрибутот !BookId од !BookRequest, бидејќи преку !InventoryId можеме лесно да стигнеме до !BookId, и точно да одредиме за која книга се работи. |
| | 77 | |
| | 78 | Па затоа можеме да ја смениме релацијата во: |
| | 79 | **!BookRequest= {__RequestId__, __!RequesterId*__, __!OwnerId*__, __!InventoryId*__, !RequestStatus, !RequestDate}** |
| | 80 | |
| | 81 | И сега да ја исполнува 3НФ. |
| | 82 | |
| | 83 | **БКНФ**: На левата страна од ФЗ има супер-клуч. |
| | 84 | |
| | 85 | |
| | 86 | |
| | 87 | === Нормализација на Notification === |
| | 88 | |
| | 89 | Првично: **Notification(__NotificationId__, __!TransactionId*__, __!MessageId*__, __!FriendRequestId*__, __!BookRequestId*__, Type, !NotifTime, !NotifDate, Description, !NotificationStatus)** |
| | 90 | |
| | 91 | • !TransactionId референцира кон Transaction(!TransactionId) |
| | 92 | • !MessageId референцира кон Transaction(!MessageId) |
| | 93 | • !FriendRequestId референцира кон Transaction(!FriendshipId) |
| | 94 | • !BookRequestId референцира кон Transaction(!RequestId) |
| | 95 | |
| | 96 | ||= !NotificationId =||= !TransactionId =||= !MessageId =||= !FriendRequestId =||= !BookRequestId =||= Type =||= !NotifTime =||= !NotifDate =||= Description =||= !NotificationStatus =|| |
| | 97 | ||= 1 =||= 1 =||= NULL =||= NULL =||= NULL =||= Transaction =||= 14:34:54 =||= 2025-01-02 =||= Ongoing Transaction! =||= Unread =|| |
| | 98 | ||= 3 =||= NULL =||= 2 =||= NULL =||= NULL =||= Message =||= 12:02:04 =||= 2025-03-04 =||= Anya sent you a message! =||= Dismissed =|| |
| | 99 | |
| | 100 | **1НФ**: Вредностите на атрибутите се атомични. |
| | 101 | |
| | 102 | |
| | 103 | **2НФ**: Сите атрибути се функционално определени од примарниот клуч !NotificationId, кој е составен од само еден атрибут (не е композитен). |
| | 104 | |
| | 105 | **3НФ**: Во случајов има транзитивни зависности: |
| | 106 | |
| | 107 | **!NotificationId -> Type**, |
| | 108 | **Type -> !TransactionId** |
| | 109 | |
| | 110 | **!NotificationId -> Type**, |
| | 111 | **Type -> !MessageId** |
| | 112 | |
| | 113 | **!NotificationId -> Type**, |
| | 114 | **Type -> !FriendRequestId** |
| | 115 | |
| | 116 | **!NotificationId -> Type**, |
| | 117 | **Type -> !BookRequestId** |
| | 118 | |
| | 119 | |
| | 120 | Ова може да се реши со чување на главните податоци за известувањето во ентитетот Notification, и креирање на нови релации за секое од видовите известувања, со надворешен клуч од ентитетот Notification, и надворешен клуч од соодветниот ентитет кој го предизвикал известувањето: |
| | 121 | |
| | 122 | **Notification(__NotificationId__, Type, !NotifTime, !NotifDate, !NotificationStatus)** |
| | 123 | |
| | 124 | **!TransactionNotification(__!TransactionId*__, __!NotificationId*__, Description)** |
| | 125 | |
| | 126 | -!TransactionId референцира кон Transaction(!TransactionId) |
| | 127 | |
| | 128 | -!NotificationId референцира кон Notification(!NotificationId) |
| | 129 | |
| | 130 | **!MessageNotification(__MessageId*__, __!NotificationId*__, Description)** |
| | 131 | |
| | 132 | -!MessageId референцира кон Message(!MessageId) |
| | 133 | |
| | 134 | -!NotificationId референцира кон Notification(!NotificationId) |
| | 135 | |
| | 136 | **!FriendRequestNotification(__FriendRequestId*__, __!NotificationId*__, Description)** |
| | 137 | |
| | 138 | -!FriendRequestId референцира кон !FriendRequest(!FriendRequestId) |
| | 139 | |
| | 140 | -!NotificationId референцира кон Notification(!NotificationId) |
| | 141 | |
| | 142 | **!BookRequestNotification(__BookRequestId*__, __!NotificationId*__, Description)** |
| | 143 | |
| | 144 | -!BookRequestId референцира кон !BookRequest(!BookRequestId) |
| | 145 | |
| | 146 | -!NotificationId референцира кон Notification(!NotificationId) |
| | 147 | |
| | 148 | На овој начин релациите се во 3НФ. |
| | 149 | |
| | 150 | **БКНФ**: Notification, како и !TransactionNotification, !MessageNotification, !FriendRequestNotification, !BookRequestNotification, се во БКНФ и на левата страна од функционите зависности имаат суперклуч. |