Changes between Version 23 and Version 24 of Normalization


Ignore:
Timestamp:
08/07/26 16:04:13 (24 hours ago)
Author:
231175
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v23 v24  
    77{{{
    88Universal_Relation_Shifter( account_id, account_email, account_password_hash, account_name,
    9 user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points, user_favorite_course_ids,
     9user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
    1010meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link,
    1111expert_id,
     
    6262 * '''FD26:''' (course_content_id, lecture_position) → course_lecture_id
    6363 * '''FD27:''' (course_translate_id, course_what_will_be_learned) → ∅
    64  * '''FD28:''' (user_id, user_favorite_course_ids) → ∅
    65  * '''FD29:''' account_email → account_id
    66  * '''FD30:''' language_id → language_value
    67  * '''FD31:''' language_value → language_id
    68  * '''FD32:''' meeting_link → meeting_reminder_id
     64 * '''FD28:''' (user_id) → ∅
     65 * '''FD28:''' account_email → account_id
     66 * '''FD29:''' language_id → language_value
     67 * '''FD30:''' language_value → language_id
     68 * '''FD31:''' meeting_link → meeting_reminder_id
    6969'''}'''
    7070
     
    8080
    8181||= Атрибут =||= Лева страна =||= Десна страна =||= Класификација =||
    82 || account_id || ✓ (FD18) || ✓ (FD1, FD4, FD29) || и лево и десно ||
    83 || account_email || ✓ (FD29) || ✓ (FD18) || и лево и десно ||
     82|| account_id || ✓ (FD18) || ✓ (FD1, FD4, FD28) || и лево и десно ||
     83|| account_email || ✓ (FD28) || ✓ (FD18) || и лево и десно ||
    8484|| account_password_hash || ✗ || ✓ (FD18) || десно ||
    8585|| account_name || ✗ || ✓ (FD18) || десно ||
    86 || user_id || ✓ (FD1, FD28) || ✓ (FD2, FD3, FD6) || и лево и десно ||
     86|| user_id || ✓ (FD1) || ✓ (FD2, FD3, FD6) || и лево и десно ||
    8787|| user_login_provider || ✗ || ✓ (FD1) || десно ||
    8888|| user_is_verified || ✗ || ✓ (FD1) || десно ||
     
    9292|| user_work_position || ✗ || ✓ (FD1) || десно ||
    9393|| user_points || ✗ || ✓ (FD1) || десно ||
    94 || user_favorite_course_ids || ✓ (FD28) || ✗ || лево ||
    9594|| verification_token_uuid || ✓ (FD2) || ✗ || лево ||
    9695|| token_created_at || ✗ || ✓ (FD2) || десно ||
    9796|| token_expires_at || ✗ || ✓ (FD2) || десно ||
    98 || meeting_reminder_id || ✓ (FD3) || ✓ (FD32) || и лево и десно ||
     97|| meeting_reminder_id || ✓ (FD3) || ✓ (FD31) || и лево и десно ||
    9998|| meeting_at || ✗ || ✓ (FD3) || десно ||
    10099|| meeting_scheduled_at || ✗ || ✓ (FD3) || десно ||
    101100|| meeting_sent || ✗ || ✓ (FD3) || десно ||
    102 || meeting_link || ✓ (FD32) || ✓ (FD3) || и лево и десно ||
     101|| meeting_link || ✓ (FD31) || ✓ (FD3) || и лево и десно ||
    103102|| expert_id || ✓ (FD4) || ✗ || лево ||
    104 || language_id || ✓ (FD20, FD21, FD22, FD23, FD30) || ✓ (FD10, FD12, FD14, FD16, FD31) || и лево и десно ||
    105 || language_value || ✓ (FD31) || ✓ (FD30) || и лево и десно ||
     103|| language_id || ✓ (FD20, FD21, FD22, FD23, FD29) || ✓ (FD10, FD12, FD14, FD16, FD30) || и лево и десно ||
     104|| language_value || ✓ (FD30) || ✓ (FD29) || и лево и десно ||
    106105|| course_id || ✓ (FD5, FD19, FD20) || ✓ (FD11, FD12) || и лево и десно ||
    107106|| course_image_url || ✗ || ✓ (FD5) || десно ||
     
    159158
    160159 * '''verification_token_uuid''' - мора да биде дел од секој кандидат клуч
    161  * '''meeting_reminder_id''' - мора да биде дел од секој кандидат клуч (или meeting_link, FD32)
     160 * '''meeting_reminder_id''' - мора да биде дел од секој кандидат клуч (или meeting_link, FD31)
    162161 * '''expert_id''' - мора да биде дел од секој кандидат клуч
    163162 * '''course_what_will_be_learned''' - мора да биде дел од секој кандидат клуч
    164  * '''user_favorite_course_ids''' - мора да биде дел од секој кандидат клуч
    165163
    166164=== 3.4 Пресметка на затворач ===
    167165
    168 '''Чекор 1:''' Започнуваме со {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids} и пресметуваме затворач:
    169 
    170 {{{
    171 {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids}⁺:
     166'''Чекор 1:''' Започнуваме со {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned} и пресметуваме затворач:
     167
     168{{{
     169{verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned}⁺:
    172170- Од FD2 (verification_token_uuid →): добиваме token_created_at, token_expires_at, user_id
    173171- Од FD3 (meeting_reminder_id →): добиваме meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id
     
    175173- Од FD4 (expert_id →): добиваме account_id
    176174- Од FD18 (account_id →): добиваме account_email, account_password_hash, account_name
    177 - Од FD29 (account_email →): добиваме account_id
    178 }}}
    179 
    180 '''{verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids}⁺ ≠ Universal_Relation_Shifter'''
     175- Од FD28 (account_email →): добиваме account_id
     176}}}
     177
     178'''{verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned}⁺ ≠ Universal_Relation_Shifter'''
    181179
    182180'''Недостасуваат:'''
     
    199197
    200198{{{
    201 {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id}⁺:
     199{verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_course_progress_id}⁺:
    202200- Сè од претходно, плус:
    203201- Од FD17 (user_course_progress_id →): добиваме progress_is_completed, progress_completed_at, enrollment_id, course_lecture_id
     
    211209}}}
    212210
    213 '''{verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id}⁺ ≠ Universal_Relation_Shifter'''
     211'''{verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_course_progress_id}⁺ ≠ Universal_Relation_Shifter'''
    214212
    215213'''Недостасуваат:'''
     
    224222
    225223{{{
    226 {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺:
     224{verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺:
    227225- Сè од претходно, плус:
    228226- Од FD16 (course_lecture_translate_id →): добиваме lecture_title, lecture_content_file_name, lecture_description, lecture_content_text, course_lecture_id, language_id
     
    230228- Од FD12 (course_translate_id →): добиваме course_title_short, course_title, course_description_short, course_description, course_description_long, course_id, language_id
    231229- Од FD10 (tag_translate_id →): добиваме tag_value, tag_id, language_id
    232 - Од FD30 (language_id →): добиваме language_value
     230- Од FD29 (language_id →): добиваме language_value
    233231- Од FD9 (tag_id →): добиваме tag_type
    234232- Од FD27 ({course_translate_id, course_what_will_be_learned} →): добиваме ∅
    235233}}}
    236234
    237 '''{verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺ = Universal_Relation_Shifter''' (ги содржи сите атрибути) ✓
     235'''{verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺ = Universal_Relation_Shifter''' (ги содржи сите атрибути) ✓
    238236
    239237=== 3.5 Проверка за минималност ===
    240238
    241239||= Подмножество =||= Затворач =||= = Universal_Relation_Shifter? =||
    242 || {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids}⁺ || Недостасуваат атрибути од user_course_progress || ✗ НЕ ||
    243 || {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id}⁺ || Недостасуваат атрибути од course_translate || ✗ НЕ ||
    244 || {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id, course_translate_id}⁺ || Недостасуваат атрибути од course_lecture_translate || ✗ НЕ ||
    245 || {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id, course_translate_id, course_lecture_translate_id}⁺ || Недостасуваат атрибути од course_content_translate || ✗ НЕ ||
    246 || {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id, course_translate_id, course_lecture_translate_id, course_content_translate_id}⁺ || Недостасуваат атрибути од tag_translate || ✗ НЕ ||
    247 || {verification_token_uuid, meeting_link, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺ || Сите атрибути се присутни || ✓ ДА ||
    248 || {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, enrollment_id, course_lecture_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} || Сите атрибути се присутни || ✓ ДА ||
    249 || {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺ || Сите атрибути се присутни || ✓ ДА ||
    250 
    251 '''Заклучок:''' {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} е минимален и е кандидат клуч.
     240|| {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned}⁺ || Недостасуваат атрибути од user_course_progress || ✗ НЕ ||
     241|| {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_course_progress_id}⁺ || Недостасуваат атрибути од course_translate || ✗ НЕ ||
     242|| {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_course_progress_id, course_translate_id}⁺ || Недостасуваат атрибути од course_lecture_translate || ✗ НЕ ||
     243|| {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_course_progress_id, course_translate_id, course_lecture_translate_id}⁺ || Недостасуваат атрибути од course_content_translate || ✗ НЕ ||
     244|| {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_course_progress_id, course_translate_id, course_lecture_translate_id, course_content_translate_id}⁺ || Недостасуваат атрибути од tag_translate || ✗ НЕ ||
     245|| {verification_token_uuid, meeting_link, expert_id, course_what_will_be_learned, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺ || Сите атрибути се присутни || ✓ ДА ||
     246|| {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, enrollment_id, course_lecture_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} || Сите атрибути се присутни || ✓ ДА ||
     247|| {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺ || Сите атрибути се присутни || ✓ ДА ||
     248
     249'''Заклучок:''' {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} е минимален и е кандидат клуч.
    252250
    253251=== 3.6 Други кандидат клучеви ===
    254252
    255 Дополнителен кандидат клуч кој го разгледував беше '''{verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, enrollment_id, course_lecture_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}''', каде наместо user_course_progress_id присутни се enrollment_id и course_lecture_id. Меѓутоа овој кандидат клуч е поголем од тој со user_course_progress_id, па затоа не го земам во предвид при бирање на примарен клуч.
    256 
    257 Втор кандидат клуч со иста големина се добива ако наместо meeting_reminder_id се земе meeting_link (FD32). Го избирам meeting_reminder_id бидејќи е сурогат клуч со фиксна должина, наспроти meeting_link кој е текстуален атрибут.
     253Дополнителен кандидат клуч кој го разгледував беше '''{verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, enrollment_id, course_lecture_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}''', каде наместо user_course_progress_id присутни се enrollment_id и course_lecture_id. Меѓутоа овој кандидат клуч е поголем од тој со user_course_progress_id, па затоа не го земам во предвид при бирање на примарен клуч.
     254
     255Втор кандидат клуч со иста големина се добива ако наместо meeting_reminder_id се земе meeting_link (FD31). Го избирам meeting_reminder_id бидејќи е сурогат клуч со фиксна должина, наспроти meeting_link кој е текстуален атрибут.
    258256
    259257=== 3.7 Избор на примарен клуч ===
    260258
    261 '''Избран примарен клуч: {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}'''
     259'''Избран примарен клуч: {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}'''
    262260
    263261'''Образложение:'''
     
    281279   PK: {course_translate_id, course_what_will_be_learned}
    282280
    283 Universal_Relation_Shifter_Base_1 = Universal_Relation_Shifter - {course_what_will_be_learned}
    284 
    285 Universal_Relation_Shifter_Base_1(
    286 account_id, account_email, account_password_hash, account_name,
    287 user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points, user_favorite_course_ids,
     281Universal_Relation_Shifter_Base = Universal_Relation_Shifter - {course_what_will_be_learned}
     282
     283Universal_Relation_Shifter_Base(
     284account_id, account_email, account_password_hash, account_name,
     285user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
    288286meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link,
    289287expert_id,
     
    304302tag_translate_id, tag_value
    305303)
    306    PK: {verification_token_uuid, meeting_reminder_id, expert_id, user_favorite_course_ids, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}
     304   PK: {verification_token_uuid, meeting_reminder_id, expert_id, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}
    307305}}}
    308306
     
    310308
    311309'''Проверка за dependency preservation:''' FD27 е зачувана во Course_Translate_What_Will_Be_Learned
    312 
    313 === Чекор 4.2: Декомпозиција на релацијата Universal_Relation_Shifter ===
    314 
    315 '''Нарушува 1NF: '''Релацијата не е во 1NF бидејќи атрибутот user_favorite_course_ids претставува повеќевредносен (multi-valued) атрибут. Секој user може да има повеќе ставки од user_favorite_course_ids.
    316 
    317 '''Декомпозиција:'''
    318 
    319 {{{
    320 User_Favorite_Course(user_id, course_id)
    321    PK: {user_id, course_id}
    322 
    323 Universal_Relation_Shifter_Base = Universal_Relation_Shifter_Base_1 - {user_favorite_course_ids}
    324 
    325 Universal_Relation_Shifter_Base(
    326 account_id, account_email, account_password_hash, account_name,
    327 user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
    328 meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link,
    329 expert_id,
    330 language_id, language_value,
    331 course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
    332 course_version_id, version_number, version_created_at, version_is_active,
    333 enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date,
    334 payment_id, payment_amount, payment_date, payment_method, payment_status,
    335 review_id, review_rating, review_comment, review_date,
    336 course_translate_id, course_title_short, course_title, course_description_short, course_description, course_description_long,
    337 course_content_id, content_position,
    338 course_content_translate_id, content_translate_title,
    339 course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type,
    340 course_lecture_translate_id, lecture_title, lecture_content_file_name, lecture_description, lecture_content_text,
    341 user_course_progress_id, progress_is_completed, progress_completed_at,
    342 verification_token_uuid, token_created_at, token_expires_at,
    343 tag_id, tag_type,
    344 tag_translate_id, tag_value
    345 )
    346    PK: {verification_token_uuid, meeting_reminder_id, expert_id, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}
    347 }}}
    348 
    349 '''Проверка за lossless join:''' Може да се реконструира преку user_id
    350 
    351 '''Проверка за dependency preservation:''' FD28 е зачувана во User_Favorite_Course
    352 
    353310
    354311=== 4.3 Проверка која FD ја нарушува 2NF ===
     
    386343|| FD25: (course_version_id, content_position) → course_content_id || course_version_id, content_position || НЕ || Не ||
    387344|| FD26: (course_content_id, lecture_position) → course_lecture_id || course_content_id, lecture_position || НЕ || Не ||
    388 || FD29: account_email → account_id || account_email || НЕ || Не ||
    389 || FD30: language_id → language_value || language_id || НЕ (транзитивно преку course_translate_id) || Не директно ||
    390 || FD31: language_value → language_id || language_value || НЕ || Не ||
    391 || FD32: meeting_link → meeting_reminder_id || meeting_link || НЕ || Не ||
     345|| FD28: account_email → account_id || account_email || НЕ || Не ||
     346|| FD29: language_id → language_value || language_id || НЕ (транзитивно преку course_translate_id) || Не директно ||
     347|| FD30: language_value → language_id || language_value || НЕ || Не ||
     348|| FD31: meeting_link → meeting_reminder_id || meeting_link || НЕ || Не ||
    392349
    393350'''Заклучок:''' Релацијата не е во 2NF бидејќи има парцијални зависности. Атрибутите на '''FD2, FD3, FD4, FD10, FD12, FD14, FD16, FD17''' зависат само од дел од примарниот клуч, а не од целиот клуч.
     
    484441'''Проверка за lossless join:''' Може да се реконструира преку user_id
    485442 
    486 '''Проверка за dependency preservation:''' FD3 и FD32 се зачувани во Meeting_Reminder
     443'''Проверка за dependency preservation:''' FD3 и FD31 се зачувани во Meeting_Reminder
    487444
    488445=== Чекор 5.3: Декомпозиција по FD4 (expert_id → ...) ===
     
    827784
    828785'''Заклучок:''' После извлекување на сите парцијални зависности (FD2, FD3, FD4, FD10, FD12, FD14, FD16, FD17), универзалната релација е целосно декомпонирана. Примарниот клуч на Universal_Relation_Shifter_Base_8 е празно множество (∅), што значи дека таа релација повеќе не постои како валидна релација.
    829 Останатите функционални зависности (FD1, FD5-FD9, FD11, FD13, FD15, FD18, FD30) **нарушуваат 3NF** бидејќи нивните детерминанти (user_id, course_id, enrollment_id, account_id, language_id, итн.) не се примарни клучеви на
     786Останатите функционални зависности (FD1, FD5-FD9, FD11, FD13, FD15, FD18, FD29) **нарушуваат 3NF** бидејќи нивните детерминанти (user_id, course_id, enrollment_id, account_id, language_id, итн.) не се примарни клучеви на
    830787Universal_Relation_Shifter_Base_8, туку се независни детерминанти кои треба да формираат посебни релации.
    831788
     
    10561013'''Проверка за lossless join:''' Може да се реконструира преку account_id во User и Expert
    10571014 
    1058 '''Проверка за dependency preservation:''' FD18 и FD29 се зачувани во Account
    1059 
    1060 === Чекор 6.11: Декомпозиција по FD30 (language_id → language_value) ===
     1015'''Проверка за dependency preservation:''' FD18 и FD28 се зачувани во Account
     1016
     1017=== Чекор 6.11: Декомпозиција по FD29 (language_id → language_value) ===
    10611018
    10621019{{{
     
    10741031'''Проверка за lossless join:''' Може да се реконструира преку language_id во релациите за преводи
    10751032 
    1076 '''Проверка за dependency preservation:''' FD30 и FD31 се зачувани во Language
     1033'''Проверка за dependency preservation:''' FD29 и FD30 се зачувани во Language
    10771034
    10781035=== Анализа на Universal_Relation_Shifter_Base_19 ===
     
    10921049
    10931050'''Заклучок од 3NF:'''
    1094 Сите функционални зависности (FD1-FD32) се организирани во релации кои се во 3NF. Universal_Relation_Shifter_Base_19 повеќе не постои како валидна релација.
     1051Сите функционални зависности (FD1-FD31) се организирани во релации кои се во 3NF. Universal_Relation_Shifter_Base_19 повеќе не постои како валидна релација.
    10951052
    10961053'''Останати врски (many-to-many):'''
     
    10981055
    10991056* '''User_Tag'''(user_id, tag_id) - корисник има интереси
     1057* '''User_Favorite_Course'''(user_id, course_id) - корисник има омилени курсеви
    11001058* '''Course_Tag'''(course_id, tag_id) - курс има тагови 
    11011059* '''Expert_Course'''(expert_id, course_id) - експерт предава курсеви
     
    11051063'''Релации креирани преку FD декомпозиција:'''
    11061064
    1107 '''1NF Декомпозиција (2 релации):'''
     1065'''1NF Декомпозиција (1 релација):'''
    11081066||= Релација =||= Атрибути =||= Примарен клуч =||
    11091067|| Course_Translate_What_Will_Be_Learned || course_translate_id, course_what_will_be_learned || (course_translate_id, course_what_will_be_learned) ||
    1110 || User_Favorite_Course || user_id, course_id || (user_id, course_id) ||
    11111068
    11121069'''2NF Декомпозиција (8 релации):'''
     
    11381095||= Релација =||= Атрибути =||= Примарен клуч =||= Извор =||
    11391096|| User_Tag || user_id, tag_id || (user_id, tag_id) || Many-to-many (ER модел) ||
     1097|| User_Favorite_Course || user_id, course_id || (user_id, course_id) || Many-to-many (ER модел) ||
    11401098|| Course_Tag || course_id, tag_id || (course_id, tag_id) || Many-to-many (ER модел) ||
    11411099|| Expert_Course || expert_id, course_id || (expert_id, course_id) || Many-to-many (ER модел) ||
     
    14161374
    14171375Преку процесот на нормализација, тргнувајќи од една универзална релација, дојдовме до '''24 релации'''
    1418 (19 од функционални зависности + 3 many-to-many junction tables + 2 multi-value tables). Споредбата со концептуалниот модел
     1376(19 од функционални зависности + 4 many-to-many junction tables + 1 multi-value table). Споредбата со концептуалниот модел
    14191377од Фаза P2 покажува следно:
    14201378
     
    14511409 21. '''Course_Tag''' - junction table за many-to-many релација помеѓу Course и Tag
    14521410 22. '''User_Tag''' - junction table за many-to-many релација помеѓу User и Tag
     1411 23. '''User_Favorite_Course''' - junction table за many-to-many релација помеѓу User и Course
    14531412
    14541413==== Релација со мултивредносен атрибут ====
    14551414
    1456  23. '''Course_Translate_What_Will_Be_Learned''' - беше дел од Course_Translate во концептуалниот модел, но се издвои во посебна релација во 1NF декомпозицијата поради мултивредносна природа (еден превод на курс има повеќе "what will be learned" ставки).
    1457  24. '''User_Favorite_Course''' - беше дел од User во концептуалниот модел, но се издвои во посебна релација во 1NF декомпозицијата поради мултивредносна природа (еден корисник има повеќе омилени курсеви).
     1415 24. '''Course_Translate_What_Will_Be_Learned''' - беше дел од Course_Translate во концептуалниот модел, но се издвои во посебна релација во 1NF декомпозицијата поради мултивредносна природа (еден превод на курс има повеќе "what will be learned" ставки).
    14581416
    14591417==== Клучни наоди ====
     
    14611419 1. '''Процесот на нормализација го потврди најголемиот дел од дизајнот''' - секоја декомпозиција базирана на функционалните зависности резултираше со релација која одговара на ентитет од оригиналниот модел, освен во четири случаи: Account, Language и намалените User и Expert.
    14621420
    1463  2. '''Клучот на универзалната релација''' - примарниот клуч беше идентификуван како композитен клуч од 10 атрибути: {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_favorite_course_ids, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}. Овој клуч беше идентификуван преку анализа на функционалните зависности и класификација лева/десна страна на атрибутите.
     1421 2. '''Клучот на универзалната релација''' - примарниот клуч беше идентификуван како композитен клуч од 9 атрибути: {verification_token_uuid, meeting_reminder_id, expert_id, course_what_will_be_learned, user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}. Овој клуч беше идентификуван преку анализа на функционалните зависности и класификација лева/десна страна на атрибутите.
    14641422
    14651423 3. '''Декомпозицијата е lossless''' - на секој чекор од процесот на нормализација, оригиналната информација може да се реконструира преку JOIN операции на заедничките атрибути (foreign keys).
    14661424
    1467  4. '''Сите функционални зависности се зачувани''' - сите 32 функционални зависности (FD1-FD32) се зачувани во соодветните релации, што значи дека ограничувањата можат да се проверуваат без потреба од скапи JOIN операции.
    1468 
    1469  5. '''Many-to-many релации''' - junction tables (Expert_Course, Course_Tag, User_Tag) не произлегуваат од функционални зависности, туку од ER моделот и бизнис логиката. Овие релации немаат свои атрибути освен composite primary key од два foreign keys.
     1425 4. '''Сите функционални зависности се зачувани''' - сите 31 функционални зависности (FD1-FD31) се зачувани во соодветните релации, што значи дека ограничувањата можат да се проверуваат без потреба од скапи JOIN операции.
     1426
     1427 5. '''Many-to-many релации''' - junction tables (Expert_Course, Course_Tag, User_Tag, User_Favorite_Course) не произлегуваат од функционални зависности, туку од ER моделот и бизнис логиката. Овие релации немаат свои атрибути освен composite primary key од два foreign keys.
    14701428
    14711429==== Заклучок ====