| | 114 | ''Чекор 1:''' Започнуваме со задолжителни: |
| | 115 | |
| | 116 | {{{ |
| | 117 | {holding_id, history_id, trade_id, transaction_id, watchlist_id, oauth_token, auth_provider}: |
| | 118 | |
| | 119 | - Од FD8 (holding_id →): holding_quantity, avg_price, portfolio_id, stock_id |
| | 120 | - Од FD9 (history_id →): history_price, history_timestamp, stock_id |
| | 121 | - Од FD10 (trade_id →): trade_type, trade_status, trade_quantity, price_per_unit, |
| | 122 | trade_timestamp, trade_stock_symbol, portfolio_id |
| | 123 | - Од FD11 (transaction_id →): txn_type, txn_quantity, txn_price, txn_timestamp, txn_origin, |
| | 124 | user_id, stock_id |
| | 125 | - Од FD12 (watchlist_id →): price_above, price_below, user_id, stock_id |
| | 126 | - Од FD13 (oauth_token →): oauth_email, oauth_provider, oauth_expires_at, oauth_created_at, user_id |
| | 127 | - Од FD4 (portfolio_id →): balance, user_id |
| | 128 | - Од FD5 (user_id →): portfolio_id |
| | 129 | - Од FD1 (user_id →): username, password, email, role |
| | 130 | - Од FD6 (stock_id →): stock_symbol, stock_name, current_price, last_price, |
| | 131 | percentage, turnover, last_updated |
| | 132 | - Од FD7 (stock_symbol →): stock_id |
| | 133 | - Од FD2 (username →): user_id |
| | 134 | - Од FD3 (email →): user_id |
| | 135 | }}} |
| | 136 | |
| | 137 | {{{ |
| | 138 | {holding_id, history_id, trade_id, transaction_id, watchlist_id, oauth_token, auth_provider} |
| | 139 | = Universal_Relation_TradingMK ✓ (сите атрибути се изводливи) |
| | 140 | }}} |
| | 141 | |
| | 142 | ==== Проверка за минималност ==== |
| | 143 | |
| | 144 | |
| | 145 | ||= Подмножество (отстранет атрибут) =||= Недостасуваат атрибути =||= Суперклуч? =|| |
| | 146 | || без holding_id || holding_quantity, avg_price || ✗ НЕ || |
| | 147 | || без history_id || history_price, history_timestamp || ✗ НЕ || |
| | 148 | || без trade_id || trade_type, trade_status, trade_quantity, price_per_unit, trade_timestamp, trade_stock_symbol || ✗ НЕ || |
| | 149 | || без transaction_id || txn_type, txn_quantity, txn_price, txn_timestamp, txn_origin || ✗ НЕ || |
| | 150 | || без watchlist_id || price_above, price_below || ✗ НЕ || |
| | 151 | || без oauth_token || oauth_email, oauth_expires_at, oauth_created_at || ✗ НЕ || |
| | 152 | || без auth_provider || auth_provider не е изводливо || ✗ НЕ || |
| | 153 | |
| | 154 | Секој атрибут е неопходен - множеството е минимално. |
| | 155 | |
| | 156 | ==== Избор на примарен клуч ==== |
| | 157 | |
| | 158 | ''Кандидат клуч (и избран примарен клуч):''' |
| | 159 | |
| | 160 | {{{ |
| | 161 | PK = {holding_id, history_id, trade_id, transaction_id, watchlist_id, oauth_token, auth_provider} |
| | 162 | }}} |
| | 163 | |
| | 164 | '''Образложение:''' Примарниот клуч е голем бидејќи универзалната релација содржи повеќе независни ентитети (корисници, портфолија, акции, трговски барања, трансакции, watchlist записи, OAuth токени, auth провајдери) кои не се директно поврзани преку функционални зависности. Секој независен ентитет бара барем еден идентификатор во клучот. Клучот е минимален - отстранувањето на кој било атрибут го прави невозможно изведувањето на дел од атрибутите. |
| | 165 | |
| | 166 | ==== Нормална форма пред декомпозиција ==== |
| | 167 | |
| | 168 | Universal_Relation_TradingMK е во '''1NF''' (сите атрибути се атомарни, со исклучок на auth_provider кој е мулти-вредносен). Релацијата '''НЕ е во 2NF''' поради следните парцијални зависности - секој идентификатор ги определува само своите атрибути, независно од останатиот примарен клуч: |
| | 169 | |
| | 170 | * FD8: holding_id → holding_quantity, avg_price, portfolio_id, stock_id |
| | 171 | * FD9: history_id → history_price, history_timestamp, stock_id |
| | 172 | * FD10: trade_id → trade_type, trade_status, ..., portfolio_id |
| | 173 | * FD11: transaction_id → txn_type, ..., user_id, stock_id |
| | 174 | * FD12: watchlist_id → price_above, price_below, user_id, stock_id |
| | 175 | * FD13: oauth_token → oauth_email, oauth_provider, oauth_expires_at, oauth_created_at, user_id |
| | 176 | |
| | 177 | ---- |
| | 178 | |
| | 179 | == 1NF Декомпозиција == |
| | 180 | |
| | 181 | === Анализа === |
| | 182 | |
| | 183 | '''Анализирана релација:''' Universal_Relation_TradingMK |
| | 184 | |
| | 185 | '''Функционални зависности:''' FD1 - FD13 (сите) |
| | 186 | |
| | 187 | '''Кандидат клуч / Примарен клуч:''' {holding_id, history_id, trade_id, transaction_id, watchlist_id, oauth_token, auth_provider} |
| | 188 | |
| | 189 | '''Нормална форма:''' Релацијата е делумно во 1NF - атрибутот '''auth_provider''' претставува повеќевредносен (multi-valued) атрибут. Еден корисник може да има повеќе auth провајдери (интерен, Google), па оваа вредност не може да биде атомарна во унификованата релација. |
| | 190 | |
| | 191 | '''Зависност која го предизвикува проблемот:''' auth_provider е неделива повторувачка вредност поврзана со user_id - нема функционална зависност од единечен детерминант, туку претставува множество вредности. |
| | 192 | |
| | 193 | === Декомпозиција - Извлекување на auth_provider === |