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, се во БКНФ и на левата страна од функционите зависности имаат суперклуч. |
| 2 | * [wiki:Normalization001 Прв Чекор] |
| 3 | * [wiki:Normalization002 Втор Чекор] |