Changes between Version 7 and Version 8 of Нормализација и подобрувања на дизајнот


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

--

Legend:

Unmodified
Added
Removed
Modified
  • Нормализација и подобрувања на дизајнот

    v7 v8  
    1 == Нормализација ==
    21
    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 Втор Чекор]