Changes between Initial Version and Version 1 of Normalization001


Ignore:
Timestamp:
09/04/25 10:57:18 (5 days ago)
Author:
201205
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization001

    v1 v1  
     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, се во БКНФ и на левата страна од функционите зависности имаат суперклуч.