| | 22 | }}} |
| | 23 | |
| | 24 | '''Напомени за именување:''' |
| | 25 | * trade_stock_symbol е преименуван (наспроти stock_symbol) за да избегне конфликт на имиња во универзалната релација |
| | 26 | * auth_provider е атрибут кој претставува вредност од user_auth_providers - повеќевредносен по природа |
| | 27 | * Нема дупликати на имиња на атрибути во универзалната релација |
| | 28 | |
| | 29 | === Функционални зависности === |
| | 30 | |
| | 31 | Ги идентификуваме сите функционални зависности кои важат глобално во универзалната релација. |
| | 32 | |
| | 33 | '''F = {''' |
| | 34 | * '''FD1:''' user_id → username, password, email, role |
| | 35 | * '''FD2:''' username → user_id |
| | 36 | * '''FD3:''' email → user_id |
| | 37 | * '''FD4:''' portfolio_id → balance, user_id |
| | 38 | * '''FD5:''' user_id → portfolio_id |
| | 39 | * '''FD6:''' stock_id → stock_symbol, stock_name, current_price, last_price, percentage, turnover, last_updated |
| | 40 | * '''FD7:''' stock_symbol → stock_id |
| | 41 | * '''FD8:''' holding_id → holding_quantity, avg_price, portfolio_id, stock_id |
| | 42 | * '''FD9:''' history_id → history_price, history_timestamp, stock_id |
| | 43 | * '''FD10:''' trade_id → trade_type, trade_status, trade_quantity, price_per_unit, trade_timestamp, trade_stock_symbol, portfolio_id |
| | 44 | * '''FD11:''' transaction_id → txn_type, txn_quantity, txn_price, txn_timestamp, txn_origin, user_id, stock_id |
| | 45 | * '''FD12:''' watchlist_id → price_above, price_below, user_id, stock_id |
| | 46 | * '''FD13:''' oauth_token → oauth_email, oauth_provider, oauth_expires_at, oauth_created_at, user_id |
| | 47 | '''}''' |
| | 48 | |
| | 49 | |
| | 50 | === Кандидат клучеви и примарен клуч === |
| | 51 | |
| | 52 | |
| | 53 | ==== Класификација на атрибути (Лева / Десна страна) ==== |
| | 54 | |
| | 55 | ||= Атрибут =||= Лева страна =||= Десна страна =||= Класификација =|| |
| | 56 | || user_id || ✓ (FD1, FD5) || ✓ (FD2, FD3, FD4, FD11, FD12, FD13) || и лево и десно || |
| | 57 | || username || ✓ (FD2) || ✓ (FD1) || и лево и десно || |
| | 58 | || password || ✗ || ✓ (FD1) || само десно || |
| | 59 | || email || ✓ (FD3) || ✓ (FD1) || и лево и десно || |
| | 60 | || role || ✗ || ✓ (FD1) || само десно || |
| | 61 | || auth_provider || ✗ || ✗ || '''само лево''' || |
| | 62 | || portfolio_id || ✓ (FD4) || ✓ (FD5, FD8, FD10) || и лево и десно || |
| | 63 | || balance || ✗ || ✓ (FD4) || само десно || |
| | 64 | || holding_id || ✓ (FD8) || ✗ || '''само лево''' || |
| | 65 | || holding_quantity || ✗ || ✓ (FD8) || само десно || |
| | 66 | || avg_price || ✗ || ✓ (FD8) || само десно || |
| | 67 | || stock_id || ✓ (FD6) || ✓ (FD7, FD8, FD9, FD11, FD12) || и лево и десно || |
| | 68 | || stock_symbol || ✓ (FD7) || ✓ (FD6) || и лево и десно || |
| | 69 | || stock_name || ✗ || ✓ (FD6) || само десно || |
| | 70 | || current_price || ✗ || ✓ (FD6) || само десно || |
| | 71 | || last_price || ✗ || ✓ (FD6) || само десно || |
| | 72 | || percentage || ✗ || ✓ (FD6) || само десно || |
| | 73 | || turnover || ✗ || ✓ (FD6) || само десно || |
| | 74 | || last_updated || ✗ || ✓ (FD6) || само десно || |
| | 75 | || history_id || ✓ (FD9) || ✗ || '''само лево''' || |
| | 76 | || history_price || ✗ || ✓ (FD9) || само десно || |
| | 77 | || history_timestamp || ✗ || ✓ (FD9) || само десно || |
| | 78 | || trade_id || ✓ (FD10) || ✗ || '''само лево''' || |
| | 79 | || trade_type || ✗ || ✓ (FD10) || само десно || |
| | 80 | || trade_status || ✗ || ✓ (FD10) || само десно || |
| | 81 | || trade_quantity || ✗ || ✓ (FD10) || само десно || |
| | 82 | || price_per_unit || ✗ || ✓ (FD10) || само десно || |
| | 83 | || trade_timestamp || ✗ || ✓ (FD10) || само десно || |
| | 84 | || trade_stock_symbol || ✗ || ✓ (FD10) || само десно || |
| | 85 | || transaction_id || ✓ (FD11) || ✗ || '''само лево''' || |
| | 86 | || txn_type || ✗ || ✓ (FD11) || само десно || |
| | 87 | || txn_quantity || ✗ || ✓ (FD11) || само десно || |
| | 88 | || txn_price || ✗ || ✓ (FD11) || само десно || |
| | 89 | || txn_timestamp || ✗ || ✓ (FD11) || само десно || |
| | 90 | || txn_origin || ✗ || ✓ (FD11) || само десно || |
| | 91 | || watchlist_id || ✓ (FD12) || ✗ || '''само лево''' || |
| | 92 | || price_above || ✗ || ✓ (FD12) || само десно || |
| | 93 | || price_below || ✗ || ✓ (FD12) || само десно || |
| | 94 | || oauth_token || ✓ (FD13) || ✗ || '''само лево''' || |
| | 95 | || oauth_email || ✗ || ✓ (FD13) || само десно || |
| | 96 | || oauth_provider || ✗ || ✓ (FD13) || само десно || |
| | 97 | || oauth_expires_at || ✗ || ✓ (FD13) || само десно || |
| | 98 | || oauth_created_at || ✗ || ✓ (FD13) || само десно || |
| | 99 | |
| | 100 | ==== Атрибути кои се појавуваат САМО на лева страна ==== |
| | 101 | |
| | 102 | Овие атрибути мора да бидат дел од секој кандидат клуч, бидејќи не можат да се изведат од ниедна FD: |
| | 103 | |
| | 104 | * '''holding_id''' - мора да биде дел од секој кандидат клуч |
| | 105 | * '''history_id''' - мора да биде дел од секој кандидат клуч |
| | 106 | * '''trade_id''' - мора да биде дел од секој кандидат клуч |
| | 107 | * '''transaction_id''' - мора да биде дел од секој кандидат клуч |
| | 108 | * '''watchlist_id''' - мора да биде дел од секој кандидат клуч |
| | 109 | * '''oauth_token''' - мора да биде дел од секој кандидат клуч |
| | 110 | * '''auth_provider''' - мора да биде дел од секој кандидат клуч (не учествува во ниедна FD; изводливо само преку себе) |
| | 111 | |
| | 112 | ==== Пресметка на затворач ==== |
| | 113 | |