wiki:Normalization

Version 3 (modified by 231017, 3 days ago) ( diff )

--

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

За табелите од нашата база на податоци, со цел разликување на самите id за секој ентитет, ќе ги преименуваме id атрибутите во <име_на_релација>_id. Со тоа добиваме: user_id, non_admin_user_id, admin_id, listener_id, musical_entity_id, song_id, artist_id, event_id, album_id, playlist_id.

Функционални зависности

user_id -> profile_photo, email, username, full_name, password
musical_entity_id -> title, genre, release_date, artist_id
song_id -> link, album_id
playlist_id -> cover, playlist_name, listener_id
event_id -> event_name, location, venue, date, time, artist_id, admin_id
(artist_id, musical_entity_id) -> role
(listener_id, musical_entity_id) -> grade, comment
(listener_id, song_id) -> timestamp
non_admin_user_id -> /
admin_id -> /
listener_id -> /
artist_id -> /
album_id -> /
(listener_id, playlist_id) -> /
(playlist_id, song_id) -> /
(follower_id, followee_id) -> /
(event_id, artist_id) -> /
(listener_id, musical_entity_id) -> /

Лево:
user_id,
musical_entity_id,
song_id,
playlist_id,
event_id,
non_admin_user_id,
follower_id,
followee_id

Десно:
profile_photo, email, username, full_name, password,
title, genre, release_date, link, cover, playlist_name,
event_name, location, venue, date, time, role, grade, comment,
timestamp

Лево и десно:
artist_id,
admin_id,
listener_id,
album_id

Глобална релација
R={ user_id, musical_entity_id, song_id, playlist_id, event_id, non_admin_user_id, follower_id, followee_id, profile_photo, email, username, full_name, password, title, genre, release_date, link, cover, playlist_name, event_name, location, venue, date, time, role, grade, comment, timestamp, artist_id, admin_id, listener_id, album_id }

Покривачи

  1. user_id+ = {user_id, profile_photo, email, username, full_name, password} -> Не ги содржи сите атрибути
  2. musical_entity_id+ = {musical_entity_id, title, genre, release_date, artist_id, role} -> Не ги содржи сите атрибути
  3. song_id+ = {song_id, link} -> Не ги содржи сите атрибути
  4. playlist_id+ = {playlist_id, cover, playlist_name, listener_id} -> Не ги содржи сите атрибути
  5. event_id+ = {event_id, event_name, location, venue, date, time, artist_id, admin_id} -> Не ги содржи сите атрибути
  6. non_admin_user_id+ = {non_admin_user_id} -> Не ги содржи сите атрибути
  7. follower_id+ = {follower_id} -> Не ги содржи сите атрибути
  8. followee_id+ = {followee_id} -> Не ги содржи сите атрибути

Ги комбинираме покривачите за да дојдеме до сите атрибути:

  1. {user_id, musical_entity_id}+ = {user_id,musical_entity_id, profile_photo, email, username, full_name, password, title, genre, release_date, artist_id, role} -> Не ги содржи сите атрибути
  1. {user_id, musical_entity_id, song_id}+ = {user_id, musical_entity_id, song_id, profile_photo, email, username, full_name, password, title, genre, release_date, artist_id, role, link, album_id} -> Не ги содржи сите атрибути

  1. {user_id, musical_entity_id, song_id, playlist_id }+ = {user_id, musical_entity_id, song_id, playlist_id, profile_photo, email, username, full_name, password, title, genre, release_date, artist_id, role , link, album_id, cover, playlist_name, listener_id, grade, comment, timestamp } -> Не ги содржи сите атрибути
  1. {user_id, musical_entity_id, song_id, playlist_id, event_id }+ = {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, admin_id, profile_photo, email, username, full_name, password,title, genre, release_date, role , link, album_id,cover, playlist_name, listener_id, grade, comment, timestamp,event_name, location, venue, date, time} -> Не ги содржи сите атрибути

  1. {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id}+ = {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, profile_photo, email, username, full_name, password,title, genre, release_date, role, link, album_id, cover, playlist_name, listener_id, grade, comment, timestamp, event_name, location, venue, date, time, admin_id } -> Не ги содржи сите атрибути
  1. {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, follower_id}+ = {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, follower_id, profile_photo, email, username, full_name, password,title, genre, release_date, role, link, album_id, cover, playlist_name, listener_id, grade, comment, timestamp, event_name, location, venue, date, time, admin_id } -> Не ги содржи сите атрибути
  1. {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, follower_id, followee_id}+ = {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, follower_id, followee_id, profile_photo, email, username, full_name, password,title, genre, release_date, role, link, album_idcover, playlist_name, listener_id, grade, comment, timestamp, event_name, location, venue, date, time, admin_id } -> Не ги содржи сите атрибути
  1. {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, follower_id, followee_id, non_admin_user_id}+ = {user_id, musical_entity_id, song_id, playlist_id, event_id, follower_id, followee_id, non_admin_user_id, profile_photo, email, username, full_name, password,title, genre, release_date, role, link, album_id, artist_id, cover, playlist_name, listener_id, grade, comment, timestamp, event_name, location, venue, date, time, admin_id } -> Ги содржи сите атрибути

