Changes between Version 22 and Version 23 of normalization


Ignore:
Timestamp:
09/02/25 22:26:13 (5 hours ago)
Author:
221046
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • normalization

    v22 v23  
    11= Нормализација на базата =
     2== 1. Почетна релација (UNF) ==
    23
    3 == Нормални форми по релации ==
     4{{{
     5Full(track_id, name, album_id, artist_id, media_type_id, genre_id, composer,
     6milliseconds, bytes, price_id, value, date,
     7invoice_line_id, invoice_id, quantity,
     8customer_id, first_name, last_name, company, support_rep_id, personal_info_id, contact_id,
     9employee_id, title, reports_to, birth_date, hire_date,
     10address_info_id, address, city, state, country, postal_code, phone, fax, email,
     11playlist_id, playlist_name, playlist_track_id)
     12}}}
    413
    5 == Почетна релација ==
    6    * Сите атрибути се атомични
     14== 2. Функционални зависности (FDs) ==
    715
    8 ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =||
    9 ||'''Full(track_id, name, album_id, artist_id, media_type_id, genre_id, composer, milliseconds, bytes, price_id, value, date, invoice_line_id, invoice_id, quantity, customer_id, first_name, last_name, company, support_rep_id, personal_info_id, contact_id, employee_id, title, reports_to, birth_date, hire_date, address_info_id, address, city, state, country, postal_code, phone, fax, email, playlist_id, playlist_name, playlist_track_id)'''||track_id, album_id, artist_id, media_type_id, genre_id, price_id, invoice_line_id, invoice_id, customer_id, employee_id, address_info_id, contact_id, playlist_id, playlist_track_id||Многу функционални зависности (track_id → {...}, album_id → {...}, artist_id → name, ...)||1NF||
     16'''Track'''
    1017
     18track_id → name, album_id, media_type_id, genre_id, composer, milliseconds, bytes
    1119
    12 == Основни ентитети==
     20'''Price'''
    1321
    14 ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =||
    15 ||'''Track(track_id, name, album_id, media_type_id, genre_id, composer, milliseconds, bytes)'''||track_id||track_id → {name, album_id, media_type_id, genre_id, composer, milliseconds, bytes}||BCNF||
    16 ||'''Album(album_id, title, artist_id)'''||album_id||album_id → {title, artist_id}||BCNF||
    17 ||'''Artist(artist_id, name)'''||artist_id||artist_id → name||BCNF||
    18 ||'''Genre(genre_id, name)'''||genre_id||genre_id → name||BCNF||
    19 ||'''!MediaType(media_type_id, name)'''||media_type_id||media_type_id → name||BCNF||
     22price_id → value, date, track_id
    2023
     24'''Album'''
    2125
    22 == Табела за цени==
     26album_id → artist_id
    2327
     28'''InvoiceLine'''
    2429
    25 ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =||
    26 ||'''Price(price_id, value, date, track_id)'''||price_id (и можен (date, track_id))||price_id → {value, date, track_id}||BCNF||
     30invoice_line_id → invoice_id, track_id, quantity
    2731
     32'''Invoice'''
    2833
     34invoice_id → customer_id
    2935
    30 == Фактури==
     36'''Customer'''
    3137
     38customer_id → first_name, last_name, company, support_rep_id, personal_info_id, contact_id
    3239
    33 ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =||
    34 ||'''!InvoiceLine(invoice_line_id, invoice_id, track_id, quantity)'''||invoice_line_id (и можен (invoice_id, track_id))||(invoice_line_id → {invoice_id, track_id, quantity})||BCNF||
    35 ||'''Invoice(invoice_id, customer_id, invoice_date, billing_address, billing_city, billing_state, billing_country, billing_postal_code, total)'''||invoice_id||invoice_id → {customer_id, invoice_date, billing_address, billing_city, billing_state, billing_country, billing_postal_code, total}||BCNF||
     40'''Employee'''
    3641
     42employee_id → title, reports_to, birth_date, hire_date
    3743
    38 == Контакт инфо ==
     44'''AddressInfo'''
    3945
    40  
    41 ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =||
    42 ||'''Customer(customer_id, first_name, last_name, company, support_rep_id, personal_info_id, contact_id)'''||customer_id||customer_id → {first_name, last_name, company, support_rep_id, personal_info_id, contact_id}||BCNF||
    43 ||'''Employee(employee_id, first_name, last_name, title, reports_to, birth_date, hire_date, personal_info_id, contact_id)'''||employee_id||employee_id → {first_name, last_name, title, reports_to, birth_date, hire_date, personal_info_id, contact_id}||BCNF||
    44 ||'''!AddressInfo(address_info_id, address, city, state, country, postal_code)'''||address_info_id||address_info_id → {address, city, state, country, postal_code}||BCNF||
    45 ||'''Contact(contact_id, phone, fax, email)'''||contact_id||contact_id → {phone, fax, email}||BCNF||
     46address_info_id → address, city, state, country, postal_code, phone, fax, email
    4647
     48'''Playlist'''
    4749
    48 == отстрануваат повторувања на Track во Playlist ==
     50playlist_id → playlist_name
    4951
    50 ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =||
    51 ||'''Playlist(playlist_id, name)'''||playlist_id||playlist_id → name||BCNF||
    52 ||'''!PlaylistTrack(playlist_track_id, playlist_id, track_id)'''||playlist_track_id (и можен (playlist_id, track_id))||playlist_track_id → {playlist_id, track_id}||BCNF||
     52'''PlaylistTrack'''
    5353
     54playlist_track_id → playlist_id, track_id
    5455
    55 == Нормализирана база ==
     56== 3. Прва нормална форма (1NF) ==
    5657
    57 ||= Релација =||= Клуч(еви) =||= Функциски зависности (ФЗ) =||= Нормална форма =||
    58 ||'''Track(track_id, name, album_id, media_type_id, genre_id, composer, milliseconds, bytes)'''||track_id||track_id → {name, album_id, media_type_id, genre_id, composer, milliseconds, bytes}||BCNF||
    59 ||'''Album(album_id, title, artist_id)'''||album_id||album_id → {title, artist_id}||BCNF||
    60 ||'''Artist(artist_id, name)'''||artist_id||artist_id → name||BCNF||
    61 ||'''Genre(genre_id, name)'''||genre_id||genre_id → name||BCNF||
    62 ||'''!MediaType(media_type_id, name)'''||media_type_id||media_type_id → name||BCNF||
    63 ||'''Price(price_id, value, date, track_id)'''||price_id (и можен (date, track_id))||price_id → {value, date, track_id}||BCNF||
    64 ||'''!InvoiceLine(invoice_line_id, invoice_id, track_id, quantity)'''||invoice_line_id (и можен (invoice_id, track_id))||(invoice_line_id → {invoice_id, track_id, quantity})||BCNF||
    65 ||'''Invoice(invoice_id, customer_id, invoice_date, billing_address, billing_city, billing_state, billing_country, billing_postal_code, total)'''||invoice_id||invoice_id → {customer_id, invoice_date, billing_address, billing_city, billing_state, billing_country, billing_postal_code, total}||BCNF||
    66 ||'''Customer(customer_id, first_name, last_name, company, support_rep_id, personal_info_id, contact_id)'''||customer_id||customer_id → {first_name, last_name, company, support_rep_id, personal_info_id, contact_id}||BCNF||
    67 ||'''Employee(employee_id, first_name, last_name, title, reports_to, birth_date, hire_date, personal_info_id, contact_id)'''||employee_id||employee_id → {first_name, last_name, title, reports_to, birth_date, hire_date, personal_info_id, contact_id}||BCNF||
    68 ||'''!AddressInfo(address_info_id, address, city, state, country, postal_code)'''||address_info_id||address_info_id → {address, city, state, country, postal_code}||BCNF||
    69 ||'''Contact(contact_id, phone, fax, email)'''||contact_id||contact_id → {phone, fax, email}||BCNF||
    70 ||'''Playlist(playlist_id, name)'''||playlist_id||playlist_id → name||BCNF||
    71 ||'''!PlaylistTrack(playlist_track_id, playlist_id, track_id)'''||playlist_track_id (и можен (playlist_id, track_id))||playlist_track_id → {playlist_id, track_id}||BCNF||
     58Сите атрибути се атомарни → релацијата е во 1NF.
    7259
    73 == ЕР дијаграм по нормализација ==
    74 [[Image(Fianl Diagram Light.png, width=800, align=center)]]
     60'''Примарен клуч (на Full):'''
     61(invoice_line_id, playlist_track_id)
     62(секој ред е уникатен по комбинацијата на фактурна линија и песна во плејлиста).
    7563
    76 == Заклучок ==
    77   * Сите релации се во **BCNF**.
    78   * Релациите **Price** и **!InvoiceLine** може да сметаме дека се во 3NF, бидејќи date, track_id се уникатни кај Price, invoice_id, track_id кај !InvoiceLine, во база не е сетирано дека мора да се уникатни, но за ова се осигураме деке е такa со соодветни тригери (**upsert_price** и **merge_invoice_line**).
    79   * **Price** – нова теабела која ни овозможува чување на историј на цени. 
    80   * Новите табели **!AddressInfo** и **Contact** овозможуваат отстранување на повторувања на адреси и контакти → уште почиста нормализација.
     64== 4. Втора нормална форма (2NF) ==
    8165
     66Ги одвојуваме зависностите од делови на составениот клуч:
    8267
     68=== 4.1 Track ===
     69{{{
     70Track(track_id, name, album_id, media_type_id, genre_id, composer, milliseconds, bytes)
     71PK: track_id
     72}}}
     73
     74=== 4.2 Price ===
     75{{{
     76Price(price_id, value, date, track_id)
     77PK: price_id
     78FK: track_id → Track(track_id)
     79}}}
     80
     81=== 4.3 Album ===
     82{{{
     83Album(album_id, artist_id)
     84PK: album_id
     85FK: artist_id → Artist(artist_id)
     86}}}
     87
     88=== 4.4 Artist ===
     89{{{
     90Artist(artist_id, artist_name)
     91PK: artist_id
     92}}}
     93
     94=== 4.5 InvoiceLine ===
     95{{{
     96InvoiceLine(invoice_line_id, invoice_id, track_id, quantity)
     97PK: invoice_line_id
     98FK: invoice_id → Invoice(invoice_id)
     99FK: track_id → Track(track_id)
     100}}}
     101
     102=== 4.6 Invoice ===
     103{{{
     104Invoice(invoice_id, customer_id)
     105PK: invoice_id
     106FK: customer_id → Customer(customer_id)
     107}}}
     108
     109=== 4.7 Customer ===
     110{{{
     111Customer(customer_id, first_name, last_name, company, support_rep_id, personal_info_id, contact_id)
     112PK: customer_id
     113FK: support_rep_id → Employee(employee_id)
     114}}}
     115
     116=== 4.8 Employee ===
     117{{{
     118Employee(employee_id, title, reports_to, birth_date, hire_date)
     119PK: employee_id
     120}}}
     121
     122=== 4.9 AddressInfo ===
     123{{{
     124AddressInfo(address_info_id, address, city, state, country, postal_code, phone, fax, email)
     125PK: address_info_id
     126}}}
     127
     128=== 4.10 Playlist ===
     129{{{
     130Playlist(playlist_id, playlist_name)
     131PK: playlist_id
     132}}}
     133
     134=== 4.11 PlaylistTrack ===
     135{{{
     136PlaylistTrack(playlist_track_id, playlist_id, track_id)
     137PK: playlist_track_id
     138FK: playlist_id → Playlist(playlist_id)
     139FK: track_id → Track(track_id)
     140}}}
     141
     142== 5. Трета нормална форма (3NF) ==
     143
     144album_id → artist_id → Artist е одвоен.
     145
     146support_rep_id → Employee е FK, нема транзитивна зависност во Customer.
     147
     148Адресата е изнесена во AddressInfo.
     149
     150Сите не-клучни атрибути зависат директно од клучевите.
     151
     152✅ Сега сите релации се во 3NF.
     153
     154== Финален нормализиран модел (3NF) ==
     155
     156{{{
     157Track(track_id, name, album_id, media_type_id, genre_id, composer, milliseconds, bytes)
     158
     159Price(price_id, value, date, track_id)
     160
     161Album(album_id, artist_id)
     162
     163Artist(artist_id, artist_name)
     164
     165InvoiceLine(invoice_line_id, invoice_id, track_id, quantity)
     166
     167Invoice(invoice_id, customer_id)
     168
     169Customer(customer_id, first_name, last_name, company, support_rep_id, personal_info_id, contact_id)
     170
     171Employee(employee_id, title, reports_to, birth_date, hire_date)
     172
     173AddressInfo(address_info_id, address, city, state, country, postal_code, phone, fax, email)
     174
     175Playlist(playlist_id, playlist_name)
     176
     177PlaylistTrack(playlist_track_id, playlist_id, track_id)
     178}}}
    83179
    84180** ← [wiki: Назад на почетна] **