Changes between Version 11 and Version 12 of Normalization


Ignore:
Timestamp:
08/06/26 22:32:07 (44 hours ago)
Author:
231017
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v11 v12  
    22
    33За табелите од нашата база на податоци, со цел разликување на самите id за секој ентитет, ќе ги преименуваме id атрибутите во **<име_на_релација>_id**.
    4 Со тоа добиваме: **user_id, non_admin_user_id, admin_id, listener_id, musical_entity_id, song_id, artist_id, event_id, album_id, playlist_id**.
     4Со тоа добиваме: **user_id, non_admin_user_id, admin_id, listener_id, musical_entity_id, song_id, artist_id, event_id, album_id, playlist_id, role_id**.
    55
    66== Функционални зависности:
     
    1212- FD4: playlist_id -> playlist_cover, playlist_name, listener_id
    1313- FD5: event_id -> event_name, location, venue, date, time, user_id
    14 - FD6: (artist_id, musical_entity_id) -> role
     14- FD6: (artist_id, musical_entity_id) -> contribution_order
    1515- FD7: (listener_id, musical_entity_id) -> grade, comment
    1616
     
    2121- FD12: album_id -> musical_entity_id
    2222- FD13: (listener_id,song_id,timestamp) -> /
     23- FD14: role_id -> role_name
    2324
    2425
    2526**Лево**:
    26 playlist_id, event_id, song_id, timestamp, admin_id
     27playlist_id, event_id, song_id, timestamp, admin_id, role_id
    2728
    2829
    2930**Десно**:
    30 profile_photo, email, username, full_name, password, title, genre, release_date, link, playlist_cover, playlist_name, event_name, location, venue, date, time, role, grade, comment
     31profile_photo, email, username, full_name, password, title, genre, release_date, link, playlist_cover, playlist_name, event_name, location, venue, date, time, contribution_order, role_name, grade, comment
    3132
    3233**Лево и десно**:
     
    3738=== Глобална релација
    3839
    39 R={ playlist_id, event_id, song_id, timestamp, admin_id, profile_photo, email, username, full_name, password, title, genre, release_date, link, playlist_cover, playlist_name, event_name, location, venue, date, time, role, grade, comment, user_id, musical_entity_id, artist_id, non_admin_user_id, album_id, listener_id}
     40R={ playlist_id, event_id, song_id, timestamp, admin_id, role_id, profile_photo, email, username, full_name, password, title, genre, release_date, link, playlist_cover, playlist_name, event_name, location, venue, date, time, contribution_order, role_name, grade, comment, user_id, musical_entity_id, artist_id, non_admin_user_id, album_id, listener_id}
    4041   
    4142
     
    48494. **timestamp+** = {timestamp} -> **Не ги содржи сите атрибути**
    49505. **admin_id+** = {admin_id, user_id, full_name, email, password, username, profile_photo } -> **Не ги содржи сите атрибути**
     516. **role_id+** = {role_id, role_name} -> **Не ги содржи сите атрибути**
    5052
    5153
     
    5658тие мора да бидат дел од примарниот клуч.
    5759
    58 **{playlist_id, event_id, song_id, timestamp, admin_id}+** = { playlist_id, event_id, song_id, timestamp, admin_id, playlist_name, playlist_cover, user_id, listener_id, full_name, email, password, username, profile_photo, event_name, location, venue, date, time, link, album_id, musical_entity_id, title, genre, release_date, artist_id, non_admin_user_id, role, grade, comment}
     60**{playlist_id, event_id, song_id, timestamp, admin_id, role_id}+** = { playlist_id, event_id, song_id, timestamp, admin_id, role_id, playlist_name, playlist_cover, user_id, listener_id, full_name, email, password, username, profile_photo, event_name, location, venue, date, time, link, album_id, musical_entity_id, title, genre, release_date, artist_id, non_admin_user_id, contribution_order, role_name, grade, comment}
    5961
    6062Покривачот составен од сите атрибути кои се наоѓаат само од левата страна ги содржи сите атрибути на глобалната релација. Всушност тоа ни е и минимален суперклуч.
     
    6365
    6466
    65 Избран примарен клуч: **{playlist_id, event_id, song_id, timestamp, admin_id}**
     67Избран примарен клуч: **{playlist_id, event_id, song_id, timestamp, admin_id, role_id}**
    6668
    6769== Проверка за 1НФ
     
    8183- event_id -> event_name, location, venue, date, time, user_id
    8284- admin_id -> user_id
     85- role_id -> role_name
    8386
    8487
     
    8992R1 = R - {playlist_name, playlist_cover}
    9093
    91 R1 = { playlist_id, event_id, song_id, timestamp, admin_id, user_id, listener_id, full_name, email, password, username, profile_photo, event_name, location, venue, date, time, link, album_id, musical_entity_id, title, genre, release_date, artist_id, non_admin_user_id, role, grade, comment}
     94R1 = { playlist_id, event_id, song_id, timestamp, admin_id, role_id, user_id, listener_id, full_name, email, password, username, profile_photo, event_name, location, venue, date, time, link, album_id, musical_entity_id, title, genre, release_date, artist_id, non_admin_user_id, contribution_order, role_name, grade, comment}
    9295
    9396Lossless join: Релацијата може да се реконструира преку join со `playlist_id`.
     
    100103R2 = R1 - {link}
    101104
    102 R2 = { playlist_id, event_id, song_id, timestamp, admin_id, user_id, listener_id, album_id, full_name, email, password, username, profile_photo, event_name, location, venue, date, time,musical_entity_id, title, genre, release_date, artist_id,non_admin_user_id, role, grade, comment}
     105R2 = { playlist_id, event_id, song_id, timestamp, admin_id, role_id, user_id, listener_id, album_id, full_name, email, password, username, profile_photo, event_name, location, venue, date, time, musical_entity_id, title, genre, release_date, artist_id, non_admin_user_id, contribution_order, role_name, grade, comment}
    103106
    104107Lossless join: Релацијата може да се реконструира преку join со `song_id`
     
    111114R3 = R2 - {event_name, location, venue, date, time}
    112115
    113 R3 = {playlist_id, event_id, song_id, timestamp, admin_id, user_id, listener_id, album_id, full_name, email, password, username, profile_photo, musical_entity_id, title, genre, release_date, artist_id, non_admin_user_id, role, grade, comment}
     116R3 = {playlist_id, event_id, song_id, timestamp, admin_id, role_id, user_id, listener_id, album_id, full_name, email, password, username, profile_photo, musical_entity_id, title, genre, release_date, artist_id, non_admin_user_id, contribution_order, role_name, grade, comment}
    114117
    115118Lossless join: Релацијата може да се реконструира преку join со `event_id`
     
    123126
    124127Dependency preservation: FD9 е сочувана преку новата релација `Admins`
     128
     129
     1305. **Roles(role_id, role_name)**
     131
     132R4 = R3 - {role_name}
     133
     134R4 = { playlist_id, event_id, song_id, timestamp, admin_id, role_id, user_id, listener_id, album_id, full_name, email, password, username, profile_photo, musical_entity_id, title, genre, release_date, artist_id, non_admin_user_id, contribution_order, grade, comment}
     135
     136Lossless join: Релацијата може да се реконструира преку join со `role_id`
     137
     138Dependency preservation: FD14 е сочувана преку новата релација `Roles`
    125139
    126140
     
    1311453. Events(event_id, event_name, location, venue, date, time, user_id)
    1321464. Admins(admin_id, user_id)
    133 5. R3 = { playlist_id, event_id, song_id, timestamp, admin_id, user_id, listener_id, album_id, full_name, email, password, username, profile_photo, musical_entity_id, title, genre, release_date, artist_id, non_admin_user_id, role, grade, comment }
     1475. Roles(role_id, role_name)
     1486. R4 = { playlist_id, event_id, song_id, timestamp, admin_id, role_id, user_id, listener_id, album_id, full_name, email, password, username, profile_photo, musical_entity_id, title, genre, release_date, artist_id, non_admin_user_id, contribution_order, grade, comment}
    134149
    135150
     
    160175`Non_Admin_Users(non_admin_user_id)` - `non_admin_user_id` е всушност примарен клуч во релацијата `Non_Admin_Users` и надворешен клуч во релацијата `Users`
    161176
    162 R4 = R3 - {profile_photo, email, username, full_name, password}
    163 
    164 R4 = { playlist_id, event_id, song_id, timestamp, admin_id, user_id, listener_id, album_id, musical_entity_id, title, genre, release_date, artist_id, non_admin_user_id, role, grade, comment}
     177R5 = R4 - {profile_photo, email, username, full_name, password}
     178
     179R5 = { playlist_id, event_id, song_id, timestamp, admin_id, role_id, user_id, listener_id, album_id, musical_entity_id, title, genre, release_date, artist_id, non_admin_user_id, contribution_order, grade, comment}
    165180
    166181Lossless join: Релацијата може да се реконструира преку join со `user_id`
     
    184199`Albums(album_id)` - `album_id` е всушност примарен клуч во релацијата `Albums` и надворешен клуч во релацијата `Musical_Entities`.
    185200
    186 R5 = R4 - {title, genre, release_date}
    187 
    188 R5 = { playlist_id, event_id, song_id, timestamp, admin_id,user_id, listener_id, album_id, musical_entity_id, artist_id, non_admin_user_id, role, grade, comment}
     201R6 = R5 - {title, genre, release_date}
     202
     203R6 = { playlist_id, event_id, song_id, timestamp, admin_id, role_id, user_id, listener_id, album_id, musical_entity_id, artist_id, non_admin_user_id, contribution_order, grade, comment}
    189204
    190205Lossless join: Релацијата може да се реконструира преку join со `musical_entity_id`
     
    2122273. Events(event_id, event_name, location, venue, date, time, user_id)
    2132284. Admins(admin_id)
    214 5. Listeners(listener_id)
    215 6. Non_Admin_Users(non_admin_user_id)
    216 7. Users(user_id, profile_photo, email, username, full_name, password)
    217 8. Albums(album_id)
    218 9. Musical_Entities(musical_entity_id, title, genre, release_date, artist_id)
    219 10. Artists(artist_id)
    220 11. R5 = { playlist_id, event_id, song_id, timestamp, admin_id, user_id, listener_id, album_id, musical_entity_id, artist_id, non_admin_user_id, role, grade, comment}
    221 
    222 
    223 5. Бидејќи `role` е определен од `(artist_id, musical_entity_id)` -> имаме транзитивна зависност преку `FD6:(artist_id, musical_entity_id) -> role`
     2295. Roles(role_id, role_name)
     2306. Listeners(listener_id)
     2317. Non_Admin_Users(non_admin_user_id)
     2328. Users(user_id, profile_photo, email, username, full_name, password)
     2339. Albums(album_id)
     23410. Musical_Entities(musical_entity_id, title, genre, release_date, artist_id)
     23511. Artists(artist_id)
     23612. R6 = { playlist_id, event_id, song_id, timestamp, admin_id, role_id, user_id, listener_id, album_id, musical_entity_id, artist_id, non_admin_user_id, contribution_order, grade, comment}
     237
     238
     2395. Бидејќи `contribution_order` е определен од `(artist_id, musical_entity_id)` -> имаме транзитивна зависност преку `FD6: (artist_id, musical_entity_id) -> contribution_order`
    224240
    225241Декомпозиција по FD6:
    226242
    227 **Artist_Contributions(artist_id, musical_entity_id, role)**
    228 
    229 R6 = R5 - {role}
    230 R6 = { playlist_id, event_id, song_id, timestamp, admin_id, user_id, listener_id, album_id, musical_entity_id, artist_id, non_admin_user_id, grade, comment}
     243**Contributions(artist_id, musical_entity_id, contribution_order)**
     244
     245R7 = R6 - {contribution_order}
     246R7 = { playlist_id, event_id, song_id, timestamp, admin_id, role_id, user_id, listener_id, album_id, musical_entity_id, artist_id, non_admin_user_id, grade, comment}
    231247
    232248Lossless join: Релацијата може да се реконструира преку join со `(artist_id, musical_entity_id)`
    233249
    234 Dependency preservation: FD6 е сочувана преку новата релација `Artist_Contributions`
     250Dependency preservation: FD6 е сочувана преку новата релација `Contributions`
    235251
    2362526. Бидејќи `grade`, `comment` се определени од `(listener_id, musical_entity_id)` -> имаме транзитивна зависност преку `FD7: (listener_id, musical_entity_id) -> grade, comment`
     
    239255
    240256**Reviews(listener_id, musical_entity_id, grade, comment)**
    241 R7 = R6 - {grade, comment}
    242 R7 = { playlist_id, event_id, song_id, timestamp, admin_id, user_id, listener_id, album_id, musical_entity_id, artist_id, non_admin_user_id}
     257R8 = R7 - {grade, comment}
     258R8 = { playlist_id, event_id, song_id, timestamp, admin_id, role_id, user_id, listener_id, album_id, musical_entity_id, artist_id, non_admin_user_id}
    243259
    244260Lossless join: Релацијата може да се реконструира преку join со `(listener_id, musical_entity_id)`.
     
    2552713. Events(**event_id**, event_name, location, venue, date, time, user_id) -> **задоволува БКНФ**
    2562724. Admins(**admin_id**) -> **задоволува БКНФ**
    257 5. Listeners(**listener_id**) -> **задоволува БКНФ**
    258 6. Non_Admin_Users(**non_admin_user_id**) -> **задоволува БКНФ**
    259 7. Users(**user_id**, profile_photo, email, username, full_name, password) -> **задоволува БКНФ**
    260 8. Albums(**album_id**) -> **задоволува БКНФ**
    261 9. Musical_Entities(**musical_entity_id**, title, genre, release_date, artist_id) -> **задоволува БКНФ**
    262 10. Artist_Contributions(**artist_id, musical_entity_id**, role) -> **задоволува БКНФ**
    263 11. Reviews(**listener_id, musical_entity_id**, grade, comment) -> **задоволува БКНФ**
    264 12. Artists(**artist_id**) -> **задоволува БКНФ**
    265 13. R7 = { **playlist_id, event_id, song_id, timestamp, admin_id, user_id, listener_id, album_id, musical_entity_id, artist_id, non_admin_user_id**}  -> **задоволува БКНФ**
     2735. Roles(**role_id**, role_name) -> **задоволува БКНФ**
     2746. Listeners(**listener_id**) -> **задоволува БКНФ**
     2757. Non_Admin_Users(**non_admin_user_id**) -> **задоволува БКНФ**
     2768. Users(**user_id**, profile_photo, email, username, full_name, password) -> **задоволува БКНФ**
     2779. Albums(**album_id**) -> **задоволува БКНФ**
     27810. Musical_Entities(**musical_entity_id**, title, genre, release_date, artist_id) -> **задоволува БКНФ**
     27911. Contributions(**artist_id, musical_entity_id**, contribution_order) -> **задоволува БКНФ**
     28012. Reviews(**listener_id, musical_entity_id**, grade, comment) -> **задоволува БКНФ**
     28113. Artists(**artist_id**) -> **задоволува БКНФ**
     28214. R8 = { **playlist_id, event_id, song_id, timestamp, admin_id, role_id, user_id, listener_id, album_id, musical_entity_id, artist_id, non_admin_user_id**}  -> **задоволува БКНФ**
    266283
    267284
     
    269286== Проверка за 4НФ
    270287
    271 Релацијата R7 **не ја задоволува 4НФ** бидејќи содржи мултивредносни зависности, како на пример `listener_id →→ song_id, timestamp`, што значи дека слушањата на песните се целосно независни од лајковите на песните.
     288Релацијата R8 **не ја задоволува 4НФ** бидејќи содржи мултивредносни зависности, како на пример `listener_id →→ song_id, timestamp`, што значи дека слушањата на песните се целосно независни од лајковите на песните. Аналогно, `(artist_id, musical_entity_id) →→ role_id`, бидејќи улогите кои еден артист ги има за одреден musical entity се независни од останатите повеќевредносни релации во R8 - истиот артист може да има повеќе улоги (пр. MAIN_VOCAL и PRODUCER) за иста песна/албум.
    272289
    273290== Декомпозиција по 4НФ:
     
    279296- **Saved_Playlists (listener_id, playlist_id)**
    280297- **Listens (listener_id, song_id, timestamp)**
     298- **Contribution_Roles (artist_id, musical_entity_id, role_id)** - оваа релација овозможува еден артист да има повеќе улоги за едно исто дело.
    281299
    282300Lossless join: Доколку направиме join по заедничките атрибути на овие релации можеме
    283 да ја реконстроуираме R7.
     301да ја реконстроуираме R8.
    284302
    285303Dependency preservation: Новодобиените релации не претставуваат функционални зависности.
     
    2923103. Events(**event_id**, event_name, location, venue, date, time, user_id)
    2933114. Admins(**admin_id**)
    294 5. Listeners(**listener_id**)
    295 6. Non_Admin_Users(**non_admin_user_id**)
    296 7. Users(**user_id**, profile_photo, email, username, full_name, password)
    297 8. Albums(**album_id**)
    298 9. Musical_Entities(**musical_entity_id**, title, genre, release_date, artist_id)
    299 10. Artist_Contributions(**artist_id, musical_entity_id**, role)
    300 11. Reviews(**listener_id, musical_entity_id**, grade, comment)
    301 12. Artists(**artist_id**)
    302 13. Playlist_Songs(**song_id, playlist_id**)
    303 14. Performs_At (**event_id, artist_id**)
    304 15. Likes(**listener_id, musical_entity_id**)
    305 16. Follows(**follower_id, followee_id**)
    306 17. Saved_Playlists (**listener_id, playlist_id**)
    307 18. Listens (**listener_id, song_id, timestamp**)
     3125. Roles(**role_id**, role_name)
     3136. Listeners(**listener_id**)
     3147. Non_Admin_Users(**non_admin_user_id**)
     3158. Users(**user_id**, profile_photo, email, username, full_name, password)
     3169. Albums(**album_id**)
     31710. Musical_Entities(**musical_entity_id**, title, genre, release_date, artist_id)
     31811. Contributions(**artist_id, musical_entity_id**, contribution_order)
     31912. Reviews(**listener_id, musical_entity_id**, grade, comment)
     32013. Artists(**artist_id**)
     32114. Playlist_Songs(**song_id, playlist_id**)
     32215. Performs_At (**event_id, artist_id**)
     32316. Likes(**listener_id, musical_entity_id**)
     32417. Follows(**follower_id, followee_id**)
     32518. Saved_Playlists (**listener_id, playlist_id**)
     32619. Listens (**listener_id, song_id, timestamp**)
     32720. Contribution_Roles(**artist_id, musical_entity_id, role_id**)
    308328
    309329