Changes between Initial Version and Version 1 of Normalization


Ignore:
Timestamp:
09/25/26 06:03:54 (6 days ago)
Author:
223306
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v1 v1  
     1= Normalization =
     2
     3== De-normalized database form ==
     4
     5Процесот на нормализација започнува од една унифицирана денормализирана релација R која ги содржи сите атрибути од концептуалниот модел на BiblioPremium, како сите податоци да се чуваат во една единствена табела.
     6
     7Бидејќи во унифицираната релација не смее да има дупликати на имиња на атрибути, атрибутите со исти или слични имиња се именувани со префикс според ентитетот или релацијата на која припаѓаат.
     8
     9За M:N релациите се користат посебни идентификатори според улогата во која учествуваат. На пример, жанрот поврзан со книга и жанрот што го преферира корисникот се два различни факти, па се претставуваат со `kniga_zhanr_id` и `preferiran_zhanr_id`. Истото важи за категориите и расположенијата.
     10
     11{{{
     12R(
     13  korisnik_id, korisnik_ime, korisnik_prezime, korisnik_email,
     14  korisnik_lozinka, korisnik_datum_registracija, korisnik_uloga,
     15
     16  naracka_id, naracka_datum, naracka_status, naracka_vkupna_cena,
     17
     18  plakjanje_id, plakjanje_datum, plakjanje_iznos,
     19  plakjanje_nacin, plakjanje_status,
     20
     21  kniga_id, kniga_naslov, kniga_isbn, kniga_opis,
     22  kniga_korica_url, kniga_godina_izdavanje,
     23  kniga_kolicina_na_zaliha, kniga_cena,
     24
     25  avtor_id, avtor_ime, avtor_prezime, avtor_biografija,
     26
     27  kniga_zhanr_id, kniga_zhanr_naziv, kniga_zhanr_opis,
     28
     29  kniga_kategorija_id, kniga_kategorija_naziv,
     30  kniga_kategorija_opis,
     31
     32  kniga_raspolozenie_id, kniga_raspolozenie_naziv,
     33  kniga_raspolozenie_opis,
     34
     35  sodrzi_kolicina, sodrzi_edinechna_cena,
     36
     37  omilena_kniga_id, omileni_datum_dodavanje,
     38
     39  preferiran_zhanr_id, preferiran_zhanr_naziv,
     40  preferiran_zhanr_opis, preferira_zhanr_datum_dodavanje,
     41
     42  preferirana_kategorija_id, preferirana_kategorija_naziv,
     43  preferirana_kategorija_opis,
     44  preferira_kategorija_datum_dodavanje,
     45
     46  izbrano_raspolozenie_id, izbrano_raspolozenie_naziv,
     47  izbrano_raspolozenie_opis,
     48  izbira_raspolozenie_datum_izbor
     49)
     50}}}
     51
     52Во унифицираната релација се опфатени податоците за корисниците, книгите, авторите, жанровите, категориите, расположенијата, нарачките и плаќањата, како и атрибутите на M:N релациите SODRZI, OMILENI, PREFERIRA_ZHANR, PREFERIRA_KATEGORIJA и IZBIRA_RASPOLOZENIE.
     53
     54Релациите NAPISANA_OD, IMA_ZHANR, IMA_KATEGORIJA и POVRZANA_SO немаат сопствени описни атрибути. Тие претставуваат факти за поврзување помеѓу соодветните ентитети.
     55
     56== Functional dependencies ==
     57
     58Од глобалното множество на атрибути се определува следното канонично покривање на функционалните зависности што важат во унифицираната релација R.
     59
     60{{{
     61FD1:
     62korisnik_id →
     63korisnik_ime, korisnik_prezime, korisnik_email,
     64korisnik_lozinka, korisnik_datum_registracija, korisnik_uloga
     65
     66FD2:
     67korisnik_email → korisnik_id
     68
     69FD3:
     70naracka_id →
     71naracka_datum, naracka_status, naracka_vkupna_cena, korisnik_id
     72
     73FD4:
     74plakjanje_id →
     75plakjanje_datum, plakjanje_iznos, plakjanje_nacin,
     76plakjanje_status, naracka_id
     77
     78FD5:
     79kniga_id →
     80kniga_naslov, kniga_isbn, kniga_opis, kniga_korica_url,
     81kniga_godina_izdavanje, kniga_kolicina_na_zaliha, kniga_cena
     82
     83FD6:
     84kniga_isbn → kniga_id
     85
     86FD7:
     87avtor_id →
     88avtor_ime, avtor_prezime, avtor_biografija
     89
     90FD8:
     91kniga_zhanr_id →
     92kniga_zhanr_naziv, kniga_zhanr_opis
     93
     94FD9:
     95kniga_kategorija_id →
     96kniga_kategorija_naziv, kniga_kategorija_opis
     97
     98FD10:
     99kniga_raspolozenie_id →
     100kniga_raspolozenie_naziv, kniga_raspolozenie_opis
     101
     102FD11:
     103naracka_id, kniga_id →
     104sodrzi_kolicina, sodrzi_edinechna_cena
     105
     106FD12:
     107korisnik_id, omilena_kniga_id →
     108omileni_datum_dodavanje
     109
     110FD13:
     111preferiran_zhanr_id →
     112preferiran_zhanr_naziv, preferiran_zhanr_opis
     113
     114FD14:
     115korisnik_id, preferiran_zhanr_id →
     116preferira_zhanr_datum_dodavanje
     117
     118FD15:
     119preferirana_kategorija_id →
     120preferirana_kategorija_naziv, preferirana_kategorija_opis
     121
     122FD16:
     123korisnik_id, preferirana_kategorija_id →
     124preferira_kategorija_datum_dodavanje
     125
     126FD17:
     127izbrano_raspolozenie_id →
     128izbrano_raspolozenie_naziv, izbrano_raspolozenie_opis
     129
     130FD18:
     131korisnik_id, izbrano_raspolozenie_id →
     132izbira_raspolozenie_datum_izbor
     133}}}
     134
     135FD1-FD10 ги опишуваат главните функционални зависности на основните податоци за корисници, нарачки, плаќања, книги, автори, жанрови, категории и расположенија.
     136
     137FD11-FD18 ги опишуваат зависностите што произлегуваат од врските со сопствени атрибути и од различните улоги на жанровите, категориите и расположенијата.
     138
     139FD2 важи бидејќи email адресата на корисникот е единствена, а FD6 бидејќи ISBN е единствен за конкретно издание на книга.
     140
     141Релациите NAPISANA_OD, IMA_ZHANR, IMA_KATEGORIJA и POVRZANA_SO немаат сопствени не-клучни атрибути, па не воведуваат дополнителни нетривијални функционални зависности кон описни атрибути.
     142
     143== Candidate keys and primary key ==
     144
     145При определувањето на кандидатскиот клуч мора да бидат опфатени независните факти од M:N релациите, бидејќи тие не можат да се изведат само преку функционалните зависности на основните ентитети.
     146
     147Еден кандидатски клуч за унифицираната релација е:
     148
     149{{{
     150K = {
     151  plakjanje_id,
     152  kniga_id,
     153  avtor_id,
     154  kniga_zhanr_id,
     155  kniga_kategorija_id,
     156  kniga_raspolozenie_id,
     157  omilena_kniga_id,
     158  preferiran_zhanr_id,
     159  preferirana_kategorija_id,
     160  izbrano_raspolozenie_id
     161}
     162}}}
     163
     164Од `plakjanje_id` преку FD4 се добива `naracka_id`, а од `naracka_id` преку FD3 се добива `korisnik_id`.
     165
     166Потоа:
     167
     168* од korisnik_id преку FD1 се добиваат сите атрибути на корисникот;
     169* од naracka_id преку FD3 се добиваат сите атрибути на нарачката;
     170* од plakjanje_id преку FD4 се добиваат сите атрибути на плаќањето;
     171* од kniga_id преку FD5 се добиваат сите атрибути на книгата;
     172* од avtor_id преку FD7 се добиваат атрибутите на авторот;
     173* од kniga_zhanr_id преку FD8 се добиваат атрибутите на жанрот на книгата;
     174* од kniga_kategorija_id преку FD9 се добиваат атрибутите на категоријата на книгата;
     175* од kniga_raspolozenie_id преку FD10 се добиваат атрибутите на расположението поврзано со книгата;
     176* од {naracka_id, kniga_id} преку FD11 се добиваат атрибутите на SODRZI;
     177* од {korisnik_id, omilena_kniga_id} преку FD12 се добива датумот на додавање во омилени;
     178* од preferiran_zhanr_id преку FD13 и FD14 се добиваат податоците за преферираниот жанр и датумот на додавање;
     179* од preferirana_kategorija_id преку FD15 и FD16 се добиваат податоците за преферираната категорија и датумот;
     180* од izbrano_raspolozenie_id преку FD17 и FD18 се добиваат податоците за избраното расположение и датумот на избор.
     181
     182Следствено, K+ ги содржи сите атрибути на R.
     183
     184Поради алтернативните зависности `korisnik_email → korisnik_id` и `kniga_isbn → kniga_id`, во соодветните проекции постојат и алтернативни клучеви.
     185
     186За примарен клуч на почетната унифицирана релација се избира K, бидејќи се состои од стабилни идентификатори.
     187
     188=== Initial normal form ===
     189
     190Сите атрибути во R се атомични. Повеќекратните автори, жанрови, категории, расположенија и останатите M:N врски се претставуваат преку повеќе редови, а не преку повеќе вредности во едно поле.
     191
     192Затоа R е во 1NF.
     193
     194R не е во 2NF бидејќи постојат не-клучни атрибути што зависат само од дел од сложениот клуч. На пример:
     195
     196{{{
     197kniga_id → kniga_naslov, kniga_isbn, kniga_opis, ...
     198avtor_id → avtor_ime, avtor_prezime, avtor_biografija
     199kniga_zhanr_id → kniga_zhanr_naziv, kniga_zhanr_opis
     200}}}
     201
     202== 1NF decomposition ==
     203
     204R веќе е во 1NF бидејќи сите атрибути се атомични и не постојат повторувачки групи во едно поле.
     205
     206Затоа во овој чекор не е потребна декомпозиција.
     207
     208== 2NF decomposition ==
     209
     210R не е во 2NF поради парцијалните зависности од делови на сложениот кандидатски клуч.
     211
     212Во секој чекор зависноста X → Y се издвојува во посебна релација. Декомпозицијата е без загуба кога заедничките атрибути содржат клуч на една од добиените релации.
     213
     214=== Step 2.1 - Users ===
     215
     216'''Problem:'''
     217
     218{{{
     219korisnik_id →
     220korisnik_ime, korisnik_prezime, korisnik_email,
     221korisnik_lozinka, korisnik_datum_registracija, korisnik_uloga
     222}}}
     223
     224'''Result:'''
     225
     226{{{
     227KORISNICI(
     228  korisnik_id,
     229  korisnik_ime,
     230  korisnik_prezime,
     231  korisnik_email,
     232  korisnik_lozinka,
     233  korisnik_datum_registracija,
     234  korisnik_uloga
     235)
     236}}}
     237
     238Во KORISNICI важат FD1 и FD2.
     239
     240Кандидатски клучеви се `korisnik_id` и `korisnik_email`, а примарен клуч е `korisnik_id`.
     241
     242FD1 и FD2 се зачувани. Спојувањето е без загуба бидејќи `korisnik_id` е клуч во KORISNICI.
     243
     244=== Step 2.2 - Books ===
     245
     246'''Problem:'''
     247
     248{{{
     249kniga_id →
     250kniga_naslov, kniga_isbn, kniga_opis, kniga_korica_url,
     251kniga_godina_izdavanje, kniga_kolicina_na_zaliha, kniga_cena
     252}}}
     253
     254'''Result:'''
     255
     256{{{
     257KNIGI(
     258  kniga_id,
     259  kniga_naslov,
     260  kniga_isbn,
     261  kniga_opis,
     262  kniga_korica_url,
     263  kniga_godina_izdavanje,
     264  kniga_kolicina_na_zaliha,
     265  kniga_cena
     266)
     267}}}
     268
     269Во KNIGI важат FD5 и FD6.
     270
     271Кандидатски клучеви се `kniga_id` и `kniga_isbn`, а примарен клуч е `kniga_id`.
     272
     273FD5 и FD6 се зачувани, а декомпозицијата е без загуба бидејќи `kniga_id` е клуч на KNIGI.
     274
     275=== Step 2.3 - Authors ===
     276
     277'''Problem:'''
     278
     279{{{
     280avtor_id → avtor_ime, avtor_prezime, avtor_biografija
     281}}}
     282
     283'''Result:'''
     284
     285{{{
     286AVTORI(
     287  avtor_id,
     288  avtor_ime,
     289  avtor_prezime,
     290  avtor_biografija
     291)
     292}}}
     293
     294Примарен и кандидатски клуч е `avtor_id`.
     295
     296FD7 е зачувана, а декомпозицијата е без загуба бидејќи `avtor_id` е клуч на AVTORI.
     297
     298=== Step 2.4 - Genres ===
     299
     300'''Problem:'''
     301
     302{{{
     303kniga_zhanr_id → kniga_zhanr_naziv, kniga_zhanr_opis
     304}}}
     305
     306Истите податоци за жанрот се користат и кога жанрот претставува преференција на корисникот. Затоа во нормализираниот модел тие се претставуваат со еден ентитет ZHANROVI.
     307
     308'''Result:'''
     309
     310{{{
     311ZHANROVI(
     312  zhanr_id,
     313  naziv,
     314  opis
     315)
     316}}}
     317
     318Примарен клуч е `zhanr_id`.
     319
     320Описните податоци за жанрот зависат само од идентификаторот на жанрот, па не треба да се повторуваат во врските со книги или корисници.
     321
     322=== Step 2.5 - Categories ===
     323
     324Аналогно, важи:
     325
     326{{{
     327kniga_kategorija_id →
     328kniga_kategorija_naziv, kniga_kategorija_opis
     329}}}
     330
     331и истите категории се користат во преференциите на корисниците.
     332
     333'''Result:'''
     334
     335{{{
     336KATEGORII(
     337  kategorija_id,
     338  naziv,
     339  opis
     340)
     341}}}
     342
     343Примарен клуч е `kategorija_id`.
     344
     345Описните атрибути на категоријата се чуваат само еднаш, а врските кон книги и корисници го користат нејзиниот идентификатор.
     346
     347=== Step 2.6 - Moods ===
     348
     349За расположенијата важи истата логика.
     350
     351'''Result:'''
     352
     353{{{
     354RASPOLOZENIJA(
     355  raspolozenie_id,
     356  naziv,
     357  opis
     358)
     359}}}
     360
     361Примарен клуч е `raspolozenie_id`.
     362
     363Идентификаторот на расположението ги определува неговите описни атрибути. Истиот ентитет се користи за поврзување со книги и за избор на расположение од страна на корисник.
     364
     365=== Step 2.7 - Orders ===
     366
     367Од FD3:
     368
     369{{{
     370naracka_id →
     371naracka_datum, naracka_status, naracka_vkupna_cena, korisnik_id
     372}}}
     373
     374се добива:
     375
     376{{{
     377NARACKI(
     378  naracka_id,
     379  korisnik_id,
     380  naracka_datum,
     381  naracka_status,
     382  naracka_vkupna_cena
     383)
     384}}}
     385
     386Примарен клуч е `naracka_id`.
     387
     388FD3 е зачувана, а декомпозицијата е без загуба бидејќи `naracka_id` е клуч на NARACKI.
     389
     390=== Step 2.8 - Payments ===
     391
     392Од FD4:
     393
     394{{{
     395plakjanje_id →
     396plakjanje_datum, plakjanje_iznos,
     397plakjanje_nacin, plakjanje_status, naracka_id
     398}}}
     399
     400се добива:
     401
     402{{{
     403PLAKANJA(
     404  plakjanje_id,
     405  naracka_id,
     406  plakjanje_datum,
     407  plakjanje_iznos,
     408  plakjanje_nacin,
     409  plakjanje_status
     410)
     411}}}
     412
     413Примарен клуч е `plakjanje_id`.
     414
     415FD4 е зачувана и декомпозицијата е без загуба.
     416
     417=== Step 2.9 - Order items ===
     418
     419Од FD11:
     420
     421{{{
     422naracka_id, kniga_id →
     423sodrzi_kolicina, sodrzi_edinechna_cena
     424}}}
     425
     426се добива:
     427
     428{{{
     429SODRZI(
     430  naracka_id,
     431  kniga_id,
     432  kolicina,
     433  edinechna_cena
     434)
     435}}}
     436
     437Кандидатски и примарен клуч е:
     438
     439{{{
     440{naracka_id, kniga_id}
     441}}}
     442
     443Сите не-клучни атрибути зависат од целиот составен клуч.
     444
     445FD11 е зачувана и декомпозицијата е без загуба.
     446
     447=== Step 2.10 - Favorites ===
     448
     449Од FD12:
     450
     451{{{
     452korisnik_id, omilena_kniga_id →
     453omileni_datum_dodavanje
     454}}}
     455
     456се добива:
     457
     458{{{
     459OMILENI(
     460  korisnik_id,
     461  kniga_id,
     462  datum_dodavanje
     463)
     464}}}
     465
     466Примарен клуч е `{korisnik_id, kniga_id}`.
     467
     468FD12 е зачувана.
     469
     470=== Step 2.11 - Genre preferences ===
     471
     472Од зависноста:
     473
     474{{{
     475korisnik_id, preferiran_zhanr_id →
     476preferira_zhanr_datum_dodavanje
     477}}}
     478
     479се добива:
     480
     481{{{
     482PREFERIRA_ZHANR(
     483  korisnik_id,
     484  zhanr_id,
     485  datum_dodavanje
     486)
     487}}}
     488
     489Примарен клуч е `{korisnik_id, zhanr_id}`.
     490
     491=== Step 2.12 - Category preferences ===
     492
     493Се добива:
     494
     495{{{
     496PREFERIRA_KATEGORIJA(
     497  korisnik_id,
     498  kategorija_id,
     499  datum_dodavanje
     500)
     501}}}
     502
     503Примарен клуч е `{korisnik_id, kategorija_id}`.
     504
     505=== Step 2.13 - Mood selections ===
     506
     507Се добива:
     508
     509{{{
     510IZBIRA_RASPOLOZENIE(
     511  korisnik_id,
     512  raspolozenie_id,
     513  datum_izbor
     514)
     515}}}
     516
     517Примарен клуч е `{korisnik_id, raspolozenie_id}`.
     518
     519=== Step 2.14 - Book-author relationship ===
     520
     521Релацијата NAPISANA_OD нема сопствени не-клучни атрибути.
     522
     523{{{
     524NAPISANA_OD(
     525  kniga_id,
     526  avtor_id
     527)
     528}}}
     529
     530Примарен клуч е `{kniga_id, avtor_id}`.
     531
     532Бидејќи релацијата содржи само клучни атрибути, нема парцијални или транзитивни зависности.
     533
     534=== Step 2.15 - Book-genre relationship ===
     535
     536{{{
     537IMA_ZHANR(
     538  kniga_id,
     539  zhanr_id
     540)
     541}}}
     542
     543Примарен клуч е `{kniga_id, zhanr_id}`.
     544
     545=== Step 2.16 - Book-category relationship ===
     546
     547{{{
     548IMA_KATEGORIJA(
     549  kniga_id,
     550  kategorija_id
     551)
     552}}}
     553
     554Примарен клуч е `{kniga_id, kategorija_id}`.
     555
     556=== Step 2.17 - Book-mood relationship ===
     557
     558{{{
     559POVRZANA_SO(
     560  kniga_id,
     561  raspolozenie_id
     562)
     563}}}
     564
     565Примарен клуч е `{kniga_id, raspolozenie_id}`.
     566
     567=== State after 2NF decomposition ===
     568
     569По декомпозицијата се отстранети парцијалните зависности од почетната унифицирана релација.
     570
     571Релациите со едноставни примарни клучеви ги чуваат описните атрибути на соодветните ентитети, додека M:N релациите се претставени преку составни клучеви.
     572
     573Кај релациите со составен клуч и сопствени атрибути, како SODRZI, OMILENI, PREFERIRA_ZHANR, PREFERIRA_KATEGORIJA и IZBIRA_RASPOLOZENIE, не-клучните атрибути зависат од целиот составен клуч.
     574
     575Затоа добиените релации се најмалку во 2NF.
     576
     577== 3NF decomposition ==
     578
     579Следниот чекор е проверка за транзитивни зависности.
     580
     581По издвојувањето на ентитетите, описните податоци за корисник, книга, автор, жанр, категорија и расположение повеќе не се повторуваат во релациите што ги поврзуваат.
     582
     583На пример, во NARACKI се чува `korisnik_id`, но не и името, презимето или email адресата на корисникот. Тие се добиваат преку KORISNICI.
     584
     585Слично, во SODRZI се чуваат `naracka_id` и `kniga_id`, но описните атрибути на книгата остануваат во KNIGI.
     586
     587Во PREFERIRA_ZHANR се чува `zhanr_id`, а `naziv` и `opis` се чуваат во ZHANROVI.
     588
     589Во PREFERIRA_KATEGORIJA се чува `kategorija_id`, а описните атрибути на категоријата се во KATEGORII.
     590
     591Во IZBIRA_RASPOLOZENIE се чува `raspolozenie_id`, додека описните атрибути се во RASPOLOZENIJA.
     592
     593Со тоа не постојат транзитивни зависности од примарен клуч преку не-клучен атрибут кон друг не-клучен атрибут.
     594
     595Затоа не е потребна дополнителна декомпозиција за достигнување на 3NF.
     596
     597Сите функционални зависности од почетното множество се зачувани во соодветните добиени релации, а декомпозициите се извршени преку заеднички атрибути што се клучеви во издвоените релации, со што се обезбедува lossless join.
     598
     599== BCNF ==
     600
     601За BCNF се проверува дали за секоја нетривијална функционална зависност:
     602
     603{{{
     604X → Y
     605}}}
     606
     607левата страна X е суперклуч на релацијата во која зависноста важи.
     608
     609Во KORISNICI, `korisnik_id` е кандидатски клуч. Поради уникатноста на email адресата, и `korisnik_email` претставува алтернативен кандидатски клуч.
     610
     611Во KNIGI, `kniga_id` е кандидатски клуч, а `kniga_isbn` е алтернативен кандидатски клуч.
     612
     613Во AVTORI, ZHANROVI, KATEGORII, RASPOLOZENIJA, NARACKI и PLAKANJA, левата страна на секоја нетривијална функционална зависност е примарниот клуч.
     614
     615Во SODRZI:
     616
     617{{{
     618{naracka_id, kniga_id} →
     619kolicina, edinechna_cena
     620}}}
     621
     622левата страна е кандидатски клуч.
     623
     624Во OMILENI, PREFERIRA_ZHANR, PREFERIRA_KATEGORIJA и IZBIRA_RASPOLOZENIE, левата страна на зависноста што го определува датумот е целиот составен примарен клуч.
     625
     626NAPISANA_OD, IMA_ZHANR, IMA_KATEGORIJA и POVRZANA_SO содржат само атрибути од нивните составни клучеви и немаат нетривијални функционални зависности кон не-клучни атрибути.
     627
     628Следствено, добиените релации ги исполнуваат условите за BCNF според дефинираното множество функционални зависности.
     629
     630Функционалните зависности се зачувани во декомпозицијата, а врските меѓу релациите овозможуваат спојување без загуба.
     631
     632== Final result and discussion ==
     633
     634=== Normalized relational model ===
     635
     636По нормализацијата е добиен следниот релационен модел:
     637
     638{{{
     639KORISNICI(
     640  korisnik_id PK,
     641  ime,
     642  prezime,
     643  email,
     644  lozinka,
     645  datum_registracija,
     646  uloga
     647)
     648
     649KNIGI(
     650  kniga_id PK,
     651  naslov,
     652  isbn,
     653  opis,
     654  korica_url,
     655  godina_izdavanje,
     656  kolicina_na_zaliha,
     657  cena
     658)
     659
     660AVTORI(
     661  avtor_id PK,
     662  ime,
     663  prezime,
     664  biografija
     665)
     666
     667ZHANROVI(
     668  zhanr_id PK,
     669  naziv,
     670  opis
     671)
     672
     673KATEGORII(
     674  kategorija_id PK,
     675  naziv,
     676  opis
     677)
     678
     679RASPOLOZENIJA(
     680  raspolozenie_id PK,
     681  naziv,
     682  opis
     683)
     684
     685NARACKI(
     686  naracka_id PK,
     687  korisnik_id FK,
     688  datum,
     689  status,
     690  vkupna_cena
     691)
     692
     693PLAKANJA(
     694  plakjanje_id PK,
     695  naracka_id FK,
     696  datum,
     697  iznos,
     698  nacin_na_plakjanje,
     699  status
     700)
     701
     702SODRZI(
     703  naracka_id PK/FK,
     704  kniga_id PK/FK,
     705  kolicina,
     706  edinechna_cena
     707)
     708
     709NAPISANA_OD(
     710  kniga_id PK/FK,
     711  avtor_id PK/FK
     712)
     713
     714IMA_ZHANR(
     715  kniga_id PK/FK,
     716  zhanr_id PK/FK
     717)
     718
     719IMA_KATEGORIJA(
     720  kniga_id PK/FK,
     721  kategorija_id PK/FK
     722)
     723
     724POVRZANA_SO(
     725  kniga_id PK/FK,
     726  raspolozenie_id PK/FK
     727)
     728
     729OMILENI(
     730  korisnik_id PK/FK,
     731  kniga_id PK/FK,
     732  datum_dodavanje
     733)
     734
     735PREFERIRA_ZHANR(
     736  korisnik_id PK/FK,
     737  zhanr_id PK/FK,
     738  datum_dodavanje
     739)
     740
     741PREFERIRA_KATEGORIJA(
     742  korisnik_id PK/FK,
     743  kategorija_id PK/FK,
     744  datum_dodavanje
     745)
     746
     747IZBIRA_RASPOLOZENIE(
     748  korisnik_id PK/FK,
     749  raspolozenie_id PK/FK,
     750  datum_izbor
     751)
     752}}}
     753
     754=== Discussion ===
     755
     756Нормализацијата, започната од единствената глобална денормализирана релација без користење на претходниот релационен дизајн како основа за декомпозицијата, резултира со модел што суштински одговара на релациониот дизајн изработен во Phase P2.
     757
     758Основните ентитети KORISNICI, KNIGI, AVTORI, ZHANROVI, KATEGORII, RASPOLOZENIJA, NARACKI и PLAKANJA се издвоени во посебни релации.
     759
     760M:N врските се претставени преку посебни релации со составни примарни клучеви: SODRZI, NAPISANA_OD, IMA_ZHANR, IMA_KATEGORIJA, POVRZANA_SO, OMILENI, PREFERIRA_ZHANR, PREFERIRA_KATEGORIJA и IZBIRA_RASPOLOZENIE.
     761
     762Со декомпозицијата се отстрануваат парцијалните и транзитивните зависности, се намалува редундантноста и се избегнуваат аномалии при внесување, измена и бришење на податоци.
     763
     764Сите релации од конечниот модел се во BCNF во однос на идентификуваните функционални зависности. Функционалните зависности се зачувани во соодветните релации, а декомпозицијата овозможува lossless join.
     765
     766Конечниот нормализиран модел е суштински ист со моделот што веќе е имплементиран во Phase P2. Поради тоа не е потребно суштинско преструктурирање на постојните database objects. Постоечкиот P2 релационен дизајн се задржува и продолжува да се користи во следните фази на проектот.
     767
     768На овој начин процесот на нормализација дополнително потврдува дека релациониот модел на BiblioPremium соодветно ги раздвојува податоците за корисници, книги, автори, жанрови, категории, расположенија, нарачки и плаќања, како и нивните M:N врски.