| 268 | | === 4.1 Проверка за 1NF === |
| 269 | | |
| 270 | | Универзалната релација U е во 1NF бидејќи: |
| 271 | | * Сите атрибути се атомски (нема повеќевредносни атрибути) |
| 272 | | * Постои примарен клуч: {saleId, poId, productId} |
| 273 | | * Нема повторувачки групи |
| 274 | | |
| 275 | | '''Заклучок:''' U е во 1NF. ✓ |
| | 268 | === Чекор 4.1: Декомпозиција на релацијата Universal_Relation_Shifter === |
| | 269 | |
| | 270 | '''Нарушува 1NF:'''Релацијата не е во 1NF бидејќи атрибутот course_what_will_be_learned претставува повеќевредносен (multi-valued) атрибут. Секој course_translate може да има повеќе ставки од course_what_will_be_learned. |
| | 271 | |
| | 272 | '''Декомпозиција:''' |
| | 273 | |
| | 274 | {{{ |
| | 275 | Course_What_Will_Be_Learned(course_translate_id, course_what_will_be_learned) |
| | 276 | PK: {course_translate_id, course_what_will_be_learned} |
| | 277 | |
| | 278 | Universal_Relation_Shifter_Base = Universal_Relation_Shifter - {course_what_will_be_learned} |
| | 279 | PK: {verification_token_uuid, meeting_reminder_id, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} |
| | 280 | |
| | 281 | '''Проверка за lossless join:''' Може да се реконструира преку course_translate_id |
| | 282 | '''Проверка за dependency preservation:''' ✓ Сите FD28 е зачувана во Course_What_Will_Be_Learned |
| | 283 | |
| 286 | | || FD1: userId → user_* || userId || НЕ (транзитивно преку saleId) || Не директно || |
| 287 | | || FD5: productId → product_*, categoryId, supplierId || productId || ДА (productId е дел од клучот) || '''ДА''' || |
| 288 | | || FD10: saleId → sale_*, userId, customerId, warehouseId || saleId || ДА (saleId е дел од клучот) || '''ДА''' || |
| 289 | | || FD11: poId → po_*, supplierId, warehouseId || poId || ДА (poId е дел од клучот) || '''ДА''' || |
| 290 | | || FD12: {saleId, productId} → saleitem_* || {saleId, productId} || ДА (подмножество на клучот) || '''ДА''' || |
| 291 | | || FD13: {poId, productId} → poitem_* || {poId, productId} || ДА (подмножество на клучот) || '''ДА''' || |
| 292 | | || FD14: {warehouseId, productId} → stock_* || {warehouseId, productId} || warehouseId не е во клучот директно || Посебен случај* || |
| 293 | | |
| 294 | | *Забелешка за FD14: warehouseId се добива транзитивно од saleId (FD10) и од poId (FD11), но {warehouseId, productId} не е подмножество на примарниот клуч. |
| | 293 | || FD1: user_id → user_* || user_id || НЕ (транзитивно преку user_course_progress_id) || Не директно || |
| | 294 | || FD2: verification_token_uuid → token_created_at, token_expired_at, user_id || verification_token_uuid || ДА (дел од примарен клуч) || '''ДА''' || |
| | 295 | || FD3: meeting_reminder_id → meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id || meeting_reminder_id || ДА (дел од примарен клуч) || '''ДА''' || |
| | 296 | || FD4: expert_id → expert_name, expert_email, expert_login_provider, expert_password_hash || expert_id || ДА (дел од примарен клуч) || '''ДА''' || |
| | 297 | || FD5: course_id → course_image_url, course_color, course_difficulty, course_duration_minutes, course_price || course_id || НЕ (транзитивно преку user_course_progress_id) || Не директно || |
| | 298 | || FD6: enrollment_id → enrollment_*, user_id, course_version_id, payment_id, review_id || enrollment_id || НЕ (транзитивно преку user_course_progress_id) || Не директно || |
| | 299 | || FD7: payment_id → payment_amount, payment_date, payment_method, payment_status, enrollment_id || payment_id || НЕ (транзитивно преку user_course_progress_id) || Не директно || |
| | 300 | || FD8: review_id → review_rating, review_comment, review_date, enrollment_id || review_id || НЕ (транзитивно преку user_course_progress_id) || Не директно || |
| | 301 | || FD9: tag_id → tag_type || tag_id || НЕ (транзитивно преку tag_translate_id) || Не директно || |
| | 302 | || FD10: tag_translate_id → tag_translate_language, tag_value, tag_id || tag_translate_id || ДА (дел од примарен клуч) || '''ДА''' || |
| | 303 | || FD11: course_version_id → version_number, version_creation_date, version_active, course_id || course_version_id || НЕ (транзитивно преку user_course_progress_id) || Не директно || |
| | 304 | || FD12: course_translate_id → course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long, course_id || course_translate_id || ДА (дел од примарен клуч) || '''ДА''' || |
| | 305 | || FD13: course_content_id → content_position, course_version_id || course_content_id || НЕ (транзитивно преку course_content_translate_id) || Не директно || |
| | 306 | || FD14: course_content_translate_id → content_translate_title, content_translate_language, course_content_id || course_content_translate_id || ДА (дел од примарен клуч) || '''ДА''' || |
| | 307 | || FD15: course_lecture_id → lecture_duration_minutes, lecture_position, lecture_content_type, course_content_id || course_lecture_id || НЕ (транзитивно преку course_lecture_translate_id) || Не директно || |
| | 308 | || FD16: course_lecture_translate_id → lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, course_lecture_id || course_lecture_translate_id || ДА (дел од примарен клуч) || '''ДА''' || |
| | 309 | || FD17: user_course_progress_id → progress_completed, progress_completed_at, enrollment_id, course_lecture_id || user_course_progress_id || ДА (дел од примарен клуч) || '''ДА''' || |
| | 310 | || FD18: user_email → user_id || user_email || НЕ || Не || |
| | 311 | || FD19: expert_email → expert_id || expert_email || НЕ || Не || |
| | 312 | || FD20: (course_id, version_number) → course_version_id || course_id, version_number || НЕ || Не || |
| | 313 | || FD21: (course_id, course_translate_language) → course_translate_id || course_id, course_translate_language || НЕ || Не || |
| | 314 | || FD22: (course_lecture_id, lecture_language) → course_lecture_translate_id || course_lecture_id, lecture_language || НЕ || Не || |
| | 315 | || FD23: (course_content_id, content_translate_language) → course_content_translate_id || course_content_id, content_translate_language || НЕ || Не || |
| | 316 | || FD24: (tag_id, tag_translate_language) → tag_translate_id || tag_id, tag_translate_language || НЕ || Не || |
| | 317 | || FD25: (enrollment_id, course_lecture_id) → user_course_progress_id || enrollment_id, course_lecture_id || НЕ || Не || |
| | 318 | || FD26: (course_version_id, content_position) → course_content_id || course_version_id, content_position || НЕ || Не || |
| | 319 | || FD27: (course_content_id, lecture_position) → course_lecture_id || course_content_id, lecture_position || НЕ || Не || |
| | 320 | |
| | 321 | '''Заклучок:''' Релацијата не е во 2NF бидејќи има парцијални зависности. Атрибутите на '''FD2, FD3, FD4, FD10, FD12, FD14, FD16, FD17''' зависат само од дел од примарниот клуч, а не од целиот клуч. |
| 298 | | 1. '''FD5:''' productId → product_name, product_description, product_sku, product_unit_price, product_reorder_level, categoryId, supplierId |
| 299 | | 2. '''FD10:''' saleId → sale_date_time, sale_total_amount, userId, customerId, warehouseId |
| 300 | | 3. '''FD11:''' poId → po_order_date, po_expected_delivery_date, po_status, supplierId, warehouseId |
| 301 | | 4. '''FD12:''' {saleId, productId} → saleitem_quantity, saleitem_unit_price_at_sale |
| 302 | | 5. '''FD13:''' {poId, productId} → poitem_quantity, poitem_unit_cost |
| | 325 | 1. '''FD2:''' verification_token_uuid → token_created_at, token_expired_at, user_id |
| | 326 | 2. '''FD3:''' meeting_reminder_id → meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id |
| | 327 | 3. '''FD4:''' expert_id → expert_name, expert_email, expert_login_provider, expert_password_hash |
| | 328 | 4. '''FD10:''' tag_translate_id → tag_translate_language, tag_value, tag_id |
| | 329 | 5. '''FD12:''' course_translate_id → course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long, course_id |
| | 330 | 6. '''FD14:''' course_content_translate_id → content_translate_title, content_translate_language, course_content_id |
| | 331 | 7. '''FD16:''' course_lecture_translate_id → lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, course_lecture_id |
| | 332 | |