Changes between Version 16 and Version 17 of normalization


Ignore:
Timestamp:
01/30/26 11:21:48 (3 hours ago)
Author:
231175
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • normalization

    v16 v17  
    77{{{
    88Universal_Relation_Shifter(
    9 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,
     9user_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, user_course_favorite_ids,
    1010meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link,
    1111expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash,
     
    6363 * '''FD27:''' (course_content_id, lecture_position) → course_lecture_id
    6464 * '''FD28:''' (course_translate_id, course_what_will_be_learned) → ∅
     65 * '''FD29:''' (user_id, user_course_favorite_ids) → ∅
    6566'''}'''
    6667
     
    8788|| user_work_position || ✗ || ✓ (FD1) || десно ||
    8889|| user_points || ✗ || ✓ (FD1) || десно ||
     90|| user_course_favorite_ids || ✓ (FD29) || ✗ || лево ||
    8991|| verification_token_uuid || ✓ (FD2) || ✗ || лево ||
    9092|| token_created_at || ✗ || ✓ (FD2) || десно ||
     
    163165 * '''meeting_reminder_id''' - мора да биде дел од секој кандидат клуч
    164166 * '''course_what_will_be_learned''' - мора да биде дел од секој кандидат клуч
     167 * '''user_course_favorite_ids''' - мора да биде дел од секој кандидат клуч
    165168
    166169=== 3.4 Пресметка на затворач ===
    167170
    168 '''Чекор 1:''' Започнуваме со {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned} и пресметуваме затворач:
    169 
    170 {{{
    171 {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned}⁺:
     171'''Чекор 1:''' Започнуваме со {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids} и пресметуваме затворач:
     172
     173{{{
     174{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids}⁺:
    172175- Од FD2 (verification_token_uuid →): добиваме token_created_at, token_expired_at, user_id
    173176- Од FD3 (meeting_reminder_id →): добиваме meeting_at, meeting_scheduled_at, meeting_sent, meeting_link, user_id
     
    176179}}}
    177180
    178 '''{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned}⁺ ≠ Universal_Relation_Shifter'''
     181'''{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids}⁺ ≠ Universal_Relation_Shifter'''
    179182
    180183'''Недостасуваат:'''
     
    197200
    198201{{{
    199 {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_progress_id}⁺:
     202{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id}⁺:
    200203- Сè од претходно, плус:
    201204- Од FD6 (user_course_progress_id →): добиваме progress_completed, progress_completed_at, enrollment_id, course_lecture_id
     
    209212}}}
    210213
    211 '''{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_progress_id}⁺ ≠ Universal_Relation_Shifter'''
     214'''{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id}⁺ ≠ Universal_Relation_Shifter'''
    212215
    213216'''Недостасуваат:'''
     
    222225
    223226{{{
    224 {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺:
     227{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺:
    225228- Сè од претходно, плус:
    226229- Од FD4 (expert_id →): добиваме expert_name, expert_email, expert_login_provider, expert_password_hash
     
    233236}}}
    234237
    235 '''{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺ = Universal_Relation_Shifter''' (ги содржи сите атрибути) ✓
     238'''{verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}⁺ = Universal_Relation_Shifter''' (ги содржи сите атрибути) ✓
    236239
    237240=== 3.5 Проверка за минималност ===
    238241
    239242||= Подмножество =||= Затворач =||= = Universal_Relation_Shifter? =||
    240 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned}⁺ || Недостасуваат атрибути од  user_course_progress || ✗ НЕ ||
    241 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_progress}⁺ || Недостасуваат атрибути од expert || ✗ НЕ ||
    242 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_progress_id, expert_id}⁺ || Недостасуваат атрибути од course_translate || ✗ НЕ ||
    243 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_progress_id, expert_id, course_translate_id}⁺ || Недостасуваат атрибути од course_lecture_translate || ✗ НЕ ||
    244 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_progress_id, expert_id, course_translate_id, course_lecture_translate_id}⁺ || Недостасуваат атрибути од course_content_translate || ✗ НЕ ||
    245 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_progress_id, expert_id, course_translate_id, course_lecture_translate_id, course_content_translate_id}⁺ || Недостасуваат атрибути од tag_translate || ✗ НЕ ||
    246 || {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_progress_id, expert_id, course_translate_id, course_lecture_translate_id, course_content_translate_id, tag_translate_id}⁺ || Сите атрибути се присути || ✓ ДА ||
    247 
    248 '''Заклучок:''' {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} е минимален и е кандидат клуч.
     243|| {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids}⁺ || Недостасуваат атрибути од  user_course_progress || ✗ НЕ ||
     244|| {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress}⁺ || Недостасуваат атрибути од expert || ✗ НЕ ||
     245|| {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id}⁺ || Недостасуваат атрибути од course_translate || ✗ НЕ ||
     246|| {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_translate_id}⁺ || Недостасуваат атрибути од course_lecture_translate || ✗ НЕ ||
     247|| {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_translate_id, course_lecture_translate_id}⁺ || Недостасуваат атрибути од course_content_translate || ✗ НЕ ||
     248|| {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_translate_id, course_lecture_translate_id, course_content_translate_id}⁺ || Недостасуваат атрибути од tag_translate || ✗ НЕ ||
     249|| {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_translate_id, course_lecture_translate_id, course_content_translate_id, tag_translate_id}⁺ || Сите атрибути се присути || ✓ ДА ||
     250
     251'''Заклучок:''' {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id} е минимален и е кандидат клуч.
    249252
    250253=== 3.6 Други кандидат клучеви ===
     
    254257=== 3.7 Избор на примарен клуч ===
    255258
    256 '''Избран примарен клуч: {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}'''
     259'''Избран примарен клуч: {verification_token_uuid, meeting_reminder_id, course_what_will_be_learned, user_course_favorite_ids, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}'''
    257260
    258261'''Образложение:'''
     
    279282
    280283Universal_Relation_Shifter_Base(
    281 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,
     284user_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, user_course_favorite_ids,
    282285meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link,
    283286expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash,
     
    297300tag_translate_id, tag_translate_language, tag_value
    298301)
    299    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}
     302   PK: {verification_token_uuid, meeting_reminder_id, user_course_favorite_ids, user_course_progress_id, expert_id, course_lecture_translate_id, course_content_translate_id, course_translate_id, tag_translate_id}
    300303}}}
    301304
     
    303306'''Проверка за dependency preservation:''' FD28 е зачувана во Course_What_Will_Be_Learned
    304307
    305 
    306 === 4.2 Проверка која FD ја нарушува 2NF ===
     308=== Чекор 4.2: Декомпозиција на релацијата Universal_Relation_Shifter ===
     309
     310'''Нарушува 1NF: '''Релацијата не е во 1NF бидејќи атрибутот user_course_favorite_ids претставува повеќевредносен (multi-valued) атрибут. Секој user може да има повеќе ставки од user_course_favorite_ids.
     311
     312'''Декомпозиција:'''
     313
     314{{{
     315User_Course_Favorite_Id(user_id, user_course_favorite_id)
     316   PK: {user_id, user_course_favorite_id}
     317
     318Universal_Relation_Shifter_Base = Universal_Relation_Shifter - {user_course_favorite_ids}
     319
     320Universal_Relation_Shifter_Base(
     321user_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,
     322meeting_reminder_id, meeting_at, meeting_scheduled_at, meeting_sent, meeting_link,
     323expert_id, expert_name, expert_email, expert_login_provider, expert_password_hash,
     324course_id, course_image_url, course_color, course_difficulty, course_duration_minutes, course_price,
     325course_version_id, version_number, version_creation_date, version_active,
     326enrollment_id, enrollment_status, enrollment_purchase_date, enrollment_activation_date, enrollment_completion_date,
     327payment_id, payment_amount, payment_date, payment_method, payment_status,
     328review_id, review_rating, review_comment, review_date,
     329course_translate_id, course_translate_language, course_title_short, course_title, course_description_short, course_description, course_description_long,
     330course_content_id, content_position,
     331course_content_translate_id, content_translate_title, content_translate_language,
     332course_lecture_id, lecture_duration_minutes, lecture_position, lecture_content_type,
     333course_lecture_translate_id, lecture_title, lecture_language, lecture_content_file_name, lecture_description, lecture_content_text,
     334user_course_progress_id, progress_completed, progress_completed_at,
     335verification_token_uuid, token_created_at, token_expired_at,
     336tag_id, tag_type,
     337tag_translate_id, tag_translate_language, tag_value
     338)
     339   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}
     340}}}
     341
     342'''Проверка за lossless join:''' Може да се реконструира преку user_id <br> 
     343'''Проверка за dependency preservation:''' FD29 е зачувана во User_Course_Favorite_Id
     344
     345
     346=== 4.3 Проверка која FD ја нарушува 2NF ===
    307347
    308348За да биде во 2NF, секој не-клучен атрибут мора целосно да зависи од примарниот клуч (нема парцијални зависности).
     
    627667
    628668{{{
     669User_Course_Favorite_Id(user_id, user_course_favorite_id)
     670   PK: {user_id, user_course_favorite_id}
     671
    629672Course_What_Will_Be_Learned(course_translate_id, course_what_will_be_learned)
    630673   PK: {course_translate_id, course_what_will_be_learned}
     
    9721015||= Релација =||= Атрибути =||= Примарен клуч =||
    9731016|| Course_What_Will_Be_Learned || course_translate_id, course_what_will_be_learned || (course_translate_id, course_what_will_be_learned) ||
     1017|| User_Course_Favorite_Id || user_id, user_course_favorite_id || (user_id, user_course_favorite_id) ||
    9741018
    9751019'''2NF Декомпозиција (8 релации):'''
     
    11391183
    11401184{{{
     1185User_Course_Favorite_Id(user_id, user_course_favorite_id)
     1186  - Примарен клуч: user_id, user_course_favorite_id
     1187  - Кандидат клучеви: user_id, user_course_favorite_id
     1188  - Надворешни клучеви: user_id
     1189
    11411190Course_What_Will_Be_Learned(course_translate_id, course_what_will_be_learned)
    11421191  - Примарен клуч: course_translate_id, course_what_will_be_learned
     
    12471296=== 8.2 Дискусија на разликите од моделот во Фаза P2 ===
    12481297
    1249 Преку процесот на нормализација, тргнувајќи од една универзална релација, дојдовме до '''21 релации'''
    1250 (17 од функционални зависности + 3 many-to-many junction tables + 1 multi-value). Споредбата со концептуалниот модел
     1298Преку процесот на нормализација, тргнувајќи од една универзална релација, дојдовме до '''22 релации'''
     1299(17 од функционални зависности + 3 many-to-many junction tables + 2 multi-value tables). Споредбата со концептуалниот модел
    12511300од Фаза P2 покажува следно:
    12521301
     
    12821331
    12831332 21. '''Course_What_Will_Be_Learned''' - беше дел од Course_Translate во концептуалниот модел, но се издвои во посебна релација во 1NF декомпозицијата поради мултивредносна природа (еден курс има повеќе "what will be learned" ставки).
     1333 22. '''User_Course_Favorite_Id''' - беше дел од User во концептуалниот модел, но се издвои во посебна релација во 1NF декомпозицијата поради мултивредносна природа (еден корисник има повеќе "course favorite id" ставки).
    12841334
    12851335==== Клучни наоди ====
     
    12911341 3. '''Декомпозицијата е lossless''' - на секој чекор од процесот на нормализација, оригиналната информација може да се реконструира преку JOIN операции на заедничките атрибути (foreign keys).
    12921342
    1293  4. '''Сите функционални зависности се зачувани''' - сите 27 функционални зависности (FD1-FD27) се зачувани во соодветните релации, што значи дека ограничувањата можат да се проверуваат без потреба од скапи JOIN операции.
     1343 4. '''Сите функционални зависности се зачувани''' - сите 29 функционални зависности (FD1-FD29) се зачувани во соодветните релации, што значи дека ограничувањата можат да се проверуваат без потреба од скапи JOIN операции.
    12941344
    12951345 5. '''Many-to-many релации''' - junction tables (Expert_Course, Course_Tag, User_Tag) не произлегуваат од функционални зависности, туку од ER моделот и бизнис логиката. Овие релации немаат свои атрибути освен composite primary key од два foreign keys.