= Релационен модел == ЕР Дијаграм [[Image(RelationalModel.jpg, 1400px)]] == Дополнителен Опис - Табелите `Roles` и `Permissions` служат за дефинирање на сите достапни улоги и пермисии во системот, соодветно, додека `User_Roles` и `Role_Permissions` ги чуваат сите ролји доделени на корисниците и сите пермисии доделени на ролјите, соодветно. `Resource_Shares` служи за чување некои отстапки од овие правила, на пример доколку Корисник А сподели приватна плејлиста со Корисник Б, таа информација ќе се чува во оваа табела и иако плејлистата е приватна Корисник Б сепак ќе има пристап до неа. - Во табелите `Songs`, `Albums` и `Resource_Shares` имаме подмножества на foreign keys коишто се nullable, но доколку сите од нив се null тогаш тој запис во табелата не би правел смисла. Станува збор за следните подмножества: - `Songs(published_by_artist_id, published_by_label_admin_id)`[*] - информација за кој ја објавил песната - `Albums(published_by_artist_id, published_by_label_admin_id)` - информација за кој го објавил албумот - `Resource_Shares(song_id, playlist_id, album_id)` - ресурс на кој се однесува дадената дозвола - `Resource_Shares(user_id, role_id)` - дали улогата ја додаваме на конкретен корисник или на одредена ролја За секое од наведените подмножества има меѓусебна исклучивост, поточно точно еден од клучевите мора да биде non-null. Ова не можеме да го опфатиме во релациониот модел, но истото ќе биде опфатено понатаму во DDL скриптата. [*] Во дијаграмот има грешка при именување на вториот атрибут (`Label_Adminsid` треба да биде `published_by_label_admin_id`). - Чуваме табели `Playback_Sessions` и `Song_Streams`. Причината за ова е бидејќи `Playback_Sessions` ги чува сите сесии каде некој корисник слушал некоја песна, макар и да ја слушал само неколку секунди или ја прескокнал додека барал некоја друга. Јасно е дека доколку ова го чуваме како едно слушање на песната ќе води до многу инфлаторни податоци, па затоа ќе поставиме одреден праг кој треба да се постигне за една сесија да се смета за валидно слушање (пр. 30 секунди). За секоја од овие валидни сесии при надминување на прагот ќе следи запис во `Song_Streams` табелата. Оваа табела намерно е денормализирана (содржи редундантни податоци за `streamed_at`, `song_id` кои би можеле да се земат и со join преку `playback_session_id`) со цел сите аналитики околу бројот на слушања да се прават директно на оваа табела бидејќи нема да ги содржи оние записи коишто не ни се од интерес. - `Song_Relationships` табелата служи за опфаќање на различни изданија од песни - нешто како Remix, Cover, Only Instrumental и слично, што е честа практика во индустријата. Ова би се постигнало преку додавање на нов запис во `Songs` со новото издание на песната, а потоа додавање на соодветен запис во `Song_Relationships`, каде `relationship_type` ја опишува релацијата за која станува збор, пример некој од горенаведените термини.