Changes between Version 8 and Version 9 of normalization


Ignore:
Timestamp:
01/30/26 00:25:07 (16 hours ago)
Author:
231175
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • normalization

    v8 v9  
    266266== 4. 1NF Декомпозиција ==
    267267
    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{{{
     275Course_What_Will_Be_Learned(course_translate_id, course_what_will_be_learned)
     276   PK: {course_translate_id, course_what_will_be_learned}
     277
     278Universal_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
    276284
    277285=== 4.2 Проверка која FD ја нарушува 2NF ===
     
    279287За да биде во 2NF, секој не-клучен атрибут мора целосно да зависи од примарниот клуч (нема парцијални зависности).
    280288
    281 Примарен клуч: '''{saleId, poId, productId}'''
     289Примарен клуч во Universal_Relation_Shifter_Base: '''{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}'''
    282290
    283291'''Парцијални зависности (атрибути кои зависат од дел од клучот):'''
    284 
    285292||= FD =||= Детерминант =||= Дел од клуч? =||= Парцијална зависност? =||
    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''' зависат само од дел од примарниот клуч, а не од целиот клуч.
    295322
    296323'''Идентификувани парцијални зависности што ја нарушуваат 2NF:'''
    297324
    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
    303333
    304334----