Changes between Version 10 and Version 11 of normalization


Ignore:
Timestamp:
01/30/26 00:58:40 (15 hours ago)
Author:
231175
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • normalization

    v10 v11  
    301301
    302302'''Проверка за lossless join:''' Може да се реконструира преку course_translate_id
    303 '''Проверка за dependency preservation:''' ✓ Сите FD28 е зачувана во Course_What_Will_Be_Learned
     303'''Проверка за dependency preservation:''' FD28 е зачувана во Course_What_Will_Be_Learned
    304304
    305305
     
    351351 6. '''FD14:''' course_content_translate_id → content_translate_title, content_translate_language, course_content_id
    352352 7. '''FD16:''' course_lecture_translate_id → lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text, course_lecture_id
     353 8. '''FD17:''' user_course_progress_id → progress_completed, progress_completed_at, enrollment_id, course_lecture_id
    353354
    354355
     
    357358== 5. 2NF Декомпозиција ==
    358359
    359 === Чекор 5.1: Декомпозиција по FD5 (productId → ...) ===
    360 
    361 '''Нарушува 2NF:''' productId е дел од примарниот клуч, а product_name, product_description, итн. зависат само од productId.
     360=== Чекор 5.1: Декомпозиција по FD2 (verification_token_uuid → ...) ===
     361
     362'''Нарушува 2NF:''' verification_token_uuid е дел од примарниот клуч, а token_created_at, token_expired_at зависат само од verification_token_uuid.
    362363
    363364'''Декомпозиција:'''
    364365
    365366{{{
    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.
     367Verification_Token(verification_token_uuid, token_created_at, token_expired_at, user_id)
     368   PK: verification_token_uuid
     369
     370Universal_Relation_Shifter_Base_1 = Universal_Relation_Shifter_Base - {verification_token_uuid, token_created_at, token_expired_at}
     371
     372Universal_Relation_Shifter_Base_1(
     373user_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,
     374meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link,
     375expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash,
     376course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     377course_version_id, version_number, version_creation_date, version_active,
     378enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date,
     379payment_id, payment_amount, payment_date, payment_method, payment_status,
     380review_id, review_rating, review_comment, review_date,
     381course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long,
     382course_content_id, content_position,
     383course_content_translate_id, content_translate_title, content_translate_language,
     384course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type,
     385course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text,
     386user_course_progress_id, progress_completed, progress_completed_at,
     387tag_id, tag_type,
     388tag_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.
    384399
    385400'''Декомпозиција:'''
    386401
    387402{{{
    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.
     403Meeting_Reminder(meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id)
     404   PK: meeting_reminder_id
     405
     406Universal_Relation_Shifter_Base_2 = Universal_Relation_Shifter_Base_1 - {meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link}
     407
     408Universal_Relation_Shifter_Base_2(
     409user_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,
     410expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash,
     411course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     412course_version_id, version_number, version_creation_date, version_active,
     413enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date,
     414payment_id, payment_amount, payment_date, payment_method, payment_status,
     415review_id, review_rating, review_comment, review_date,
     416course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long,
     417course_content_id, content_position,
     418course_content_translate_id, content_translate_title, content_translate_language,
     419course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type,
     420course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text,
     421user_course_progress_id, progress_completed, progress_completed_at,
     422tag_id, tag_type,
     423tag_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.
    404434
    405435'''Декомпозиција:'''
    406436
    407437{{{
    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} е подмножество на примарниот клуч.
     438Expert(expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash)
     439   PK: expert_id
     440
     441Universal_Relation_Shifter_Base_3 = Universal_Relation_Shifter_Base_2 - {expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash}
     442
     443Universal_Relation_Shifter_Base_3(
     444user_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,
     445expert_id
     446course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     447course_version_id, version_number, version_creation_date, version_active,
     448enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date,
     449payment_id, payment_amount, payment_date, payment_method, payment_status,
     450review_id, review_rating, review_comment, review_date,
     451course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long,
     452course_content_id, content_position,
     453course_content_translate_id, content_translate_title, content_translate_language,
     454course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type,
     455course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text,
     456user_course_progress_id, progress_completed, progress_completed_at,
     457tag_id, tag_type,
     458tag_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.
    424469
    425470'''Декомпозиција:'''
    426471
    427472{{{
    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} е подмножество на примарниот клуч.
     473Tag_Translate(tag_translate_id, tag_translate_language, tag_value, tag_id)
     474   PK: tag_translate_id
     475
     476Universal_Relation_Shifter_Base_4 = Universal_Relation_Shifter_Base_3 - {tag_translate_id, tag_translate_language, tag_value}
     477
     478Universal_Relation_Shifter_Base_4(
     479user_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,
     480expert_id,
     481course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     482course_version_id, version_number, version_creation_date, version_active,
     483enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date,
     484payment_id, payment_amount, payment_date, payment_method, payment_status,
     485review_id, review_rating, review_comment, review_date,
     486course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long,
     487course_content_id, content_position,
     488course_content_translate_id, content_translate_title, content_translate_language,
     489course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type,
     490course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text,
     491user_course_progress_id, progress_completed, progress_completed_at,
     492tag_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.
    444503
    445504'''Декомпозиција:'''
    446505
    447506{{{
    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 ✓
     507Course_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
     510Universal_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
     512Universal_Relation_Shifter_Base_5(
     513user_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,
     514expert_id,
     515course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     516course_version_id, version_number, version_creation_date, version_active,
     517enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date,
     518payment_id, payment_amount, payment_date, payment_method, payment_status,
     519review_id, review_rating, review_comment, review_date,
     520course_content_id, content_position,
     521course_content_translate_id, content_translate_title, content_translate_language,
     522course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type,
     523course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text,
     524user_course_progress_id, progress_completed, progress_completed_at,
     525tag_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{{{
     540Course_Content_Translate(course_content_translate_id, content_translate_title, content_translate_language, course_content_id)
     541   PK: course_content_translate_id
     542
     543Universal_Relation_Shifter_Base_6 = Universal_Relation_Shifter_Base_5 - {course_content_translate_id, content_translate_title, content_translate_language}
     544
     545Universal_Relation_Shifter_Base_6(
     546user_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,
     547expert_id,
     548course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     549course_version_id, version_number, version_creation_date, version_active,
     550enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date,
     551payment_id, payment_amount, payment_date, payment_method, payment_status,
     552review_id, review_rating, review_comment, review_date,
     553course_content_id, content_position,
     554course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type,
     555course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text,
     556user_course_progress_id, progress_completed, progress_completed_at,
     557tag_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{{{
     572Course_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
     575Universal_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
     577Universal_Relation_Shifter_Base_7(
     578user_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,
     579expert_id,
     580course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     581course_version_id, version_number, version_creation_date, version_active,
     582enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date,
     583payment_id, payment_amount, payment_date, payment_method, payment_status,
     584review_id, review_rating, review_comment, review_date,
     585course_content_id, content_position,
     586course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type,
     587user_course_progress_id, progress_completed, progress_completed_at,
     588tag_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{{{
     603User_Course_Progress(user_course_progress_id, progress_completed, progress_completed_at, enrollment_id, course_lecture_id)
     604   PK: user_course_progress_id
     605
     606Universal_Relation_Shifter_Base_8 = Universal_Relation_Shifter_Base_7 - {user_course_progress_id, progress_completed, progress_completed_at}
     607
     608Universal_Relation_Shifter_Base_8(
     609user_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,
     610expert_id,
     611course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     612course_version_id, version_number, version_creation_date, version_active,
     613enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date,
     614payment_id, payment_amount, payment_date, payment_method, payment_status,
     615review_id, review_rating, review_comment, review_date,
     616course_content_id, content_position,
     617course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type,
     618tag_id, tag_type
     619)
     620   PK: ∅
     621}}}
     622
     623'''Проверка за lossless join:''' Може да се реконструира преку enrollment_id и course_lecture_id
     624'''Проверка за dependency preservation:''' FD17 е зачувана во User_Course_Progress
    460625
    461626=== Состојба после 2NF декомпозиција ===