| 6 | |
| 7 | === Објаснување на нормализацијата === |
| 8 | |
| 9 | Нормализацијата беше извршена како анализа на целиот модел составен од 12 табели, при што се разгледуваа зависностите помеѓу табелите, а не само во рамки на секоја одделно. На тој начин се овозможи откривање на заеднички функционални зависности и елиминирање на дуплирани ентитети и атрибути. |
| 10 | |
| 11 | Клучни подобрувања: |
| 12 | - Централизација на статусите преку единствена табела **statuses**, користена и во **subscription** и **notifications**. |
| 13 | - Централизација на земјите преку табелата **countries**, споделена од **actors** и **locations**. |
| 14 | - Елиминирање на транзитивни зависности преку атрибути како **role_id**, **country_code**, и **type_code**. |
| 15 | - Генерација на дополнителни референтни табели како **actor_types**, **roles**, и **statuses** со foreign keys за интегритет. |
| 16 | |
| 17 | Со оваа нормализација до 3NF, се подобрува конзистентноста, се намалува дуплирањето на податоци и се поедноставува одржувањето на базата. |
| 49 | |
| 50 | === **users**(**user_id**, **first_name**, **last_name**, **email**, **password_hash**, **role_id**, **last_login_date**, **register_date**) === |
| 51 | |
| 52 | Функционални зависности: |
| 53 | **user_id** → **first_name**, **last_name**, **email**, **password_hash**, **role_id**, **last_login_date**, **register_date** |
| 54 | **role_id** → **role_name** |
| 55 | |
| 56 | 1NF: Атомски вредности / |
| 57 | 2NF: Зависности од целиот клуч / |
| 58 | 3NF: Транзитивна зависност преку **role_id** |
| 59 | |
| 60 | Декомпозиција: |
| 61 | **users**(**user_id**, **first_name**, **last_name**, **email**, **password_hash**, **role_id**, **last_login_date**, **register_date**) |
| 62 | **roles**(**role_id**, **role_name**) |
83 | | === Нови релации по нормализација === |
| 92 | === **predictions**(**prediction_id**, **event_id**, **actor_id**, **predicted_date**, **prediction_type**, **confidence_score**) === |
| 93 | |
| 94 | Функционални зависности: |
| 95 | **prediction_id** → **event_id**, **actor_id**, **predicted_date**, **prediction_type**, **confidence_score** |
| 96 | |
| 97 | 1NF: Атомски вредности / |
| 98 | 2NF: Нема составен клуч, сите зависности се од примарниот клуч / |
| 99 | 3NF: Нема транзитивни зависности |
| 100 | |
| 101 | Декомпозиција: / (нема потреба) |
| 102 | |
| 103 | === **conflict_risk**(**conflict_id**, **actor1_id**, **actor2_id**, **risk_score**, **predicted_date**, **description**) === |
| 104 | |
| 105 | Функционални зависности: |
| 106 | **conflict_id** → **actor1_id**, **actor2_id**, **risk_score**, **predicted_date**, **description** |
| 107 | |
| 108 | 1NF: Атомски вредности / |
| 109 | 2NF: Сите зависности се од примарниот клуч / |
| 110 | 3NF: Нема транзитивни зависности |
| 111 | |
| 112 | Декомпозиција: / (нема потреба) |
| 113 | |
| 114 | === **event_analytics**(**analytics_id**, **actor_id**, **event_id**, **date**, **conflict_coefficient**, **mentions_count**, **avg_tone**, **description**) === |
| 115 | |
| 116 | Функционални зависности: |
| 117 | **analytics_id** → **actor_id**, **event_id**, **date**, **conflict_coefficient**, **mentions_count**, **avg_tone**, **description** |
| 118 | |
| 119 | 1NF: Атомски вредности / |
| 120 | 2NF: Сите зависности се од клучот / |
| 121 | 3NF: Нема транзитивни зависности |
| 122 | |
| 123 | Декомпозиција: / (нема потреба) |
| 124 | |
| 125 | === **Нови релации по нормализација** === |
99 | | |
100 | | === Финален дизајн (за **actors**) === |
101 | | |
102 | | CREATE TABLE **actors** ( |
103 | | **actor_id** SERIAL PRIMARY KEY, |
104 | | **actor_code** VARCHAR(10) NOT NULL, |
105 | | **actor_name** VARCHAR(100) NOT NULL, |
106 | | **country_code** VARCHAR(5), |
107 | | **type_code** VARCHAR(10), |
108 | | FOREIGN KEY (**country_code**) REFERENCES **countries**(**country_code**), |
109 | | FOREIGN KEY (**type_code**) REFERENCES **actor_types**(**type_code**) |
110 | | ); |