Changes between Version 22 and Version 23 of Normalization


Ignore:
Timestamp:
08/07/26 15:55:31 (12 hours ago)
Author:
231175
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v22 v23  
    77{{{
    88Universal_Relation_Shifter( account_id, account_email, account_password_hash, account_name,
    9 user_id, user_name, user_email, user_login_provider, user_password_hash, 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, user_favorite_course_ids,
    1010meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link,
    1111expert_id,
     
    3535
    3636'''F = {'''
    37  * '''FD1:''' user_id → user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points, account_id
     37 * '''FD1:''' 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, account_id
    3838 * '''FD2:''' verification_token_uuid → token_created_at, token_expires_at, user_id
    3939 * '''FD3:''' meeting_reminder_id → meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id
     
    5252 * '''FD16:''' course_lecture_translate_id → lecture_title, lecture_content_file_name, lecture_description, lecture_content_text, course_lecture_id, language_id
    5353 * '''FD17:''' user_course_progress_id → progress_is_completed, progress_completed_at, enrollment_id, course_lecture_id
    54  * '''FD18:''' user_email → user_id
    55  * '''FD19:''' account_id → account_email, account_password_hash, account_name
    56  * '''FD20:''' (course_id, version_number) → course_version_id
    57  * '''FD21:''' (course_id, language_id) → course_translate_id
    58  * '''FD22:''' (course_lecture_id, language_id) → course_lecture_translate_id
    59  * '''FD23:''' (course_content_id, language_id) → course_content_translate_id
    60  * '''FD24:''' (tag_id, language_id) → tag_translate_id
    61  * '''FD25:''' (enrollment_id, course_lecture_id) → user_course_progress_id
    62  * '''FD26:''' (course_version_id, content_position) → course_content_id
    63  * '''FD27:''' (course_content_id, lecture_position) → course_lecture_id
    64  * '''FD28:''' (course_translate_id, course_what_will_be_learned) → ∅
    65  * '''FD29:''' (user_id, user_favorite_course_ids) → ∅
    66  * '''FD30:''' account_email → account_id
    67  * '''FD31:''' language_id → language_value
    68  * '''FD32:''' language_value → language_id
    69  * '''FD33:''' meeting_link → meeting_reminder_id
     54 * '''FD18:''' account_id → account_email, account_password_hash, account_name
     55 * '''FD19:''' (course_id, version_number) → course_version_id
     56 * '''FD20:''' (course_id, language_id) → course_translate_id
     57 * '''FD21:''' (course_lecture_id, language_id) → course_lecture_translate_id
     58 * '''FD22:''' (course_content_id, language_id) → course_content_translate_id
     59 * '''FD23:''' (tag_id, language_id) → tag_translate_id
     60 * '''FD24:''' (enrollment_id, course_lecture_id) → user_course_progress_id
     61 * '''FD25:''' (course_version_id, content_position) → course_content_id
     62 * '''FD26:''' (course_content_id, lecture_position) → course_lecture_id
     63 * '''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
    7069'''}'''
    7170
     
    8180
    8281||= Атрибут =||= Лева страна =||= Десна страна =||= Класификација =||
    83 || account_id || ✓ (FD19) || ✓ (FD1, FD4, FD30) || и лево и десно ||
    84 || account_email || ✓ (FD30) || ✓ (FD19) || и лево и десно ||
    85 || account_password_hash || ✗ || ✓ (FD19) || десно ||
    86 || account_name || ✗ || ✓ (FD19) || десно ||
    87 || user_id || ✓ (FD1, FD29) || ✓ (FD2, FD3, FD6, FD18) || и лево и десно ||
    88 || user_name || ✗ || ✓ (FD1) || десно ||
    89 || user_email || ✓ (FD18) || ✓ (FD1) || и лево и десно ||
     82|| account_id || ✓ (FD18) || ✓ (FD1, FD4, FD29) || и лево и десно ||
     83|| account_email || ✓ (FD29) || ✓ (FD18) || и лево и десно ||
     84|| account_password_hash || ✗ || ✓ (FD18) || десно ||
     85|| account_name || ✗ || ✓ (FD18) || десно ||
     86|| user_id || ✓ (FD1, FD28) || ✓ (FD2, FD3, FD6) || и лево и десно ||
    9087|| user_login_provider || ✗ || ✓ (FD1) || десно ||
    91 || user_password_hash || ✗ || ✓ (FD1) || десно ||
    9288|| user_is_verified || ✗ || ✓ (FD1) || десно ||
    9389|| user_is_profile_complete || ✗ || ✓ (FD1) || десно ||
     
    9692|| user_work_position || ✗ || ✓ (FD1) || десно ||
    9793|| user_points || ✗ || ✓ (FD1) || десно ||
    98 || user_favorite_course_ids || ✓ (FD29) || ✗ || лево ||
     94|| user_favorite_course_ids || ✓ (FD28) || ✗ || лево ||
    9995|| verification_token_uuid || ✓ (FD2) || ✗ || лево ||
    10096|| token_created_at || ✗ || ✓ (FD2) || десно ||
    10197|| token_expires_at || ✗ || ✓ (FD2) || десно ||
    102 || meeting_reminder_id || ✓ (FD3) || ✓ (FD33) || и лево и десно ||
     98|| meeting_reminder_id || ✓ (FD3) || ✓ (FD32) || и лево и десно ||
    10399|| meeting_at || ✗ || ✓ (FD3) || десно ||
    104100|| meeting_scheduled_at || ✗ || ✓ (FD3) || десно ||
    105101|| meeting_sent || ✗ || ✓ (FD3) || десно ||
    106 || meeting_link || ✓ (FD33) || ✓ (FD3) || и лево и десно ||
     102|| meeting_link || ✓ (FD32) || ✓ (FD3) || и лево и десно ||
    107103|| expert_id || ✓ (FD4) || ✗ || лево ||
    108 || language_id || ✓ (FD21, FD22, FD23, FD24, FD31) || ✓ (FD10, FD12, FD14, FD16, FD32) || и лево и десно ||
    109 || language_value || ✓ (FD32) || ✓ (FD31) || и лево и десно ||
    110 || course_id || ✓ (FD5, FD20, FD21) || ✓ (FD11, FD12) || и лево и десно ||
     104|| language_id || ✓ (FD20, FD21, FD22, FD23, FD30) || ✓ (FD10, FD12, FD14, FD16, FD31) || и лево и десно ||
     105|| language_value || ✓ (FD31) || ✓ (FD30) || и лево и десно ||
     106|| course_id || ✓ (FD5, FD19, FD20) || ✓ (FD11, FD12) || и лево и десно ||
    111107|| course_image_url || ✗ || ✓ (FD5) || десно ||
    112108|| course_color || ✗ || ✓ (FD5) || десно ||
     
    114110|| course_duration_minutes || ✗ || ✓ (FD5) || десно ||
    115111|| course_price || ✗ || ✓ (FD5) || десно ||
    116 || enrollment_id || ✓ (FD6, FD25) || ✓ (FD7, FD8, FD17) || и лево и десно ||
     112|| enrollment_id || ✓ (FD6, FD24) || ✓ (FD7, FD8, FD17) || и лево и десно ||
    117113|| enrollment_status || ✗ || ✓ (FD6) || десно ||
    118114|| enrollment_purchase_date || ✗ || ✓ (FD6) || десно ||
     
    128124|| review_comment || ✗ || ✓ (FD8) || десно ||
    129125|| review_date || ✗ || ✓ (FD8) || десно ||
    130 || tag_id || ✓ (FD9, FD24) || ✓ (FD10) || и лево и десно ||
     126|| tag_id || ✓ (FD9, FD23) || ✓ (FD10) || и лево и десно ||
    131127|| tag_type || ✗ || ✓ (FD9) || десно ||
    132 || tag_translate_id || ✓ (FD10) || ✓ (FD24) || и лево и десно ||
     128|| tag_translate_id || ✓ (FD10) || ✓ (FD23) || и лево и десно ||
    133129|| tag_value || ✗ || ✓ (FD10) || десно ||
    134 || course_version_id || ✓ (FD11, FD26) || ✓ (FD6, FD13, FD20) || и лево и десно ||
    135 || version_number || ✓ (FD20) || ✓ (FD11) || и лево и десно ||
     130|| course_version_id || ✓ (FD11, FD25) || ✓ (FD6, FD13, FD19) || и лево и десно ||
     131|| version_number || ✓ (FD19) || ✓ (FD11) || и лево и десно ||
    136132|| version_created_at || ✗ || ✓ (FD11) || десно ||
    137133|| version_is_active || ✗ || ✓ (FD11) || десно ||
    138 || course_translate_id || ✓ (FD12) || ✓ (FD21) || и лево и десно ||
     134|| course_translate_id || ✓ (FD12) || ✓ (FD20) || и лево и десно ||
    139135|| course_title_short || ✗ || ✓ (FD12) || десно ||
    140136|| course_title || ✗ || ✓ (FD12) || десно ||
     
    142138|| course_description || ✗ || ✓ (FD12) || десно ||
    143139|| course_description_long || ✗ || ✓ (FD12) || десно ||
    144 || course_what_will_be_learned || ✓ (FD28) || ✗ || лево ||
    145 || course_content_id || ✓ (FD13, FD23, FD27) || ✓ (FD14, FD15, FD26) || и лево и десно ||
    146 || content_position || ✓ (FD26) || ✓ (FD13) || и лево и десно ||
    147 || course_content_translate_id || ✓ (FD14) || ✓ (FD23) || и лево и десно ||
     140|| course_what_will_be_learned || ✓ (FD27) || ✗ || лево ||
     141|| course_content_id || ✓ (FD13, FD22, FD26) || ✓ (FD14, FD15, FD25) || и лево и десно ||
     142|| content_position || ✓ (FD25) || ✓ (FD13) || и лево и десно ||
     143|| course_content_translate_id || ✓ (FD14) || ✓ (FD22) || и лево и десно ||
    148144|| content_translate_title || ✗ || ✓ (FD14) || десно ||
    149 || course_lecture_id || ✓ (FD15, FD22, FD25) || ✓ (FD16, FD17, FD27) || и лево и десно ||
     145|| course_lecture_id || ✓ (FD15, FD21, FD24) || ✓ (FD16, FD17, FD26) || и лево и десно ||
    150146|| lecture_duration_minutes || ✗ || ✓ (FD15) || десно ||
    151 || lecture_position || ✓ (FD27) || ✓ (FD15) || и лево и десно ||
     147|| lecture_position || ✓ (FD26) || ✓ (FD15) || и лево и десно ||
    152148|| lecture_content_type || ✗ || ✓ (FD15) || десно ||
    153 || course_lecture_translate_id || ✓ (FD16) || ✓ (FD22) || и лево и десно ||
     149|| course_lecture_translate_id || ✓ (FD16) || ✓ (FD21) || и лево и десно ||
    154150|| lecture_title || ✗ || ✓ (FD16) || десно ||
    155151|| lecture_content_file_name || ✗ || ✓ (FD16) || десно ||
    156152|| lecture_description || ✗ || ✓ (FD16) || десно ||
    157153|| lecture_content_text || ✗ || ✓ (FD16) || десно ||
    158 || user_course_progress_id || ✓ (FD17) || ✓ (FD25) || и лево и десно ||
     154|| user_course_progress_id || ✓ (FD17) || ✓ (FD24) || и лево и десно ||
    159155|| progress_is_completed || ✗ || ✓ (FD17) || десно ||
    160156|| progress_completed_at || ✗ || ✓ (FD17) || десно ||
     
    163159
    164160 * '''verification_token_uuid''' - мора да биде дел од секој кандидат клуч
    165  * '''meeting_reminder_id''' - мора да биде дел од секој кандидат клуч (или meeting_link, FD33)
     161 * '''meeting_reminder_id''' - мора да биде дел од секој кандидат клуч (или meeting_link, FD32)
    166162 * '''expert_id''' - мора да биде дел од секој кандидат клуч
    167163 * '''course_what_will_be_learned''' - мора да биде дел од секој кандидат клуч
     
    176172- Од FD2 (verification_token_uuid →): добиваме token_created_at, token_expires_at, user_id
    177173- Од FD3 (meeting_reminder_id →): добиваме meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id
    178 - Од FD1 (user_id →): добиваме user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points, account_id
     174- Од FD1 (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, account_id
    179175- Од FD4 (expert_id →): добиваме account_id
    180 - Од FD19 (account_id →): добиваме account_email, account_password_hash, account_name
    181 - Од FD18 (user_email →): добиваме user_id
    182 - Од FD30 (account_email →): добиваме account_id
     176- Од FD18 (account_id →): добиваме account_email, account_password_hash, account_name
     177- Од FD29 (account_email →): добиваме account_id
    183178}}}
    184179
     
    235230- Од FD12 (course_translate_id →): добиваме course_title_short, course_title, course_description_short, course_description, course_description_long, course_id, language_id
    236231- Од FD10 (tag_translate_id →): добиваме tag_value, tag_id, language_id
    237 - Од FD31 (language_id →): добиваме language_value
     232- Од FD30 (language_id →): добиваме language_value
    238233- Од FD9 (tag_id →): добиваме tag_type
    239 - Од FD28 ({course_translate_id, course_what_will_be_learned} →): добиваме ∅
     234- Од FD27 ({course_translate_id, course_what_will_be_learned} →): добиваме ∅
    240235}}}
    241236
     
    260255Дополнителен кандидат клуч кој го разгледував беше '''{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, па затоа не го земам во предвид при бирање на примарен клуч.
    261256
    262 Втор кандидат клуч со иста големина се добива ако наместо meeting_reminder_id се земе meeting_link (FD33). Го избирам meeting_reminder_id бидејќи е сурогат клуч со фиксна должина, наспроти meeting_link кој е текстуален атрибут.
     257Втор кандидат клуч со иста големина се добива ако наместо meeting_reminder_id се земе meeting_link (FD32). Го избирам meeting_reminder_id бидејќи е сурогат клуч со фиксна должина, наспроти meeting_link кој е текстуален атрибут.
    263258
    264259=== 3.7 Избор на примарен клуч ===
     
    290285Universal_Relation_Shifter_Base_1(
    291286account_id, account_email, account_password_hash, account_name,
    292 user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points, user_favorite_course_ids,
     287user_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,
    293288meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link,
    294289expert_id,
     
    314309'''Проверка за lossless join:''' Може да се реконструира преку course_translate_id
    315310
    316 '''Проверка за dependency preservation:''' FD28 е зачувана во Course_Translate_What_Will_Be_Learned
     311'''Проверка за dependency preservation:''' FD27 е зачувана во Course_Translate_What_Will_Be_Learned
    317312
    318313=== Чекор 4.2: Декомпозиција на релацијата Universal_Relation_Shifter ===
     
    330325Universal_Relation_Shifter_Base(
    331326account_id, account_email, account_password_hash, account_name,
    332 user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
     327user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
    333328meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link,
    334329expert_id,
     
    354349'''Проверка за lossless join:''' Може да се реконструира преку user_id
    355350
    356 '''Проверка за dependency preservation:''' FD29 е зачувана во User_Favorite_Course
     351'''Проверка за dependency preservation:''' FD28 е зачувана во User_Favorite_Course
    357352
    358353
     
    382377|| FD16: course_lecture_translate_id → lecture_title, lecture_content_file_name, lecture_description, lecture_content_text, course_lecture_id, language_id || course_lecture_translate_id || ДА (дел од примарен клуч) || '''ДА''' ||
    383378|| FD17: user_course_progress_id → progress_is_completed, progress_completed_at, enrollment_id, course_lecture_id || user_course_progress_id || ДА (дел од примарен клуч) || '''ДА''' ||
    384 || FD18: user_email → user_id || user_email || НЕ || Не ||
    385 || FD19: account_id → account_email, account_password_hash, account_name || account_id || НЕ (транзитивно преку expert_id и user_id) || Не директно ||
    386 || FD20: (course_id, version_number) → course_version_id || course_id, version_number || НЕ || Не ||
    387 || FD21: (course_id, language_id) → course_translate_id || course_id, language_id || НЕ || Не ||
    388 || FD22: (course_lecture_id, language_id) → course_lecture_translate_id || course_lecture_id, language_id || НЕ || Не ||
    389 || FD23: (course_content_id, language_id) → course_content_translate_id || course_content_id, language_id || НЕ || Не ||
    390 || FD24: (tag_id, language_id) → tag_translate_id || tag_id, language_id || НЕ || Не ||
    391 || FD25: (enrollment_id, course_lecture_id) → user_course_progress_id || enrollment_id, course_lecture_id || НЕ || Не ||
    392 || FD26: (course_version_id, content_position) → course_content_id || course_version_id, content_position || НЕ || Не ||
    393 || FD27: (course_content_id, lecture_position) → course_lecture_id || course_content_id, lecture_position || НЕ || Не ||
    394 || FD30: account_email → account_id || account_email || НЕ || Не ||
    395 || FD31: language_id → language_value || language_id || НЕ (транзитивно преку course_translate_id) || Не директно ||
    396 || FD32: language_value → language_id || language_value || НЕ || Не ||
    397 || FD33: meeting_link → meeting_reminder_id || meeting_link || НЕ || Не ||
     379|| FD18: account_id → account_email, account_password_hash, account_name || account_id || НЕ (транзитивно преку expert_id и user_id) || Не директно ||
     380|| FD19: (course_id, version_number) → course_version_id || course_id, version_number || НЕ || Не ||
     381|| FD20: (course_id, language_id) → course_translate_id || course_id, language_id || НЕ || Не ||
     382|| FD21: (course_lecture_id, language_id) → course_lecture_translate_id || course_lecture_id, language_id || НЕ || Не ||
     383|| FD22: (course_content_id, language_id) → course_content_translate_id || course_content_id, language_id || НЕ || Не ||
     384|| FD23: (tag_id, language_id) → tag_translate_id || tag_id, language_id || НЕ || Не ||
     385|| FD24: (enrollment_id, course_lecture_id) → user_course_progress_id || enrollment_id, course_lecture_id || НЕ || Не ||
     386|| FD25: (course_version_id, content_position) → course_content_id || course_version_id, content_position || НЕ || Не ||
     387|| 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 || НЕ || Не ||
    398392
    399393'''Заклучок:''' Релацијата не е во 2NF бидејќи има парцијални зависности. Атрибутите на '''FD2, FD3, FD4, FD10, FD12, FD14, FD16, FD17''' зависат само од дел од примарниот клуч, а не од целиот клуч.
     
    429423Universal_Relation_Shifter_Base_1(
    430424account_id, account_email, account_password_hash, account_name,
    431 user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
     425user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
    432426meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link,
    433427expert_id,
     
    468462Universal_Relation_Shifter_Base_2(
    469463account_id, account_email, account_password_hash, account_name,
    470 user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
     464user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
    471465expert_id,
    472466language_id, language_value,
     
    490484'''Проверка за lossless join:''' Може да се реконструира преку user_id
    491485 
    492 '''Проверка за dependency preservation:''' FD3 и FD33 се зачувани во Meeting_Reminder
     486'''Проверка за dependency preservation:''' FD3 и FD32 се зачувани во Meeting_Reminder
    493487
    494488=== Чекор 5.3: Декомпозиција по FD4 (expert_id → ...) ===
     
    506500Universal_Relation_Shifter_Base_3(
    507501account_id, account_email, account_password_hash, account_name,
    508 user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
     502user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
    509503language_id, language_value,
    510504course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     
    543537Universal_Relation_Shifter_Base_4(
    544538account_id, account_email, account_password_hash, account_name,
    545 user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
     539user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
    546540language_id, language_value,
    547541course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     
    579573Universal_Relation_Shifter_Base_5(
    580574account_id, account_email, account_password_hash, account_name,
    581 user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
     575user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
    582576language_id, language_value,
    583577course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     
    614608Universal_Relation_Shifter_Base_6(
    615609account_id, account_email, account_password_hash, account_name,
    616 user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
     610user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
    617611language_id, language_value,
    618612course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     
    648642Universal_Relation_Shifter_Base_7(
    649643account_id, account_email, account_password_hash, account_name,
    650 user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
     644user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
    651645language_id, language_value,
    652646course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     
    681675Universal_Relation_Shifter_Base_8(
    682676account_id, account_email, account_password_hash, account_name,
    683 user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
     677user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
    684678language_id, language_value,
    685679course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     
    734728Universal_Relation_Shifter_Base_8(
    735729account_id, account_email, account_password_hash, account_name,
    736 user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
     730user_id, user_login_provider, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points,
    737731language_id, language_value,
    738732course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     
    833827
    834828'''Заклучок:''' После извлекување на сите парцијални зависности (FD2, FD3, FD4, FD10, FD12, FD14, FD16, FD17), универзалната релација е целосно декомпонирана. Примарниот клуч на Universal_Relation_Shifter_Base_8 е празно множество (∅), што значи дека таа релација повеќе не постои како валидна релација.
    835 Останатите функционални зависности (FD1, FD5-FD9, FD11, FD13, FD15, FD19, FD31) **нарушуваат 3NF** бидејќи нивните детерминанти (user_id, course_id, enrollment_id, account_id, language_id, итн.) не се примарни клучеви на
     829Останатите функционални зависности (FD1, FD5-FD9, FD11, FD13, FD15, FD18, FD30) **нарушуваат 3NF** бидејќи нивните детерминанти (user_id, course_id, enrollment_id, account_id, language_id, итн.) не се примарни клучеви на
    836830Universal_Relation_Shifter_Base_8, туку се независни детерминанти кои треба да формираат посебни релации.
    837831
     
    839833
    840834{{{
    841 User(user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points, account_id)
     835User(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, account_id)
    842836   PK: user_id
    843837
    844 Universal_Relation_Shifter_Base_9 = Universal_Relation_Shifter_Base_8 - {user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points}
     838Universal_Relation_Shifter_Base_9 = Universal_Relation_Shifter_Base_8 - {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}
    845839
    846840Universal_Relation_Shifter_Base_9(
     
    860854'''Проверка за lossless join:''' Може да се реконструира преку enrollment_id
    861855 
    862 '''Проверка за dependency preservation:''' FD1 и FD18 се зачувани во User
     856'''Проверка за dependency preservation:''' FD1 е зачувана во User
    863857
    864858=== Чекор 6.2: Декомпозиција по FD5 (course_id → course_*) ===
     
    1002996'''Проверка за lossless join:''' Може да се реконструира преку enrollment_id
    1003997 
    1004 '''Проверка за dependency preservation:''' FD11 и FD20 се зачувани во Course_Version
     998'''Проверка за dependency preservation:''' FD11 и FD19 се зачувани во Course_Version
    1005999
    10061000=== Чекор 6.8: Декомпозиција по FD13 (course_content_id → course_content_*) ===
     
    10231017'''Проверка за lossless join:''' Може да се реконструира преку enrollment_id → course_version_id
    10241018 
    1025 '''Проверка за dependency preservation:''' FD13 и FD26 се зачувани во Course_Content
     1019'''Проверка за dependency preservation:''' FD13 и FD25 се зачувани во Course_Content
    10261020
    10271021=== Чекор 6.9: Декомпозиција по FD15 (course_lecture_id → course_lecture_*) ===
     
    10431037'''Проверка за lossless join:''' Може да се реконструира преку enrollment_id → course_version_id → course_content_id
    10441038 
    1045 '''Проверка за dependency preservation:''' FD15 и FD27 се зачувани во Course_Lecture
    1046 
    1047 === Чекор 6.10: Декомпозиција по FD19 (account_id → account_*) ===
     1039'''Проверка за dependency preservation:''' FD15 и FD26 се зачувани во Course_Lecture
     1040
     1041=== Чекор 6.10: Декомпозиција по FD18 (account_id → account_*) ===
    10481042
    10491043{{{
     
    10621056'''Проверка за lossless join:''' Може да се реконструира преку account_id во User и Expert
    10631057 
    1064 '''Проверка за dependency preservation:''' FD19 и FD30 се зачувани во Account
    1065 
    1066 === Чекор 6.11: Декомпозиција по FD31 (language_id → language_value) ===
     1058'''Проверка за dependency preservation:''' FD18 и FD29 се зачувани во Account
     1059
     1060=== Чекор 6.11: Декомпозиција по FD30 (language_id → language_value) ===
    10671061
    10681062{{{
     
    10801074'''Проверка за lossless join:''' Може да се реконструира преку language_id во релациите за преводи
    10811075 
    1082 '''Проверка за dependency preservation:''' FD31 и FD32 се зачувани во Language
     1076'''Проверка за dependency preservation:''' FD30 и FD31 се зачувани во Language
    10831077
    10841078=== Анализа на Universal_Relation_Shifter_Base_19 ===
     
    10981092
    10991093'''Заклучок од 3NF:'''
    1100 Сите функционални зависности (FD1-FD33) се организирани во релации кои се во 3NF. Universal_Relation_Shifter_Base_19 повеќе не постои како валидна релација.
     1094Сите функционални зависности (FD1-FD32) се организирани во релации кои се во 3NF. Universal_Relation_Shifter_Base_19 повеќе не постои како валидна релација.
    11011095
    11021096'''Останати врски (many-to-many):'''
     
    11301124||= Релација =||= Атрибути =||= Примарен клуч =||
    11311125|| Account || account_id, account_email, account_password_hash, account_name || account_id ||
    1132 || User || user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points, account_id || user_id ||
     1126|| User || 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, account_id || user_id ||
    11331127|| Language || language_id, language_value || language_id ||
    11341128|| Course || course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price || course_id ||
     
    13131307  - Надворешни клучеви: -
    13141308
    1315 User(user_id, user_name, user_email, user_login_provider, user_password_hash, user_is_verified, user_is_profile_complete, user_has_used_free_consultation, user_company_size, user_work_position, user_points, account_id)
     1309User(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, account_id)
    13161310  - Примарен клуч: user_id
    1317   - Кандидат клучеви: user_id, user_email, account_id
     1311  - Кандидат клучеви: user_id, account_id
    13181312  - Надворешни клучеви: account_id
    13191313
     
    14291423Следниве релации се '''целосно идентични''' со оние од концептуалниот ER модел:
    14301424
    1431  1. '''User''' - идентична структура и атрибути
    1432  2. '''Course''' - идентична структура и атрибути
    1433  3. '''Course_Version''' - идентична структура и атрибути
    1434  4. '''Enrollment''' - идентична структура и атрибути
    1435  5. '''Payment''' - идентична структура и атрибути (one-to-one со Enrollment)
    1436  6. '''Review''' - идентична структура и атрибути (one-to-one со Enrollment)
    1437  7. '''Tag''' - идентична структура и атрибути
    1438  8. '''Course_Translate''' - идентична структура и атрибути
    1439  9. '''Course_Content''' - идентична структура и атрибути
    1440  10. '''Course_Content_Translate''' - идентична структура и атрибути
    1441  11. '''Course_Lecture''' - идентична структура и атрибути
    1442  12. '''Course_Lecture_Translate''' - идентична структура и атрибути
    1443  13. '''Tag_Translate''' - идентична структура и атрибути
    1444  14. '''Verification_Token''' - идентична структура и атрибути
    1445  15. '''Meeting_Reminder''' - идентична структура и атрибути
    1446  16. '''User_Course_Progress''' - идентична структура и атрибути
     1425 1. '''Course''' - идентична структура и атрибути
     1426 2. '''Course_Version''' - идентична структура и атрибути
     1427 3. '''Enrollment''' - идентична структура и атрибути
     1428 4. '''Payment''' - идентична структура и атрибути (one-to-one со Enrollment)
     1429 5. '''Review''' - идентична структура и атрибути (one-to-one со Enrollment)
     1430 6. '''Tag''' - идентична структура и атрибути
     1431 7. '''Course_Translate''' - идентична структура и атрибути
     1432 8. '''Course_Content''' - идентична структура и атрибути
     1433 9. '''Course_Content_Translate''' - идентична структура и атрибути
     1434 10. '''Course_Lecture''' - идентична структура и атрибути
     1435 11. '''Course_Lecture_Translate''' - идентична структура и атрибути
     1436 12. '''Tag_Translate''' - идентична структура и атрибути
     1437 13. '''Verification_Token''' - идентична структура и атрибути
     1438 14. '''Meeting_Reminder''' - идентична структура и атрибути
     1439 15. '''User_Course_Progress''' - идентична структура и атрибути
    14471440
    14481441==== Релации кои се разликуваат од P2 ====
    14491442
    1450  17. '''Account''' - нова релација која не постоеше во концептуалниот модел. Атрибутите за најава (email, password_hash, name) беа дуплирани во User и Expert, па се издвоени во заеднички ентитет.
     1443 16. '''Account''' - нова релација која не постоеше во концептуалниот модел. Атрибутите за најава (email, password_hash, name) беа дуплирани во User и Expert, па се издвоени во заеднички ентитет.
     1444 17. '''User''' - се разликува од P2. Атрибутите user_name, user_email и user_password_hash преминаа во Account, па User останува со атрибутите на профилот и надворешниот клуч account_id.
    14511445 18. '''Expert''' - се разликува од P2. Атрибутите expert_name, expert_email, expert_login_provider и expert_password_hash преминаа во Account, па Expert останува само со expert_id и надворешниот клуч account_id.
    14521446 19. '''Language''' - нова релација која не постоеше во концептуалниот модел. Јазикот беше текстуален атрибут во четирите релации за преводи, а сега е самостоен ентитет со надворешни клучеви language_id.
     
    14651459==== Клучни наоди ====
    14661460
    1467  1. '''Процесот на нормализација го потврди најголемиот дел од дизајнот''' - секоја декомпозиција базирана на функционалните зависности резултираше со релација која одговара на ентитет од оригиналниот модел, освен во три случаи: Account, Language и намалениот Expert.
     1461 1. '''Процесот на нормализација го потврди најголемиот дел од дизајнот''' - секоја декомпозиција базирана на функционалните зависности резултираше со релација која одговара на ентитет од оригиналниот модел, освен во четири случаи: Account, Language и намалените User и Expert.
    14681462
    14691463 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}. Овој клуч беше идентификуван преку анализа на функционалните зависности и класификација лева/десна страна на атрибутите.
     
    14711465 3. '''Декомпозицијата е lossless''' - на секој чекор од процесот на нормализација, оригиналната информација може да се реконструира преку JOIN операции на заедничките атрибути (foreign keys).
    14721466
    1473  4. '''Сите функционални зависности се зачувани''' - сите 33 функционални зависности (FD1-FD33) се зачувани во соодветните релации, што значи дека ограничувањата можат да се проверуваат без потреба од скапи JOIN операции.
     1467 4. '''Сите функционални зависности се зачувани''' - сите 32 функционални зависности (FD1-FD32) се зачувани во соодветните релации, што значи дека ограничувањата можат да се проверуваат без потреба од скапи JOIN операции.
    14741468
    14751469 5. '''Many-to-many релации''' - junction tables (Expert_Course, Course_Tag, User_Tag) не произлегуваат од функционални зависности, туку од ER моделот и бизнис логиката. Овие релации немаат свои атрибути освен composite primary key од два foreign keys.
     
    14791473Процесот на нормализација '''го потврди најголемиот дел од дизајнот''' од концептуалната фаза (P2). Ова покажува дека оригиналниот ER модел беше во голема мера креиран според принципите на добра база на податоци (минимална редундантност, јасна сепарација на концепти, правилна идентификација на ентитети и релации).
    14801474
    1481 '''Финалниот релационен модел се разликува од моделот од Фаза P2 во три релации: Account, Language и Expert'''.
     1475'''Финалниот релационен модел се разликува од моделот од Фаза P2 во четири релации: Account, User, Expert и Language'''.