| 629 | | R1(productId, product_name, product_description, product_sku, product_unit_price, product_reorder_level, categoryId, supplierId) |
| 630 | | PK: productId |
| 631 | | |
| 632 | | R2(saleId, sale_date_time, sale_total_amount, userId, customerId, warehouseId) |
| 633 | | PK: saleId |
| 634 | | |
| 635 | | R3(poId, po_order_date, po_expected_delivery_date, po_status, supplierId, warehouseId) |
| 636 | | PK: poId |
| 637 | | |
| 638 | | R4(saleId, productId, saleitem_quantity, saleitem_unit_price_at_sale) |
| 639 | | PK: {saleId, productId} |
| 640 | | |
| 641 | | R5(poId, productId, poitem_quantity, poitem_unit_cost) |
| 642 | | PK: {poId, productId} |
| 643 | | |
| 644 | | U5(saleId, poId, productId, userId, user_username, user_password, user_full_name, user_email, user_role, user_is_active, |
| 645 | | customerId, customer_name, customer_email, customer_phone, customer_address, |
| 646 | | categoryId, category_name, category_description, |
| 647 | | supplierId, supplier_name, supplier_contact_person, supplier_phone, supplier_email, supplier_address, |
| 648 | | warehouseId, warehouse_name, warehouse_location, warehouse_capacity, |
| 649 | | stock_quantity_on_hand, stock_last_updated) |
| 650 | | PK: {saleId, poId, productId} |
| | 629 | Verification_Token(verification_token_uuid, token_created_at, token_expired_at, user_id) |
| | 630 | PK: verification_token_uuid |
| | 631 | |
| | 632 | Meeting_Reminder(meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id) |
| | 633 | PK: meeting_reminder_id |
| | 634 | |
| | 635 | Expert(expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash) |
| | 636 | PK: expert_id |
| | 637 | |
| | 638 | Tag_Translate(tag_translate_id, tag_translate_language, tag_value, tag_id) |
| | 639 | PK: tag_translate_id |
| | 640 | |
| | 641 | Course_Translate(course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long, course_id) |
| | 642 | PK: course_translate_id |
| | 643 | |
| | 644 | Course_Content_Translate(course_content_translate_id, content_translate_title, content_translate_language, course_content_id) |
| | 645 | PK: course_content_translate_id |
| | 646 | |
| | 647 | Course_Lecture_Translate(course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, course_lecture_id) |
| | 648 | PK: course_lecture_translate_id |
| | 649 | |
| | 650 | User_Course_Progress(user_course_progress_id, progress_completed, progress_completed_at, enrollment_id, course_lecture_id) |
| | 651 | PK: user_course_progress_id |
| | 652 | |
| | 653 | Universal_Relation_Shifter_Base_8( |
| | 654 | user_id, user_name, user_email, user_login_provider, user_password_hash, user_verified, user_profile_complete, user_used_free_consultation, user_company_size, user_work_position, user_points, |
| | 655 | expert_id, |
| | 656 | course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price, |
| | 657 | course_version_id, version_number, version_creation_date, version_active, |
| | 658 | enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date, |
| | 659 | payment_id, payment_amount, payment_date, payment_method, payment_status, |
| | 660 | review_id, review_rating, review_comment, review_date, |
| | 661 | course_content_id, content_position, |
| | 662 | course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type, |
| | 663 | tag_id, tag_type |
| | 664 | ) |
| | 665 | PK: ∅ |
| 672 | | * saleId → userId → user_*? |
| 673 | | * user_* атрибутите НЕ се во R2. |
| 674 | | * saleId → customerId → customer_*? |
| 675 | | * customer_* атрибутите НЕ се во R2. |
| 676 | | * saleId → warehouseId → warehouse_*? |
| 677 | | * warehouse_* атрибутите НЕ се во R2. |
| 678 | | |
| 679 | | '''Заклучок:''' R2 е во 3NF ✓ |
| 680 | | |
| 681 | | ==== R3(poId, po_order_date, po_expected_delivery_date, po_status, supplierId, warehouseId) ==== |
| 682 | | |
| 683 | | '''Транзитивни зависности:''' |
| 684 | | * Слично како R2, supplier_* и warehouse_* не се во R3. |
| 685 | | |
| 686 | | '''Заклучок:''' R3 е во 3NF ✓ |
| 687 | | |
| 688 | | ==== R4(saleId, productId, saleitem_quantity, saleitem_unit_price_at_sale) ==== |
| | 685 | * meeting_reminder_id → userId → user_*? |
| | 686 | * user_* атрибутите НЕ се во Meeting_Reminder. |
| | 687 | |
| | 688 | '''Заклучок:''' Meeting_Reminder е во 3NF ✓ |
| | 689 | |
| | 690 | ==== Expert(expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash) ==== |
| 693 | | '''Заклучок:''' R4 е во 3NF ✓ |
| 694 | | |
| 695 | | ==== R5(poId, productId, poitem_quantity, poitem_unit_cost) ==== |
| 696 | | |
| 697 | | '''Заклучок:''' R5 е во 3NF ✓ |
| 698 | | |
| 699 | | ==== U5 - Проверка за транзитивни зависности ==== |
| 700 | | |
| 701 | | Примарен клуч на U5: '''{saleId, poId, productId}''' |
| | 695 | '''Заклучок:''' Expert е во 3NF ✓ |
| | 696 | |
| | 697 | ==== Tag_Translate(tag_translate_id, tag_translate_language, tag_value, tag_id) ==== |
| | 698 | |
| | 699 | '''Транзитивни зависности:''' |
| | 700 | * tag_translate_id → tag_id → tag_*? |
| | 701 | * tag_* атрибутите НЕ се во Tag_Translate. |
| | 702 | |
| | 703 | '''Заклучок:''' Tag_Translate е во 3NF ✓ |
| | 704 | |
| | 705 | ==== Course_Translate(course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long, course_id) ==== |
| | 706 | |
| | 707 | '''Транзитивни зависности:''' |
| | 708 | * course_translate_id → course_id → course_*? |
| | 709 | * course_* атрибутите НЕ се во Course_Translate. |
| | 710 | |
| | 711 | '''Заклучок:''' Course_Translate е во 3NF ✓ |
| | 712 | |
| | 713 | ==== Course_Content_Translate(course_content_translate_id, content_translate_title, content_translate_language, course_content_id) ==== |
| | 714 | |
| | 715 | '''Транзитивни зависности:''' |
| | 716 | * course_content_translate_id → course_content_id → course_content_*? |
| | 717 | * course_content_* атрибутите НЕ се во Course_Content_Translate. |
| | 718 | |
| | 719 | '''Заклучок:''' Course_Content_Translate е во 3NF ✓ |
| | 720 | |
| | 721 | ==== Course_Lecture_Translate(course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, course_lecture_id) ==== |
| | 722 | |
| | 723 | '''Транзитивни зависности:''' |
| | 724 | * course_lecture_translate_id → course_lecture_id → course_lecture_*? |
| | 725 | * course_lecture_* атрибутите НЕ се во Course_Lecture_Translate. |
| | 726 | |
| | 727 | '''Заклучок:''' Course_Lecture_Translate е во 3NF ✓ |
| | 728 | |
| | 729 | ==== User_Course_Progress(user_course_progress_id, progress_completed, progress_completed_at, enrollment_id, course_lecture_id) ==== |
| | 730 | |
| | 731 | '''Транзитивни зависности:''' |
| | 732 | * user_course_progress_id → enrollment_id → enrollment_*? |
| | 733 | * enrollment_* атрибутите НЕ се во User_Course_Progress. |
| | 734 | * user_course_progress_id → course_lecture_id → course_lecture_*? |
| | 735 | * course_lecture_* атрибутите НЕ се во User_Course_Progress. |
| | 736 | |
| | 737 | '''Заклучок:''' User_Course_Progress е во 3NF ✓ |
| | 738 | |
| | 739 | ==== Universal_Relation_Shifter_Base_8 - Проверка за транзитивни зависности ==== |
| | 740 | |
| | 741 | Примарен клуч на Universal_Relation_Shifter_Base_8: '''{saleId, poId, productId}''' |