Changes between Version 8 and Version 9 of normalization


Ignore:
Timestamp:
09/25/25 11:15:59 (3 weeks ago)
Author:
155036
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • normalization

    v8 v9  
    4545 * `status → status_description`
    4646
     47=== 2a) Примарен клуч на глобалната релација (корекција) ===
     48
     49За глобалната релација R, минималниот кандидат-ключ (составен клуч) што ги покрива сите домени,
     50без да содржи атрибути што се функционално детерминирани од други елементи од клучот, е:
     51
     52{{{
     53K_R = { global_event_id,
     54        actor_id,
     55        location_id,
     56        user_id,
     57        subscription_id,
     58        notification_id,
     59        prediction_id,
     60        conflict_id,
     61        analytics_id }
     62}}}
     63
     64Образложение за минималност:
     65- role_id е детерминиран од user_id → не треба во K_R
     66- plan_id е детерминиран од subscription_id → не треба во K_R
     67- country_code, type_code се детерминирани од actor_id → не треба во K_R
     68- status е детерминиран од subscription_id и/или notification_id → не треба во K_R
     69
     70Со ова, K_R е минимален и служи како основа за формална проверка на 1NF/2NF/3NF.
     71
     72
    4773=== 3) Прва нормална форма (1NF) ===
    4874
    49 Сите атрибути се атомски и нема повторувачки групи.
    50 Мултивредносните атрибути за актери и локации кај настаните се издвоени во
    51 посебна релација со составен клуч:
     75Со примарниот клуч K_R дефиниран, проверуваме дали сите атрибути се атомски и дали нема
     76повторувачки групи. Атрибутите се атомски (нема сложени или мултивредносни полиња).
     77
     78Проблем се појавува кај мултивредносните односи настан–актор–локација, кои се решаваат
     79со издвојување во посебна релација:
    5280
    5381{{{
     
    5684}}}
    5785
    58 Со ова сите релации се во 1NF.
     86По ова разложување, глобалната релација е во 1NF.
     87
    5988
    6089=== 4) Втора нормална форма (2NF) ===
    6190
    62 Критериум: кај релации со составен PK, ниту еден нефункционален атрибут да не зависи само од дел од PK.
    63 
    64 *Проверка:* 
    65 {{{
    66 R_EventDetails(global_event_id, actor_id, location_id)
    67 FDs: (global_event_id, actor_id, location_id) → ∅
    68 }}}
    69 
    70 Нема нефункционални атрибути што зависат од дел од составениот клуч. 
    71 Кај сите останати ентитети PK е едноставен, па по дефиниција се во 2NF.
    72 
    73 Со тоа сите релации се во 2NF.
     91Критериум: секој нефункционален атрибут мора да зависи од целиот составен клуч K_R, а не
     92само од дел од него.
     93
     94Постојат масовни парцијални зависности, затоа што повеќе атрибути зависат
     95од поединечни идентификатори (подмножества на K_R). Примери:
     96
     97{{{
     98global_event_id → {sql_date, month_year, year, fraction_date, is_root_event,
     99                   event_code, goldstein_scale, num_mentions, num_sources,
     100                   num_articles, avg_tone}
     101
     102actor_id        → {actor_code, actor_name, country_code, type_code}
     103
     104location_id     → {full_name, country_code, adm1_code, latitude, longitude,
     105                   feature_id}
     106
     107user_id         → {first_name, last_name, email, password_hash, role_id,
     108                   last_login_date, register_date}
     109
     110role_id         → {role_name}
     111
     112plan_id         → {plan_name, max_events, max_notifications, max_predictions}
     113
     114subscription_id → {user_id, plan_id, start_date, end_date, status}
     115
     116notification_id → {user_id, event_id, notification_date, status}
     117
     118prediction_id   → {event_id, actor_id, predicted_date, prediction_type,
     119                   confidence_score}
     120
     121conflict_id     → {actor1_id, actor2_id, risk_score, predicted_date, description}
     122
     123analytics_id    → {actor_id, event_id, date, conflict_coefficient, mentions_count,
     124                   avg_tone, description}
     125}}}
     126
     127Секој блок зависи само од еден дел од составниот клуч K_R, па глобалната релација R не е во 2NF.
     128
     129*Решение:* разложување на R според идентификаторите, со тоа секоја група атрибути се
     130преселува во сопствена релација каде PK е токму тој идентификатор. Ова дава:
     131
     132{{{
     133Events(global_event_id PK, sql_date, month_year, year, fraction_date, is_root_event,
     134       event_code, goldstein_scale, num_mentions, num_sources, num_articles, avg_tone)
     135
     136Actors(actor_id PK, actor_code, actor_name, country_code, type_code)
     137
     138Locations(location_id PK, full_name, country_code, adm1_code, latitude, longitude,
     139          feature_id)
     140
     141Users(user_id PK, first_name, last_name, email, password_hash, role_id,
     142      last_login_date, register_date)
     143
     144Roles(role_id PK, role_name)
     145
     146Plan(plan_id PK, plan_name, max_events, max_notifications, max_predictions)
     147
     148Subscription(subscription_id PK, user_id, plan_id, start_date, end_date, status)
     149
     150Notifications(notification_id PK, user_id, event_id, notification_date, status)
     151
     152Predictions(prediction_id PK, event_id, actor_id, predicted_date, prediction_type,
     153            confidence_score)
     154
     155Conflict_Risk(conflict_id PK, actor1_id, actor2_id, risk_score, predicted_date,
     156              description)
     157
     158Event_Details(global_event_id, actor_id, location_id,
     159              PK = (global_event_id, actor_id, location_id))
     160
     161Event_Analytics(analytics_id PK, actor_id, event_id, date,
     162                conflict_coefficient, mentions_count, avg_tone, description)
     163}}}
     164
     165Со ова секој нефункционален атрибут во секоја релација зависи од целиот PK на таа релација. 
     166Затоа новото множество релации е во 2NF.
     167
    74168
    75169=== 5) Трета нормална форма (3NF) ===
     
    77171Критериум: атрибут што не е клуч да не зависи транзитивно од клуч преку друг атрибут што не е клуч.
    78172
    79 Транзитивни зависности во глобалната релација:
     173Во глобалната релација R постојат транзитивни зависности:
    80174{{{
    81175country_code → country_name
     
    84178}}}
    85179
    86 Разложување со проекции:
    87 {{{
    88 Actors     = π_{actor_id, actor_code, actor_name, country_code, type_code}(R)
    89 Countries  = π_{country_code, country_name}(R)
    90 ActorTypes = π_{type_code, type_description}(R)
    91 
    92 Locations  = π_{location_id, full_name, country_code, adm1_code, latitude, longitude, feature_id}(R)
    93 Countries  = π_{country_code, country_name}(R)
    94 
    95 Subscription  = π_{subscription_id, user_id, plan_id, start_date, end_date, status}(R)
    96 Notifications = π_{notification_id, user_id, event_id, notification_date, status}(R)
    97 Statuses      = π_{status, status_description}(R)
    98 }}}
    99 
    100 Lossless-join услови:
    101 {{{
    102 R = Actors ⨝ Countries ⨝ ActorTypes
    103 R = Locations ⨝ Countries
    104 R = Subscription ⨝ Statuses
    105 R = Notifications ⨝ Statuses
    106 }}}
    107 
    108 Зачувување на зависности:
    109  * `actor_id → actor_code, actor_name, country_code, type_code` во Actors 
    110  * `country_code → country_name` во Countries 
    111  * `type_code → type_description` во Actor Types 
    112  * `location_id → full_name, country_code, adm1_code, latitude, longitude, feature_id` во Locations 
    113  * `subscription_id → …, status` во Subscription 
    114  * `notification_id → …, status` во Notifications 
    115  * `status → status_description` во Statuses 
    116 
    117 Со ова сите транзитивни зависности се елиминирани, а сите релации се lossless и ги зачувуваат функционалните зависности. 
    118 Затоа глобалната релација е во 3NF.
     180За нив дефинираме посебни релации со експлицитни PK/FK:
     181
     182{{{
     183Countries(country_code PK, country_name)
     184ActorTypes(type_code PK, type_description)
     185Statuses(status PK, status_description)
     186
     187Actors(actor_id PK, actor_code, actor_name,
     188       country_code FK→Countries(country_code),
     189       type_code    FK→ActorTypes(type_code))
     190
     191Locations(location_id PK, full_name,
     192          country_code FK→Countries(country_code),
     193          adm1_code, latitude, longitude, feature_id)
     194
     195Subscription(subscription_id PK, user_id, plan_id, start_date, end_date,
     196             status FK→Statuses(status))
     197
     198Notifications(notification_id PK, user_id, event_id, notification_date,
     199              status FK→Statuses(status))
     200}}}
     201
     202Lossless-join услови (базирани на PK/FK):
     203{{{
     204Actors       ⨝_{Actors.country_code    = Countries.country_code}   Countries
     205Actors       ⨝_{Actors.type_code       = ActorTypes.type_code}     ActorTypes
     206Locations    ⨝_{Locations.country_code = Countries.country_code}   Countries
     207Subscription ⨝_{Subscription.status    = Statuses.status}          Statuses
     208Notifications⨝_{Notifications.status   = Statuses.status}          Statuses
     209}}}
     210
     211Објаснување:
     212 * Сите споеви се FK→PK (еден кон многу), па се lossless (не се губат и не се создаваат лажни tuples).
     213 * Сите функционални зависности се зачувани:
     214   - `actor_id → actor_code, actor_name, country_code, type_code` во Actors
     215   - `country_code → country_name` во Countries
     216   - `type_code → type_description` во ActorTypes
     217   - `location_id → full_name, country_code, adm1_code, latitude, longitude, feature_id` во Locations
     218   - `subscription_id → user_id, plan_id, start_date, end_date, status` во Subscription
     219   - `notification_id → user_id, event_id, notification_date, status` во Notifications
     220   - `status → status_description` во Statuses
     221
     222Со ова транзитивните зависности се елиминирани, а преку PK/FK формата споевите се lossless
     223и зависностите се зачувани. Следствено, релациите се во 3NF.
     224
    119225
    120226=== 6) Резултантна 3NF шема ===