| 7 | | Кај many-to-many табелите ({{{TRANSACTION_BREAKDOWN}}} и {{{TAG_ASSIGNED_TO_TRANSACTION}}}) користам surrogate клучеви заради конзистентност на целата шема иако композитни клучеви би биле построго нормализирано решение, surrogate пристапот обезбедува унифицирана структура и јасност. |
| | 7 | ||= user_id =||= user_name =||= email =||= password =||= transaction_account_id =||= account_name =||= balance =||= transaction_id =||= transaction_name =||= amount =||= net_amount =||= date =||= transaction_breakdown_id =||= spent_amount =||= earned_amount =||= tag_id =||= tag_name =|| |
| | 8 | || 1|| james || james@fein.com || $2y$10$rcqLdIzMcYfmGFWCP3kix.JNTOzjIp0xVehMd11wzaanAXUDFLQMu || 1, 2 || credit card, cash || .+5000, +1200 || 1, 2 || electricity bill, burger || -1800, -800 || -1800, -200 || 18:03:25 Sep 26, 2025, 12:43:00 Sep 26, 2025 || 1,2 || -1800, -800 || 0, +600 || 1, 2 || bills, food || |
| | 9 | || 2|| anita || anita@fein.com || $2y$10$CsSsqA.FFhBR/TWCZCUWYOPxYA.HmGb7ULQPgJGhv3vQS2xRqluYm || 1 || debit card || +3200 || 1 || nail polish || -200 || -200 || 19:31:32 Sep 12 2025 || 1 || -200 || 0 || 1 || beauty || |
| 14 | | {{{user_id → user_name, email, password}}} |
| | 14 | Форма во која повторно има една табела, но овојпат, таа е ограничена со следниве работи: |
| | 15 | - Подредувањето на редовите не претставува никакво значење |
| | 16 | - Не се мешаат типови на податоци во една ќелија |
| | 17 | - Табелата има примарен клуч(user_id) |
| | 18 | - Нема повторувачки групи, сите што биле во денормализираната форма сега се во посебен ред |
| | 19 | |
| | 20 | ||= user_id =||= user_name =||= email =||= password =||= transaction_account_id =||= account_name =||= balance =||= transaction_id =||= transaction_name =||= amount =||= net_amount =||= date =||= transaction_breakdown_id =||= spent_amount =||= earned_amount =||= tag_id =||= tag_name =|| |
| | 21 | || 1|| james || james@fein.com || $2y$10$rcqLdIzMcYfmGFWCP3kix.JNTOzjIp0xVehMd11wzaanAXUDFLQMu || 1|| credit card || +5000|| 1|| electricity bill || -1800|| -1800|| 18:03:25 Sep 26, 2025 || 1|| -1800|| 0|| 1|| bills || |
| | 22 | || 1|| james || james@fein.com || $2y$10$rcqLdIzMcYfmGFWCP3kix.JNTOzjIp0xVehMd11wzaanAXUDFLQMu || 2|| cash || +1200|| 2|| burger || -800|| -200|| 12:43:00 Sep 26, 2025 || 2|| -800|| +600|| 2|| food || |
| | 23 | || 2|| anita || anita@fein.com || $2y$10$CsSsqA.FFhBR/TWCZCUWYOPxYA.HmGb7ULQPgJGhv3vQS2xRqluYm || 3|| debit card || +3200|| 3|| nail polish || -200|| -200|| 19:31:32 Sep 12 2025 || 3|| -200|| 0|| 3|| beauty || |
| 25 | | {{{transaction_account_id → account_name, balance, user_id}}} |
| | 31 | ||= USER =||= =||= =||= =|| |
| | 32 | || user_id || user_name || email || password || |
| | 33 | || 1 || james || james@fein.com || $2y$10$rcqLdIzMcYfmGFWCP3kix.JNTOzjIp0xVehMd11wzaanAXUDFLQMu || |
| | 34 | || 2 || anita || anita@fein.com || $2y$10$CsSsqA.FFhBR/TWCZCUWYOPxYA.HmGb7ULQPgJGhv3vQS2xRqluYm || |
| | 35 | // |
| | 36 | ||= TRANSACTION_ACCOUNT =||= =||= =||= =|| |
| | 37 | || transaction_account_id || account_name || balance || user_id || |
| | 38 | || 1 || credit card || +5000 || 1 || |
| | 39 | || 2 || cash || +1200 || 1 || |
| | 40 | || 3 || debit card || +3200 || 2 || |
| | 41 | || || || || FK || |
| | 42 | // |
| | 43 | ||= TRANSACTION =||= =||= =||= =||= =|| |
| | 44 | || transaction_id || transaction_name || amount || net_amount || date || |
| | 45 | || 1 || electricity bill || -1800 || -1800 || 18:03:25 Sep 26, 2025 || |
| | 46 | || 2 || burger || -800 || -200 || 12:43:00 Sep 26, 2025 || |
| | 47 | || 3 || nail polish || -200 || -200 || 19:31:32 Sep 12 2025 || |
| | 48 | // |
| | 49 | ||= TRANSACTION_BREAKDOWN =||= =||= =||= =||= =|| |
| | 50 | || transaction_breakdown_id || transaction_id || transaction_account_id || spent_amount || earned_amount || |
| | 51 | || 1 || 1 || 1 || -1800 || 0 || |
| | 52 | || 2 || 2 || 2 || -800 || +600 || |
| | 53 | || 3 || 3 || 3 || -200 || 0 || |
| | 54 | || || FK || FK || || || |
| | 55 | // |
| | 56 | ||= TAG =||= =|| |
| | 57 | || tag_id || tag_name || |
| | 58 | || 1 || bills || |
| | 59 | || 2 || food || |
| | 60 | || 3 || beauty || |
| | 61 | // |
| | 62 | ||= TAG_ASSIGNED_TO_TRANSACTION =||= =|| |
| | 63 | || transaction_id || tag_id || |
| | 64 | || 1 || 1 || |
| | 65 | || 2 || 2 || |
| | 66 | || 3 || 3 || |
| | 67 | || FK || FK || |
| 42 | | ==== 4. TRANSACTION_BREAKDOWN |
| 43 | | |
| 44 | | TRANSACTION_BREAKDOWN (__**transaction_breakdown_id__**, transaction_id* (TRANSACTION), transaction_account_id* (TRANSACTION_ACCOUNT), spent_amount, earned_amount) |
| 45 | | |
| 46 | | {{{transaction_breakdown_id → transaction_id, transaction_account_id, spent_amount, earned_amount}}} |
| 47 | | |
| 48 | | - 1NF: Сите атрибути се атомски, нема повторувачки групи. |
| 49 | | - 2NF: Сите табели имаат едноатрибутни surrogate примарни клучеви → нема делумни зависности. |
| 50 | | - 3NF/BCNF: Сите атрибути кои не се клучеви зависат само од примарниот клуч. |
| 51 | | Го задржав surrogate примарниот клуч за унифициран пристап. |
| 52 | | |
| 53 | | ==== 5. TAG |
| 54 | | |
| 55 | | TAG (__**tag_id__**, **tag_name**) |
| 56 | | |
| 57 | | {{{tag_id → tag_name}}} |
| 58 | | |
| 59 | | tag_name → tag_id бидејќи имињата на тагови се уникатни. |
| 60 | | |
| 61 | | - 1NF: Сите атрибути се атомски, нема повторувачки групи. |
| 62 | | - 2NF: Сите табели имаат едноатрибутни surrogate примарни клучеви → нема делумни зависности. |
| 63 | | - 3NF/BCNF: Сите атрибути кои не се клучеви зависат само од примарниот клуч. |
| 64 | | Го дефинирав UNIQUE (tag_name) за да обезбедам интегритет. |
| 65 | | |
| 66 | | ==== 6. TAG_ASSIGNED_TO_TRANSACTION |
| 67 | | |
| 68 | | TAG_ASSIGNED_TO_TRANSACTION(__**tag_assigned_to_transaction_id**__, **tag_id*** (TAG), **transaction_id*** (TRANSACTION)) |
| 69 | | |
| 70 | | {{{tag_assigned_to_transaction_id → tag_id, transaction_id}}} |
| 71 | | |
| 72 | | - 1NF: Сите атрибути се атомски, нема повторувачки групи. |
| 73 | | - 2NF: Сите табели имаат едноатрибутни surrogate примарни клучеви → нема делумни зависности. |
| 74 | | - 3NF/BCNF: Сите атрибути кои не се клучеви зависат само од примарниот клуч. |
| 75 | | И овде користам surrogate клуч за конзистентност, но истовремено додадов UNIQUE(tag_id, transaction_id) за да спречам дупликати. |
| 76 | | |
| 77 | | **Шемата е во 3NF (практично BCNF) за сите табели. Единствениот свесен исклучок е {{{net_amount}}} во {{{TRANSACTION}}}, кој е додаден заради перформанси.** |
| | 76 | [wiki:NormalizationVer1 Верзија 1] |