| 366 | | R1(productId, product_name, product_description, product_sku, product_unit_price, product_reorder_level, categoryId, supplierId) |
| 367 | | PK: productId |
| 368 | | |
| 369 | | U1 = U - {product_name, product_description, product_sku, product_unit_price, product_reorder_level} |
| 370 | | |
| 371 | | U1(saleId, poId, productId, userId, user_username, user_password, user_full_name, user_email, user_role, user_is_active, customerId, customer_name, customer_email, customer_phone, customer_address, categoryId, category_name, category_description, supplierId, supplier_name, supplier_contact_person, supplier_phone, supplier_email, supplier_address, warehouseId, warehouse_name, warehouse_location, warehouse_capacity, sale_date_time, sale_total_amount, po_order_date, po_expected_delivery_date, po_status, saleitem_quantity, saleitem_unit_price_at_sale, poitem_quantity, poitem_unit_cost, stock_quantity_on_hand, stock_last_updated) |
| 372 | | }}} |
| 373 | | |
| 374 | | '''Проверка за lossless join:''' |
| 375 | | * R1 ∩ U1 = {productId, categoryId, supplierId} |
| 376 | | * productId → R1 (FD5) |
| 377 | | * Декомпозицијата е lossless ✓ |
| 378 | | |
| 379 | | '''Проверка за зачувување на FD:''' FD5 е зачувана во R1 ✓ |
| 380 | | |
| 381 | | === Чекор 5.2: Декомпозиција по FD10 (saleId → ...) === |
| 382 | | |
| 383 | | '''Нарушува 2NF:''' saleId е дел од примарниот клуч на U1. |
| | 367 | Verification_Token(verification_token_uuid, token_created_at, token_expired_at, user_id) |
| | 368 | PK: verification_token_uuid |
| | 369 | |
| | 370 | Universal_Relation_Shifter_Base_1 = Universal_Relation_Shifter_Base - {verification_token_uuid, token_created_at, token_expired_at} |
| | 371 | |
| | 372 | Universal_Relation_Shifter_Base_1( |
| | 373 | 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, |
| | 374 | meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, |
| | 375 | expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash, |
| | 376 | course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price, |
| | 377 | course_version_id, version_number, version_creation_date, version_active, |
| | 378 | enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date, |
| | 379 | payment_id, payment_amount, payment_date, payment_method, payment_status, |
| | 380 | review_id, review_rating, review_comment, review_date, |
| | 381 | course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long, |
| | 382 | course_content_id, content_position, |
| | 383 | course_content_translate_id, content_translate_title, content_translate_language, |
| | 384 | course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type, |
| | 385 | course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, |
| | 386 | user_course_progress_id, progress_completed, progress_completed_at, |
| | 387 | tag_id, tag_type, |
| | 388 | tag_translate_id, tag_translate_language, tag_value |
| | 389 | ) |
| | 390 | PK: {meeting_reminder_id, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} |
| | 391 | }}} |
| | 392 | |
| | 393 | '''Проверка за lossless join:''' Може да се реконструира преку user_id |
| | 394 | '''Проверка за dependency preservation:''' FD2 е зачувана во Verification_Token |
| | 395 | |
| | 396 | === Чекор 5.2: Декомпозиција по FD3 (meeting_reminder_id → ...) === |
| | 397 | |
| | 398 | '''Нарушува 2NF:''' meeting_reminder_id е дел од примарниот клуч, а meeting_at, meeting_scheduled_at, meeting_sent, meeting_link зависат само од meeting_reminder_id. |
| 388 | | R2(saleId, sale_date_time, sale_total_amount, userId, customerId, warehouseId) |
| 389 | | PK: saleId |
| 390 | | |
| 391 | | U2 = U1 - {sale_date_time, sale_total_amount} |
| 392 | | |
| 393 | | U2(saleId, poId, productId, userId, user_username, user_password, user_full_name, user_email, user_role, user_is_active, customerId, customer_name, customer_email, customer_phone, customer_address, categoryId, category_name, category_description, supplierId, supplier_name, supplier_contact_person, supplier_phone, supplier_email, supplier_address, warehouseId, warehouse_name, warehouse_location, warehouse_capacity, po_order_date, po_expected_delivery_date, po_status, saleitem_quantity, saleitem_unit_price_at_sale, poitem_quantity, poitem_unit_cost, stock_quantity_on_hand, stock_last_updated) |
| 394 | | }}} |
| 395 | | |
| 396 | | '''Проверка за lossless join:''' |
| 397 | | * R2 ∩ U2 = {saleId, userId, customerId, warehouseId} |
| 398 | | * saleId → R2 (FD10) |
| 399 | | * Декомпозицијата е lossless ✓ |
| 400 | | |
| 401 | | === Чекор 5.3: Декомпозиција по FD11 (poId → ...) === |
| 402 | | |
| 403 | | '''Нарушува 2NF:''' poId е дел од примарниот клуч на U2. |
| | 403 | Meeting_Reminder(meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id) |
| | 404 | PK: meeting_reminder_id |
| | 405 | |
| | 406 | Universal_Relation_Shifter_Base_2 = Universal_Relation_Shifter_Base_1 - {meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link} |
| | 407 | |
| | 408 | Universal_Relation_Shifter_Base_2( |
| | 409 | 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, |
| | 410 | expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash, |
| | 411 | course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price, |
| | 412 | course_version_id, version_number, version_creation_date, version_active, |
| | 413 | enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date, |
| | 414 | payment_id, payment_amount, payment_date, payment_method, payment_status, |
| | 415 | review_id, review_rating, review_comment, review_date, |
| | 416 | course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long, |
| | 417 | course_content_id, content_position, |
| | 418 | course_content_translate_id, content_translate_title, content_translate_language, |
| | 419 | course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type, |
| | 420 | course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, |
| | 421 | user_course_progress_id, progress_completed, progress_completed_at, |
| | 422 | tag_id, tag_type, |
| | 423 | tag_translate_id, tag_translate_language, tag_value |
| | 424 | ) |
| | 425 | PK: {user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} |
| | 426 | }}} |
| | 427 | |
| | 428 | '''Проверка за lossless join:''' Може да се реконструира преку user_id |
| | 429 | '''Проверка за dependency preservation:''' FD3 е зачувана во Meeting_Reminder |
| | 430 | |
| | 431 | === Чекор 5.3: Декомпозиција по FD4 (expert_id → ...) === |
| | 432 | |
| | 433 | '''Нарушува 2NF:''' expert_id е дел од примарниот клуч, а expert_name, expert_email, expert_login_provider, expert_password_hash зависат само од expert_id. |
| 408 | | R3(poId, po_order_date, po_expected_delivery_date, po_status, supplierId, warehouseId) |
| 409 | | PK: poId |
| 410 | | |
| 411 | | U3 = U2 - {po_order_date, po_expected_delivery_date, po_status} |
| 412 | | |
| 413 | | U3(saleId, poId, productId, userId, user_username, user_password, user_full_name, user_email, user_role, user_is_active, customerId, customer_name, customer_email, customer_phone, customer_address, categoryId, category_name, category_description, supplierId, supplier_name, supplier_contact_person, supplier_phone, supplier_email, supplier_address, warehouseId, warehouse_name, warehouse_location, warehouse_capacity, saleitem_quantity, saleitem_unit_price_at_sale, poitem_quantity, poitem_unit_cost, stock_quantity_on_hand, stock_last_updated) |
| 414 | | }}} |
| 415 | | |
| 416 | | '''Проверка за lossless join:''' |
| 417 | | * R3 ∩ U3 = {poId, supplierId, warehouseId} |
| 418 | | * poId → R3 (FD11) |
| 419 | | * Декомпозицијата е lossless ✓ |
| 420 | | |
| 421 | | === Чекор 5.4: Декомпозиција по FD12 ({saleId, productId} → ...) === |
| 422 | | |
| 423 | | '''Нарушува 2NF:''' {saleId, productId} е подмножество на примарниот клуч. |
| | 438 | Expert(expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash) |
| | 439 | PK: expert_id |
| | 440 | |
| | 441 | Universal_Relation_Shifter_Base_3 = Universal_Relation_Shifter_Base_2 - {expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash} |
| | 442 | |
| | 443 | Universal_Relation_Shifter_Base_3( |
| | 444 | 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, |
| | 445 | expert_id |
| | 446 | course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price, |
| | 447 | course_version_id, version_number, version_creation_date, version_active, |
| | 448 | enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date, |
| | 449 | payment_id, payment_amount, payment_date, payment_method, payment_status, |
| | 450 | review_id, review_rating, review_comment, review_date, |
| | 451 | course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long, |
| | 452 | course_content_id, content_position, |
| | 453 | course_content_translate_id, content_translate_title, content_translate_language, |
| | 454 | course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type, |
| | 455 | course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, |
| | 456 | user_course_progress_id, progress_completed, progress_completed_at, |
| | 457 | tag_id, tag_type, |
| | 458 | tag_translate_id, tag_translate_language, tag_value |
| | 459 | ) |
| | 460 | PK: {user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} |
| | 461 | }}} |
| | 462 | |
| | 463 | '''Проверка за lossless join:''' Може да се реконструира преку expert_id |
| | 464 | '''Проверка за dependency preservation:''' FD4 е зачувана во Expert |
| | 465 | |
| | 466 | === Чекор 5.4: Декомпозиција по FD10 (tag_translate_id → ...) === |
| | 467 | |
| | 468 | '''Нарушува 2NF:''' tag_translate_id е дел од примарниот клуч, а tag_translate_language, tag_value зависат само од tag_translate_id. |
| 428 | | R4(saleId, productId, saleitem_quantity, saleitem_unit_price_at_sale) |
| 429 | | PK: {saleId, productId} |
| 430 | | |
| 431 | | U4 = U3 - {saleitem_quantity, saleitem_unit_price_at_sale} |
| 432 | | |
| 433 | | U4(saleId, poId, productId, userId, user_username, user_password, user_full_name, user_email, user_role, user_is_active, customerId, customer_name, customer_email, customer_phone, customer_address, categoryId, category_name, category_description, supplierId, supplier_name, supplier_contact_person, supplier_phone, supplier_email, supplier_address, warehouseId, warehouse_name, warehouse_location, warehouse_capacity, poitem_quantity, poitem_unit_cost, stock_quantity_on_hand, stock_last_updated) |
| 434 | | }}} |
| 435 | | |
| 436 | | '''Проверка за lossless join:''' |
| 437 | | * R4 ∩ U4 = {saleId, productId} |
| 438 | | * {saleId, productId} → R4 (FD12) |
| 439 | | * Декомпозицијата е lossless ✓ |
| 440 | | |
| 441 | | === Чекор 5.5: Декомпозиција по FD13 ({poId, productId} → ...) === |
| 442 | | |
| 443 | | '''Нарушува 2NF:''' {poId, productId} е подмножество на примарниот клуч. |
| | 473 | Tag_Translate(tag_translate_id, tag_translate_language, tag_value, tag_id) |
| | 474 | PK: tag_translate_id |
| | 475 | |
| | 476 | Universal_Relation_Shifter_Base_4 = Universal_Relation_Shifter_Base_3 - {tag_translate_id, tag_translate_language, tag_value} |
| | 477 | |
| | 478 | Universal_Relation_Shifter_Base_4( |
| | 479 | 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, |
| | 480 | expert_id, |
| | 481 | course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price, |
| | 482 | course_version_id, version_number, version_creation_date, version_active, |
| | 483 | enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date, |
| | 484 | payment_id, payment_amount, payment_date, payment_method, payment_status, |
| | 485 | review_id, review_rating, review_comment, review_date, |
| | 486 | course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long, |
| | 487 | course_content_id, content_position, |
| | 488 | course_content_translate_id, content_translate_title, content_translate_language, |
| | 489 | course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type, |
| | 490 | course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, |
| | 491 | user_course_progress_id, progress_completed, progress_completed_at, |
| | 492 | tag_id, tag_type |
| | 493 | ) |
| | 494 | PK: {user_course_progress_id, course_lecture_translate_id, course_content_translate_id, course_translate_id} |
| | 495 | }}} |
| | 496 | |
| | 497 | '''Проверка за lossless join:''' Може да се реконструира преку tag_id |
| | 498 | '''Проверка за dependency preservation:''' FD10 е зачувана во Tag_Translate |
| | 499 | |
| | 500 | === Чекор 5.5: Декомпозиција по FD12 (course_translate_id → ...) === |
| | 501 | |
| | 502 | '''Нарушува 2NF:''' course_translate_id е дел од примарниот клуч, а course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long зависат само од course_translate_id. |
| 448 | | R5(poId, productId, poitem_quantity, poitem_unit_cost) |
| 449 | | PK: {poId, productId} |
| 450 | | |
| 451 | | U5 = U4 - {poitem_quantity, poitem_unit_cost} |
| 452 | | |
| 453 | | U5(saleId, poId, productId, userId, user_username, user_password, user_full_name, user_email, user_role, user_is_active, customerId, customer_name, customer_email, customer_phone, customer_address, categoryId, category_name, category_description, supplierId, supplier_name, supplier_contact_person, supplier_phone, supplier_email, supplier_address, warehouseId, warehouse_name, warehouse_location, warehouse_capacity, stock_quantity_on_hand, stock_last_updated) |
| 454 | | }}} |
| 455 | | |
| 456 | | '''Проверка за lossless join:''' |
| 457 | | * R5 ∩ U5 = {poId, productId} |
| 458 | | * {poId, productId} → R5 (FD13) |
| 459 | | * Декомпозицијата е lossless ✓ |
| | 507 | Course_Translate(course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long, course_id) |
| | 508 | PK: course_translate_id |
| | 509 | |
| | 510 | Universal_Relation_Shifter_Base_5 = Universal_Relation_Shifter_Base_4 - {course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long} |
| | 511 | |
| | 512 | Universal_Relation_Shifter_Base_5( |
| | 513 | 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, |
| | 514 | expert_id, |
| | 515 | course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price, |
| | 516 | course_version_id, version_number, version_creation_date, version_active, |
| | 517 | enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date, |
| | 518 | payment_id, payment_amount, payment_date, payment_method, payment_status, |
| | 519 | review_id, review_rating, review_comment, review_date, |
| | 520 | course_content_id, content_position, |
| | 521 | course_content_translate_id, content_translate_title, content_translate_language, |
| | 522 | course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type, |
| | 523 | course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, |
| | 524 | user_course_progress_id, progress_completed, progress_completed_at, |
| | 525 | tag_id, tag_type |
| | 526 | ) |
| | 527 | PK: {user_course_progress_id, course_lecture_translate_id, course_content_translate_id} |
| | 528 | }}} |
| | 529 | |
| | 530 | '''Проверка за lossless join:''' Може да се реконструира преку course_id |
| | 531 | '''Проверка за dependency preservation:''' FD12 е зачувана во Course_Translate |
| | 532 | |
| | 533 | === Чекор 5.6: Декомпозиција по FD14 (course_content_translate_id → ...) === |
| | 534 | |
| | 535 | '''Нарушува 2NF:''' course_content_translate_id е дел од примарниот клуч, а content_translate_title, content_translate_language зависат само од course_content_translate_id. |
| | 536 | |
| | 537 | '''Декомпозиција:''' |
| | 538 | |
| | 539 | {{{ |
| | 540 | Course_Content_Translate(course_content_translate_id, content_translate_title, content_translate_language, course_content_id) |
| | 541 | PK: course_content_translate_id |
| | 542 | |
| | 543 | Universal_Relation_Shifter_Base_6 = Universal_Relation_Shifter_Base_5 - {course_content_translate_id, content_translate_title, content_translate_language} |
| | 544 | |
| | 545 | Universal_Relation_Shifter_Base_6( |
| | 546 | 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, |
| | 547 | expert_id, |
| | 548 | course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price, |
| | 549 | course_version_id, version_number, version_creation_date, version_active, |
| | 550 | enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date, |
| | 551 | payment_id, payment_amount, payment_date, payment_method, payment_status, |
| | 552 | review_id, review_rating, review_comment, review_date, |
| | 553 | course_content_id, content_position, |
| | 554 | course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type, |
| | 555 | course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, |
| | 556 | user_course_progress_id, progress_completed, progress_completed_at, |
| | 557 | tag_id, tag_type |
| | 558 | ) |
| | 559 | PK: {user_course_progress_id, course_lecture_translate_id} |
| | 560 | }}} |
| | 561 | |
| | 562 | '''Проверка за lossless join:''' Може да се реконструира преку course_content_id |
| | 563 | '''Проверка за dependency preservation:''' FD14 е зачувана во Course_Content_Translate |
| | 564 | |
| | 565 | === Чекор 5.7: Декомпозиција по FD16 (course_lecture_translate_id → ...) === |
| | 566 | |
| | 567 | '''Нарушува 2NF:''' course_lecture_translate_id е дел од примарниот клуч, а lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text зависат само од course_lecture_translate_id. |
| | 568 | |
| | 569 | '''Декомпозиција:''' |
| | 570 | |
| | 571 | {{{ |
| | 572 | Course_Lecture_Translate(course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, course_lecture_id) |
| | 573 | PK: course_lecture_translate_id |
| | 574 | |
| | 575 | Universal_Relation_Shifter_Base_7 = Universal_Relation_Shifter_Base_6 - {course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text} |
| | 576 | |
| | 577 | Universal_Relation_Shifter_Base_7( |
| | 578 | 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, |
| | 579 | expert_id, |
| | 580 | course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price, |
| | 581 | course_version_id, version_number, version_creation_date, version_active, |
| | 582 | enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date, |
| | 583 | payment_id, payment_amount, payment_date, payment_method, payment_status, |
| | 584 | review_id, review_rating, review_comment, review_date, |
| | 585 | course_content_id, content_position, |
| | 586 | course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type, |
| | 587 | user_course_progress_id, progress_completed, progress_completed_at, |
| | 588 | tag_id, tag_type |
| | 589 | ) |
| | 590 | PK: {user_course_progress_id} |
| | 591 | }}} |
| | 592 | |
| | 593 | '''Проверка за lossless join:''' Може да се реконструира преку course_lecture_id |
| | 594 | '''Проверка за dependency preservation:''' FD16 е зачувана во Course_Lecture_Translate |
| | 595 | |
| | 596 | === Чекор 5.8: Декомпозиција по FD17 (user_course_progress_id → ...) === |
| | 597 | |
| | 598 | '''Нарушува 2NF:''' user_course_progress_id е дел од примарниот клуч, а progress_completed, progress_completed_at зависат само од user_course_progress_id. |
| | 599 | |
| | 600 | '''Декомпозиција:''' |
| | 601 | |
| | 602 | {{{ |
| | 603 | User_Course_Progress(user_course_progress_id, progress_completed, progress_completed_at, enrollment_id, course_lecture_id) |
| | 604 | PK: user_course_progress_id |
| | 605 | |
| | 606 | Universal_Relation_Shifter_Base_8 = Universal_Relation_Shifter_Base_7 - {user_course_progress_id, progress_completed, progress_completed_at} |
| | 607 | |
| | 608 | Universal_Relation_Shifter_Base_8( |
| | 609 | 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, |
| | 610 | expert_id, |
| | 611 | course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price, |
| | 612 | course_version_id, version_number, version_creation_date, version_active, |
| | 613 | enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date, |
| | 614 | payment_id, payment_amount, payment_date, payment_method, payment_status, |
| | 615 | review_id, review_rating, review_comment, review_date, |
| | 616 | course_content_id, content_position, |
| | 617 | course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type, |
| | 618 | tag_id, tag_type |
| | 619 | ) |
| | 620 | PK: ∅ |
| | 621 | }}} |
| | 622 | |
| | 623 | '''Проверка за lossless join:''' Може да се реконструира преку enrollment_id и course_lecture_id |
| | 624 | '''Проверка за dependency preservation:''' FD17 е зачувана во User_Course_Progress |