Changes between Version 2 and Version 3 of Normalization


Ignore:
Timestamp:
12/23/25 16:25:07 (11 days ago)
Author:
211101
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v2 v3  
    11= Нормализација
    22
    3 Ја дизајнирав базата на податоци со surrogate примарни клучеви(system-generated identifier) со една атрибутна колона (на пр. {{{user_id}}}, {{{transaction_id }}}) за едноставност и конзистентност. Вака, секој атрибут кој што не е клуч, директно зависи од примарниот клуч, што значи дека шемата ги исполнува 1NF, 2NF и 3NF/BCNF.
     3== Денормализирана форма
    44
    5 Единствената намерна редундантност е колоната {{{net_amount}}} во {{{TRANSACTION}}}. Ја вклучив затоа што овозможува побрзи пребарувања и извештаи, иако е изведлива од {{{TRANSACTION_BREAKDOWN}}}. Ова беше свесен компромис заради перформанси.
     5Форма во кој има една табела во која се внесени сите ентитети и нивни релации помеѓу себе, без никакви правила
    66
    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 ||
    810
    9 === Анализа по Табела
    10 ==== 1. USER
    1111
    12 USER (**__user_id__**, **user_name**, **email**, **password**)
     12== Прва нормална форма
    1313
    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 ||
    1524
    16 - 1NF: Сите атрибути се атомски, нема повторувачки групи.
    17 - 2NF: Сите табели имаат едноатрибутни surrogate примарни клучеви → нема делумни зависности.
    18 - 3NF/BCNF: Сите атрибути кои не се клучеви зависат само од примарниот клуч.
    19 Додадов UNIQUE ограничување на email затоа што е природен идентификатор.
    2025
    21 ==== 2. TRANSACTION_ACCOUNT
     26== Втора нормална форма
    2227
    23 TRANSACTION_ACCOUNT (__**transaction_account_id**__, account_name, balance, user_id* (USER))
     28Форма во која секој атрибут добива своја табела и релациите помеѓу нив се претставени со надворешни клучеви, притоа следејќи го ова правило:
     29- Секој од атрибутите кој не е клуч, зависи од целосниот примарен клуч - со тоа се спречуваат аномалии на внесување, бришење и менување
    2430
    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 ||
    2668
    27 - 1NF: Сите атрибути се атомски, нема повторувачки групи.
    28 - 2NF: Сите табели имаат едноатрибутни surrogate примарни клучеви → нема делумни зависности.
    29 - 3NF/BCNF: Сите атрибути кои не се клучеви зависат само од примарниот клуч.
    3069
    31 ==== 3. TRANSACTION
     70== Трета нормална форма
    3271
    33 TRANSACTION (__**transaction_id__**, transaction_name, **amount**, net_amount, **date**)
    3472
    35 {{{transaction_id → transaction_name, amount, net_amount, date}}}
    3673
    37 Атрибутот {{{net_amount}}} може да се изведе од {{{TRANSACTION_BREAKDOWN}}}. Го задржав намерно заради перформанси, за да избегнам постојано пресметување. За да нема неконзистентност, ќе се одржува преку triggers и апликациска логика.
    38 - 1NF: Сите атрибути се атомски, нема повторувачки групи.
    39 - 2NF: Сите табели имаат едноатрибутни surrogate примарни клучеви → нема делумни зависности.
    40 - 3NF/BCNF: Сите атрибути кои не се клучеви зависат само од примарниот клуч, со свесен компромис.
     74==
    4175
    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]