| | 183 | === Lossless Join Test |
| | 184 | Секоја декомпозиција направена при нормализацијата е lossless, односно со JOIN операција може целосно да се реконструира оригиналната релација без губење на информации. |
| | 185 | |
| | 186 | Декомпозицијата на релација R(X) во R1(A) и R2(B) е lossless ако важи: |
| | 187 | - (A ∩ B) → A или (A ∩ B) → B |
| | 188 | |
| | 189 | ==== 1 |
| | 190 | TRANSACTION_ACCOUNT_WITH_USER_DATA |
| | 191 | |
| | 192 | - R(transaction_account_id, account_name, balance, user_id, user_name, email) |
| | 193 | - R1(transaction_account_id, account_name, balance, user_id) |
| | 194 | - R2(user_id, user_name, email) |
| | 195 | |
| | 196 | R1 ∩ R2 = {user_id} |
| | 197 | |
| | 198 | - {transaction_account_id} → {user_id} |
| | 199 | - {user_id} → {user_name, email} |
| | 200 | |
| | 201 | (user_id) → R2 |
| | 202 | ⇒ Декомпозицијата е lossless |
| | 203 | |
| | 204 | ==== 2 |
| | 205 | TRANSACTION_WITH_TAG_NAME |
| | 206 | |
| | 207 | - R(transaction_id, transaction_name, amount, net_amount, date, tag_id, tag_name) |
| | 208 | - R1(transaction_id, transaction_name, amount, net_amount, date, tag_id) |
| | 209 | - R2(tag_id, tag_name) |
| | 210 | |
| | 211 | R1 ∩ R2 = {tag_id} |
| | 212 | |
| | 213 | - {tag_id} → {tag_name} |
| | 214 | |
| | 215 | (tag_id) → R2 |
| | 216 | ⇒ Декомпозицијата е lossless |
| | 217 | |
| | 218 | ==== 3 |
| | 219 | TRANSACTION → TAG_ASSIGNED_TO_TRANSACTION |
| | 220 | |
| | 221 | - R(transaction_id, transaction_name, amount, net_amount, date, tag_id) |
| | 222 | - R1(transaction_id, transaction_name, amount, net_amount, date) |
| | 223 | - R2(transaction_id, tag_id) |
| | 224 | |
| | 225 | R1 ∩ R2 = {transaction_id} |
| | 226 | |
| | 227 | - {transaction_id} → {transaction_name, amount, net_amount, date} |
| | 228 | |
| | 229 | (transaction_id) → R1 |
| | 230 | ⇒ Декомпозицијата е lossless |
| | 231 | |
| | 232 | ==== 4 |
| | 233 | TRANSACTION_ACCOUNT_WITH_USER_DATA → TRANSACTION_ACCOUNT + USER |
| | 234 | |
| | 235 | - R(transaction_account_id, account_name, balance, user_id, user_name, email) |
| | 236 | - R1(transaction_account_id, account_name, balance, user_id) |
| | 237 | - R2(user_id, user_name, email) |
| | 238 | |
| | 239 | R1 ∩ R2 = {user_id} |
| | 240 | |
| | 241 | - {user_id} → {user_name, email} |
| | 242 | |
| | 243 | (user_id) → R2 |
| | 244 | ⇒ Декомпозицијата е lossless |
| | 245 | |
| | 246 | ==== 5 |
| | 247 | TAG |
| | 248 | |
| | 249 | - R(tag_id, tag_name) |
| | 250 | - R1(tag_id, tag_name) |
| | 251 | |
| | 252 | (Нема реална декомпозиција – табелата е веќе атомска) |
| | 253 | ⇒ Тривијално lossless |
| | 254 | |
| | 255 | ==== 6 |
| | 256 | TRANSACTION_BREAKDOWN |
| | 257 | |
| | 258 | - R(transaction_breakdown_id, transaction_id, transaction_account_id, spent_amount, earned_amount) |
| | 259 | |
| | 260 | Не е извршена декомпозиција, примарниот клуч функционално ги определува сите атрибути |
| | 261 | ⇒ Нема потреба од lossless join тест |
| | 262 | |
| | 263 | === |
| | 264 | |
| | 265 | Сите функционални зависности можат да се проверат локално во поединечни табели, без потреба од JOIN операции, oва значи дека шемата е dependency-preserving, lossless-join и е во BCNF. |
| | 266 | |
| | 267 | == Заклучок |
| | 268 | Со примената на формална анализа на функционални зависности, правилен избор на примарни клучеви и проверка со lossless-join тест се елиминираат сите аномалии, се обезбедува логичка коректност и се добива шема погодна за имплементација во релациона датабаза. |
| | 269 | |