Избран примарен клуч: {user_id, musical_entity_id, song_id, playlist_id, event_id, artist_id, follower_id, followee_id, non_admin_user_id}
Релацијата ја задоволува 1НФ, но не ја задоволува 2НФ поради постоење на парцијални зависности.

Декомпозиција во 2НФ

Најпрво ги групираме атрибутите само според клучевите од кои зависат.

  1. user_id-> profile_photo, email, username, full_name, password
  2. musical_entity_id-> title, genre, release_date, artist_id
  3. song_id-> link, album_id
  4. playlist_id-> cover, playlist_name, listener_id
  5. event_id-> event_name, location, venue, date, time, artist_id, admin_id

Декомпозиција во релации

  • user_id-> profile_photo, email, username, full_name, password
  • musical_entity_id-> title, genre, release_date, artist_id
  • song_id-> link, album_id
  • playlist_id-> cover, playlist_name, listener_id
  • event_id-> event_name, location, venue, date, time, artist_id, admin_id
  • (artist_id, musical_entity_id)-> role
  • (listener_id, musical_entity_id)-> grade, comment
  • (listener_id, song_id)-> timestamp

R1 - {user_id, profile_photo, email, username, full_name, password} -> BCNF

R2 - {musical_entity_id, title, genre, release_date, artist_id} -> BCNF

R3 - {song_id, link, album_id} -> BCNF

R4 - {playlist_id, cover, playlist_name, listener_id} -> BCNF

R5 - {event_id, event_name, location, venue, date, time, artist_id, admin_id} -> Не задоволува 3НФ

R6 - {(artist_id, musical_entity_id), role} -> BCNF

R7 - {(listener_id, musical_entity_id), grade, comment} -> BCNF

R8 - {(listener_id, song_id), timestamp} -> BCNF

R9 - {(follower_id, followee_id)} -> BCNF

R10 - {(playlist_id, song_id)} -> BCNF

R11 - {(listener_id, musical_entity_id)} -> BCNF

R12 - {(listener_id, playlist_id)} -> BCNF

R13 - {(event_id, artist_id)} -> BCNF

Декомпозиција на R5

Поради транзитивната зависност во R5 (venue -> location), поточно секој venue секогаш ќе ја има истата локација, правиме декомпозиција во две релации:

  • R5.1 {event_id, event_name, venue, date, time, artist_id, admin_id}
  • R14 {venue, location}

Проверка за 3НФ

R1 - Клуч: user_id и сите атрибути зависат директно само од него. Релацијата е во BCNF

R2 - Клуч: musical_entity_id и сите атрибути зависат директно само од него. Релацијата е во BCNF

R3 - Клуч: song_id и сите атрибути зависат директно само од него. Релацијата е во BCNF

R4 - Клуч: playlist_id и сите атрибути зависат директно само од него. Релацијата е во BCNF

R5.1 - Клуч: event_id и сите атрибути зависат директно само од него. Релацијата е во BCNF

R6 - Клуч: (artist_id, musical_entity_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF

R7 - Клуч: (listener_id, musical_entity_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF

R8 - Клуч: (listener_id, song_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF

R9 - Клуч: (follower_id, followee_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF

R10 - Клуч: (playlist_id, song_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF

R11 - Клуч: (listener_id, musical_entity_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF

R12 - Клуч: (listener_id, playlist_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF

R13 - Клуч: (event_id, artist_id) и сите атрибути зависат директно само од него. Релацијата е во BCNF

R14 - Клуч: venue и сите атрибути зависат директно само од него. Релацијата е во BCNF

Финални релации во BCNF

  1. Users {user_id, profile_photo, email, username, full_name, password}
  2. Musical_Entities {musical_entity_id, title, genre, release_date, artist_id}
  3. Songs {song_id, link, album_id}
  4. Playlists {playlist_id, cover, playlist_name, listener_id}
  5. Events {event_id, event_name, location, venue, date, time, artist_id, admin_id}
  6. Artist_Contributions {artist_id, musical_entity_id, role}
  7. Reviews {listener_id, musical_entity_id, grade, comment}
  8. Listens {listener_id, song_id, timestamp}
  9. Follows {follower_id, followee_id}
  10. Playlist_Songs {playlist_id, song_id}
  11. Likes {listener_id, musical_entity_id}
  12. Saved_Playlists {listener_id, playlist_id}
  13. Performs_At {event_id, artist_id}
  14. Venues {venue, location}

Дискусија на разликите од моделот во Фаза P2

Процесот на нормализација го потврди концептуалниот дизајн од Фаза 2. Ова значи дека ЕР дијаграмот е солидно сработен. Единствена нова релација која произлезе од нормализацијата е R14 (Venues), од каде произлегува и функционалната зависност venue -> location

Note: See TracWiki for help on using the wiki.