== Нормализација == === Нормализација на !BookRequest === Првично: **!BookRequest = {__RequestId__, __!RequesterId*__, __!OwnerId*__, __!BookId*__, __!InventoryId*__, !RequestStatus, !RequestDate}** • !RequesterId референцира кон User(!UserId) • !OwnerId референцира кон User(!UserId) • !BookId референцира кон Book(!BookId) • !InventoryId референцира кон Library(!InventoryId) ||= !RequestId =||= !RequesterId =||= !OwnerId =||= !BookId =||= !InventoryId =||= !RequestStatus =||= !RequestDate =|| ||= 1 =||= 1 =||= 2 =||= 1 =||= 1 =||= Approved =||= 2024-04-15 =|| ||= 2 =||= 1 =||= 4 =||= 3 =||= 2 =||= Pending =||= 2024-06-23 =|| 1НФ: Вредностите на атрибутите се атомични. 2НФ: Сите атрибути се функционално определени од примарниот клуч !RequestId кој е составен од само еден атрибут (не е композитен). 3НФ: Примарниот клуч !RequestId ги одредува сите атрибути. Но, ако ги погледнеме !InventoryId и !BookId, меѓу нив може да ја има функционалната зависност: **!InventoryId -> !BookId** Заради тоа што !InventoryId ќе биде поврзано за специфична книга, поради појавата на транзитивност !RequestId -> !InventoryId -> !BookId, и поради тоа што !InventoryId не е супер-клуч, ова може да ја наруши 3НФ. Бидејќи веќе имаме релација !ContainsLibraryBook(!InventoryId*, !BookId*), можеме безбедно да го извадиме атрибутот !BookId од !BookRequest, бидејќи преку !InventoryId можеме лесно да стигнеме до !BookId, и точно да одредиме за која книга се работи. Па затоа можеме да ја смениме релацијата во: **!BookRequest= {!RequestId, !RequesterId*, !OwnerId*, !InventoryId*, !RequestStatus, !RequestDate}** И сега да ја исполнува 3НФ. БКНФ: На левата страна од ФЗ има супер-клуч.