1 | | == Нормализација (верзија 1) |
2 | | |
3 | | === Исполнува услов за 1NF |
4 | | |
5 | | Сите табели имаат соодветен примарен клуч и правилно се референцирани надворешните клучеви. |
6 | | |
7 | | |
8 | | === Исполнува услов за 2NF |
9 | | |
10 | | Нема парцијална зависност, атрибутите да зависат од дел од композитен клуч. |
11 | | |
12 | | |
13 | | === Исполнува услов 3NF |
14 | | |
15 | | Во сите табели колоните кои немаат функција за чување на примарен клуч, не се зависни една од друга, туку од нивниот соодветен примарен клуч. Нема транзитивна зависност. |
16 | | |
17 | | == Нормализација (верзија 2) - определување функциски зависности и да нема нешто со исто име на атрибут |
18 | | |
19 | | === Функционални зависности |
20 | | |
21 | | account Table: |
22 | | id → username, email, password, balance |
23 | | |
24 | | transaction Table: |
25 | | id → amount, currency, type, timestamp, account_id |
26 | | |
27 | | transfer Table: |
28 | | id → s_id, r_id |
29 | | |
30 | | deposit Table: |
31 | | id → account_id, amount, timestamp |
32 | | |
33 | | withdraw Table: |
34 | | id → account_id, amount, timestamp |
35 | | |
36 | | transferred_money Table: |
37 | | id → s_account_id, r_account_id, t_id, currency |
38 | | |
39 | | === Boyce-Code |
40 | | |
41 | | '''1. account Table - (T)''' |
42 | | |
43 | | '''Колони:''' id, username, email, password, balance |
44 | | |
45 | | '''Функционални зависности:''' id → username, email, password, balance |
46 | | |
47 | | '''Анализа:''' id е примарниот клуч од кој зависат сите останати атрибути, па според тоа тој е и суперклучот. |
48 | | |
49 | | Нема функционални зависности во кои детерминантата не е суперклуч. |
50 | | |
51 | | '''Заклучок:''' Account табелата ја задоволува BCNF. |
52 | | |
53 | | |
54 | | '''2. transaction Table - (N)''' |
55 | | |
56 | | '''Колони:''' id, amount, currency, type, timestamp, account_id |
57 | | |
58 | | '''Функционални зависности:''' |
59 | | |
60 | | * id → amount, currency, type, timestamp, account_id |
61 | | |
62 | | * account_id, timestamp → amount, currency, type |
63 | | |
64 | | '''Анализа:''' id е примарниот клуч и ги одредува останатите атрибути, па затоа тој е суперклуч. |
65 | | |
66 | | |
67 | | account_id, timestamp → amount, currency, type е проблематична зависност. Иако account_id и timestamp можат да се идентификуваат за трансакција, тие не се супер клуч. Ова значи account_id, timestamp не е суперклуч и можат да ја прекршат BCNF. |
68 | | |
69 | | '''Заклучок:''' Transaction табелата не ја задоволува BCNF затоа што account_id, timestamp не прават суперклуч, но ги одредуваат другите атрибути (amount, currency, type). |
70 | | |
71 | | |
72 | | '''3. transfer Table - (T)''' |
73 | | |
74 | | '''Колони:''' id, s_id, r_id |
75 | | |
76 | | '''Функционални зависности:''' id → s_id, r_id |
77 | | |
78 | | '''Анализа:''' id е примарен клуч и тој уникатно ги одредува s_id и r_id. |
79 | | |
80 | | Според тоа тој е супер клуч. |
81 | | |
82 | | Нема функционални зависности во кои детерминантата не е суперклуч. |
83 | | |
84 | | '''Заклучок:''' Transfer табелата ја задоволува BCNF. |
85 | | |
86 | | '''4. deposit Table - (N)''' |
87 | | |
88 | | '''Колони:''' id, account_id, amount, timestamp |
89 | | |
90 | | '''Функционални зависности:''' |
91 | | |
92 | | |
93 | | * id → account_id, amount, timestamp |
94 | | |
95 | | * account_id, timestamp → amount |
96 | | |
97 | | '''Анализа:''' id e примарниот клуч кој ги одредува сите останати атрибути, според тоа тој е и суперклуч. |
98 | | |
99 | | |
100 | | account_id, timestamp → amount можат да биде проблематична зависност. Ако има повеќе повлекување на пари во исто време ова ја нарушува BCNF. |
101 | | |
102 | | '''Заклучок:''' Deposit табелата не ја задоволува BCNF затоа што account_id, timestamp не се суперклуч, но го одредуваат amount. |
103 | | |
104 | | |
105 | | |
106 | | '''5. withdraw Table - (N)''' |
107 | | |
108 | | '''Колони:''' id, account_id, amount, timestamp |
109 | | |
110 | | '''Функционални зависности:''' |
111 | | |
112 | | * id → account_id, amount, timestamp |
113 | | |
114 | | * account_id, timestamp → amount |
115 | | |
116 | | '''Анализа:''' id е примарниот клуч и ги одредува останатите атрибути, па затоа тој е суперклуч. |
117 | | |
118 | | account_id, timestamp → amount можат да биде проблематична зависност. Ако има повеќе повлекување на пари во исто време ова ја нарушува BCNF. |
119 | | |
120 | | '''Заклучок:''' Withdraw табелата не ја задоволува BCNF затоа што account_id, timestamp не се суперклуч, но го одредуваат amount. |
121 | | |
122 | | |
123 | | |
124 | | '''6. transferred_money Table - (T)''' |
125 | | |
126 | | '''Колони:''' id, s_account_id, r_account_id, t_id, currency |
127 | | |
128 | | '''Функционални зависности:''' id → s_account_id, r_account_id, t_id, currency |
129 | | |
130 | | '''Анализа:''' |
131 | | |
132 | | id е примарниот клуч кој се користи и како суперклуч од кои сите други атрибути зависат. |
133 | | |
134 | | s_account_id, r_account_id, t_id можат да се употребат заедно како еден суперклуч, бидејќи претставуваат валидна нетривијална зависност која може да се корисни приидентификација на една редица |
135 | | |
136 | | '''Заклучок:''' Transferred_money табелата ја задоволува BCNF. |
137 | | |
138 | | === Подобрување на базата |
139 | | |
140 | | |
141 | | account Table(останува иста): |
142 | | id → username, email, password, balance |
143 | | |
144 | | transaction Table(останува иста): |
145 | | id → amount, currency, type, timestamp, account_id |
146 | | |
147 | | transfer Table(останува иста): |
148 | | id → s_id, r_id |
149 | | |
150 | | deposit Table(се менуваат атрибутите): |
151 | | id → account_id, transaction_id, amount |
152 | | |
153 | | withdraw Table(се менуваат атрибутите): |
154 | | id → account_id, transaction_id, amount |
155 | | |
156 | | transferred_money Table: |
157 | | id → s_account_id, r_account_id, t_id, currency |
158 | | |
159 | | |
160 | | Направив промени во deposit и withdraw табелата такашто timestamp го исфрлив, а додадов атрибут transaction_id кој се референцира кон табелата transaction. |
161 | | Со ова се исполнуваат исте услови 1NF,2NF, 3NF и целата BCNF. На тој начин ако ги користиме account_id и transaction_id за одредување на amount атрибутот, тие два атрибута како суперклуч нема да ја нарушат Boyce-Code шемата и се избегнува дуплирање на податоците во табелите. |
| 1 | * [wiki:Normalization/prva_verzija верзија 1] |