Changes between Version 23 and Version 24 of Normalization
- Timestamp:
- 08/07/26 16:04:13 (24 hours ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Normalization
v23 v24 7 7 {{{ 8 8 Universal_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,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, 10 10 meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, 11 11 expert_id, … … 62 62 * '''FD26:''' (course_content_id, lecture_position) → course_lecture_id 63 63 * '''FD27:''' (course_translate_id, course_what_will_be_learned) → ∅ 64 * '''FD28:''' (user_id , user_favorite_course_ids) → ∅65 * '''FD2 9:''' account_email → account_id66 * '''FD 30:''' language_id → language_value67 * '''FD3 1:''' language_value → language_id68 * '''FD3 2:''' meeting_link → meeting_reminder_id64 * '''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 69 69 '''}''' 70 70 … … 80 80 81 81 ||= Атрибут =||= Лева страна =||= Десна страна =||= Класификација =|| 82 || account_id || ✓ (FD18) || ✓ (FD1, FD4, FD2 9) || и лево и десно ||83 || account_email || ✓ (FD2 9) || ✓ (FD18) || и лево и десно ||82 || account_id || ✓ (FD18) || ✓ (FD1, FD4, FD28) || и лево и десно || 83 || account_email || ✓ (FD28) || ✓ (FD18) || и лево и десно || 84 84 || account_password_hash || ✗ || ✓ (FD18) || десно || 85 85 || account_name || ✗ || ✓ (FD18) || десно || 86 || user_id || ✓ (FD1 , FD28) || ✓ (FD2, FD3, FD6) || и лево и десно ||86 || user_id || ✓ (FD1) || ✓ (FD2, FD3, FD6) || и лево и десно || 87 87 || user_login_provider || ✗ || ✓ (FD1) || десно || 88 88 || user_is_verified || ✗ || ✓ (FD1) || десно || … … 92 92 || user_work_position || ✗ || ✓ (FD1) || десно || 93 93 || user_points || ✗ || ✓ (FD1) || десно || 94 || user_favorite_course_ids || ✓ (FD28) || ✗ || лево ||95 94 || verification_token_uuid || ✓ (FD2) || ✗ || лево || 96 95 || token_created_at || ✗ || ✓ (FD2) || десно || 97 96 || token_expires_at || ✗ || ✓ (FD2) || десно || 98 || meeting_reminder_id || ✓ (FD3) || ✓ (FD3 2) || и лево и десно ||97 || meeting_reminder_id || ✓ (FD3) || ✓ (FD31) || и лево и десно || 99 98 || meeting_at || ✗ || ✓ (FD3) || десно || 100 99 || meeting_scheduled_at || ✗ || ✓ (FD3) || десно || 101 100 || meeting_sent || ✗ || ✓ (FD3) || десно || 102 || meeting_link || ✓ (FD3 2) || ✓ (FD3) || и лево и десно ||101 || meeting_link || ✓ (FD31) || ✓ (FD3) || и лево и десно || 103 102 || expert_id || ✓ (FD4) || ✗ || лево || 104 || language_id || ✓ (FD20, FD21, FD22, FD23, FD 30) || ✓ (FD10, FD12, FD14, FD16, FD31) || и лево и десно ||105 || language_value || ✓ (FD3 1) || ✓ (FD30) || и лево и десно ||103 || language_id || ✓ (FD20, FD21, FD22, FD23, FD29) || ✓ (FD10, FD12, FD14, FD16, FD30) || и лево и десно || 104 || language_value || ✓ (FD30) || ✓ (FD29) || и лево и десно || 106 105 || course_id || ✓ (FD5, FD19, FD20) || ✓ (FD11, FD12) || и лево и десно || 107 106 || course_image_url || ✗ || ✓ (FD5) || десно || … … 159 158 160 159 * '''verification_token_uuid''' - мора да биде дел од секој кандидат клуч 161 * '''meeting_reminder_id''' - мора да биде дел од секој кандидат клуч (или meeting_link, FD3 2)160 * '''meeting_reminder_id''' - мора да биде дел од секој кандидат клуч (или meeting_link, FD31) 162 161 * '''expert_id''' - мора да биде дел од секој кандидат клуч 163 162 * '''course_what_will_be_learned''' - мора да биде дел од секој кандидат клуч 164 * '''user_favorite_course_ids''' - мора да биде дел од секој кандидат клуч165 163 166 164 === 3.4 Пресметка на затворач === 167 165 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}⁺: 172 170 - Од FD2 (verification_token_uuid →): добиваме token_created_at, token_expires_at, user_id 173 171 - Од FD3 (meeting_reminder_id →): добиваме meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id … … 175 173 - Од FD4 (expert_id →): добиваме account_id 176 174 - Од FD18 (account_id →): добиваме account_email, account_password_hash, account_name 177 - Од FD2 9(account_email →): добиваме account_id178 }}} 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''' 181 179 182 180 '''Недостасуваат:''' … … 199 197 200 198 {{{ 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}⁺: 202 200 - Сè од претходно, плус: 203 201 - Од FD17 (user_course_progress_id →): добиваме progress_is_completed, progress_completed_at, enrollment_id, course_lecture_id … … 211 209 }}} 212 210 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''' 214 212 215 213 '''Недостасуваат:''' … … 224 222 225 223 {{{ 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}⁺: 227 225 - Сè од претходно, плус: 228 226 - Од FD16 (course_lecture_translate_id →): добиваме lecture_title, lecture_content_file_name, lecture_description, lecture_content_text, course_lecture_id, language_id … … 230 228 - Од FD12 (course_translate_id →): добиваме course_title_short, course_title, course_description_short, course_description, course_description_long, course_id, language_id 231 229 - Од FD10 (tag_translate_id →): добиваме tag_value, tag_id, language_id 232 - Од FD 30(language_id →): добиваме language_value230 - Од FD29 (language_id →): добиваме language_value 233 231 - Од FD9 (tag_id →): добиваме tag_type 234 232 - Од FD27 ({course_translate_id, course_what_will_be_learned} →): добиваме ∅ 235 233 }}} 236 234 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''' (ги содржи сите атрибути) ✓ 238 236 239 237 === 3.5 Проверка за минималност === 240 238 241 239 ||= Подмножество =||= Затворач =||= = 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} е минимален и е кандидат клуч. 252 250 253 251 === 3.6 Други кандидат клучеви === 254 252 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 (FD3 2). Го избирам 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 кој е текстуален атрибут. 258 256 259 257 === 3.7 Избор на примарен клуч === 260 258 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}''' 262 260 263 261 '''Образложение:''' … … 281 279 PK: {course_translate_id, course_what_will_be_learned} 282 280 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,281 Universal_Relation_Shifter_Base = Universal_Relation_Shifter - {course_what_will_be_learned} 282 283 Universal_Relation_Shifter_Base( 284 account_id, account_email, account_password_hash, account_name, 285 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, 288 286 meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, 289 287 expert_id, … … 304 302 tag_translate_id, tag_value 305 303 ) 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} 307 305 }}} 308 306 … … 310 308 311 309 '''Проверка за 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_value345 )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_id350 351 '''Проверка за dependency preservation:''' FD28 е зачувана во User_Favorite_Course352 353 310 354 311 === 4.3 Проверка која FD ја нарушува 2NF === … … 386 343 || FD25: (course_version_id, content_position) → course_content_id || course_version_id, content_position || НЕ || Не || 387 344 || FD26: (course_content_id, lecture_position) → course_lecture_id || course_content_id, lecture_position || НЕ || Не || 388 || FD2 9: account_email → account_id || account_email || НЕ || Не ||389 || FD 30: language_id → language_value || language_id || НЕ (транзитивно преку course_translate_id) || Не директно ||390 || FD3 1: language_value → language_id || language_value || НЕ || Не ||391 || FD3 2: 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 || НЕ || Не || 392 349 393 350 '''Заклучок:''' Релацијата не е во 2NF бидејќи има парцијални зависности. Атрибутите на '''FD2, FD3, FD4, FD10, FD12, FD14, FD16, FD17''' зависат само од дел од примарниот клуч, а не од целиот клуч. … … 484 441 '''Проверка за lossless join:''' Може да се реконструира преку user_id 485 442 486 '''Проверка за dependency preservation:''' FD3 и FD3 2се зачувани во Meeting_Reminder443 '''Проверка за dependency preservation:''' FD3 и FD31 се зачувани во Meeting_Reminder 487 444 488 445 === Чекор 5.3: Декомпозиција по FD4 (expert_id → ...) === … … 827 784 828 785 '''Заклучок:''' После извлекување на сите парцијални зависности (FD2, FD3, FD4, FD10, FD12, FD14, FD16, FD17), универзалната релација е целосно декомпонирана. Примарниот клуч на Universal_Relation_Shifter_Base_8 е празно множество (∅), што значи дека таа релација повеќе не постои како валидна релација. 829 Останатите функционални зависности (FD1, FD5-FD9, FD11, FD13, FD15, FD18, FD 30) **нарушуваат 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, итн.) не се примарни клучеви на 830 787 Universal_Relation_Shifter_Base_8, туку се независни детерминанти кои треба да формираат посебни релации. 831 788 … … 1056 1013 '''Проверка за lossless join:''' Може да се реконструира преку account_id во User и Expert 1057 1014 1058 '''Проверка за dependency preservation:''' FD18 и FD2 9се зачувани во Account1059 1060 === Чекор 6.11: Декомпозиција по FD 30(language_id → language_value) ===1015 '''Проверка за dependency preservation:''' FD18 и FD28 се зачувани во Account 1016 1017 === Чекор 6.11: Декомпозиција по FD29 (language_id → language_value) === 1061 1018 1062 1019 {{{ … … 1074 1031 '''Проверка за lossless join:''' Може да се реконструира преку language_id во релациите за преводи 1075 1032 1076 '''Проверка за dependency preservation:''' FD 30 и FD31се зачувани во Language1033 '''Проверка за dependency preservation:''' FD29 и FD30 се зачувани во Language 1077 1034 1078 1035 === Анализа на Universal_Relation_Shifter_Base_19 === … … 1092 1049 1093 1050 '''Заклучок од 3NF:''' 1094 Сите функционални зависности (FD1-FD3 2) се организирани во релации кои се во 3NF. Universal_Relation_Shifter_Base_19 повеќе не постои како валидна релација.1051 Сите функционални зависности (FD1-FD31) се организирани во релации кои се во 3NF. Universal_Relation_Shifter_Base_19 повеќе не постои како валидна релација. 1095 1052 1096 1053 '''Останати врски (many-to-many):''' … … 1098 1055 1099 1056 * '''User_Tag'''(user_id, tag_id) - корисник има интереси 1057 * '''User_Favorite_Course'''(user_id, course_id) - корисник има омилени курсеви 1100 1058 * '''Course_Tag'''(course_id, tag_id) - курс има тагови 1101 1059 * '''Expert_Course'''(expert_id, course_id) - експерт предава курсеви … … 1105 1063 '''Релации креирани преку FD декомпозиција:''' 1106 1064 1107 '''1NF Декомпозиција ( 2 релации):'''1065 '''1NF Декомпозиција (1 релација):''' 1108 1066 ||= Релација =||= Атрибути =||= Примарен клуч =|| 1109 1067 || 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) ||1111 1068 1112 1069 '''2NF Декомпозиција (8 релации):''' … … 1138 1095 ||= Релација =||= Атрибути =||= Примарен клуч =||= Извор =|| 1139 1096 || 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 модел) || 1140 1098 || Course_Tag || course_id, tag_id || (course_id, tag_id) || Many-to-many (ER модел) || 1141 1099 || Expert_Course || expert_id, course_id || (expert_id, course_id) || Many-to-many (ER модел) || … … 1416 1374 1417 1375 Преку процесот на нормализација, тргнувајќи од една универзална релација, дојдовме до '''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). Споредбата со концептуалниот модел 1419 1377 од Фаза P2 покажува следно: 1420 1378 … … 1451 1409 21. '''Course_Tag''' - junction table за many-to-many релација помеѓу Course и Tag 1452 1410 22. '''User_Tag''' - junction table за many-to-many релација помеѓу User и Tag 1411 23. '''User_Favorite_Course''' - junction table за many-to-many релација помеѓу User и Course 1453 1412 1454 1413 ==== Релација со мултивредносен атрибут ==== 1455 1414 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" ставки). 1458 1416 1459 1417 ==== Клучни наоди ==== … … 1461 1419 1. '''Процесот на нормализација го потврди најголемиот дел од дизајнот''' - секоја декомпозиција базирана на функционалните зависности резултираше со релација која одговара на ентитет од оригиналниот модел, освен во четири случаи: Account, Language и намалените User и Expert. 1462 1420 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}. Овој клуч беше идентификуван преку анализа на функционалните зависности и класификација лева/десна страна на атрибутите. 1464 1422 1465 1423 3. '''Декомпозицијата е lossless''' - на секој чекор од процесот на нормализација, оригиналната информација може да се реконструира преку JOIN операции на заедничките атрибути (foreign keys). 1466 1424 1467 4. '''Сите функционални зависности се зачувани''' - сите 3 2 функционални зависности (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. 1470 1428 1471 1429 ==== Заклучок ====
