wiki:Нормализација и подобрувања на дизајнот

Version 2 (modified by 201205, 11 days ago) ( diff )

--

Нормализација

Нормализација на Transaction

Првично: Transaction = {TransactionId, RequestId*, BorrowerId*, LenderId*, InventoryId*, BorrowDate, ReturnDate, BorrowDuration}

  • RequestId референцира кон BookRequest(RequestId)
  • BorrowerId референцира кон AppUser(UserId)
  • LenderId референцира кон AppUser(UserId)
  • InventoryId референцира кон Library(InventoryId)
TransactionId RequestId BorrowerId LenderId InventoryId BorrowDate ReturnDate BorrowDuration
1 1 2 3 1 2024-04-15 2024-04-25 10
2 2 3 2 2 2024-06-23 2024-06-28 5

1НФ: Вредностите на атрибутите се атомични.

2НФ: Сите атрибути се функционално определени од примарниот клуч TransactionId кој е составен од само еден атрибут (не е композитен).

3НФ: Примарниот клуч TransactionId ги одредува сите атрибути.

Но, ако го знаеме RequestId, исто така ги знаеме и BorrowerId, LenderId, и InventoryId, и со тоа, следува функционалната зависност:

RequestId -> BorrowerId, LenderId, InventoryId.

Што пак води до транзитивност:

TransactionId -> RequestId -> BorrowerId

TransactionId -> RequestId -> LenderId

TransactionId -> RequestId -> InventoryId

Бидејќи RequestId не е супер-клуч, односно не ги одредува сите атрибути, ја нарушува 3НФ. За да го поправиме ова, може едноставно да се извадат BorrowerId, LenderId, и InventoryId од релацијата Transaction, кои можеме лесно да ги добиеме преку RequestId.

Така новата релација станува:

Transaction = {TransactionId, RequestId*, BorrowDate, ReturnDate, BorrowDuration}

БКНФ: Новата релација е во БКНФ, со тоа што единствената ФЗ тука е TransactionId -> RequestId, BorrowDate, ReturnDate, BorrowDuration со примарен клуч на левата страна.

Нормализација на 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НФ.

БКНФ: На левата страна од ФЗ има супер-клуч.

Note: See TracWiki for help on using the wiki.