| 290 | | === Lossless Join Test |
| 291 | | Секоја декомпозиција направена при нормализацијата е lossless, односно со JOIN операција може целосно да се реконструира оригиналната релација без губење на информации. |
| 292 | | |
| 293 | | Декомпозицијата на релација R(X) во R1(A) и R2(B) е lossless ако важи: |
| 294 | | - (A ∩ B) → A или (A ∩ B) → B |
| 295 | | |
| 296 | | ==== 1 |
| 297 | | TRANSACTION_ACCOUNT_WITH_USER_DATA |
| 298 | | |
| 299 | | - R(transaction_account_id, account_name, balance, user_id, user_name, email) |
| 300 | | - R1(transaction_account_id, account_name, balance, user_id) |
| 301 | | - R2(user_id, user_name, email) |
| 302 | | |
| 303 | | R1 ∩ R2 = {user_id} |
| 304 | | |
| 305 | | - {transaction_account_id} → {user_id} |
| 306 | | - {user_id} → {user_name, email} |
| 307 | | |
| 308 | | (user_id) → R2 |
| 309 | | ⇒ Декомпозицијата е lossless |
| 310 | | |
| 311 | | ==== 2 |
| 312 | | TRANSACTION_WITH_TAG_NAME |
| 313 | | |
| 314 | | - R(transaction_id, transaction_name, amount, net_amount, date, tag_id, tag_name) |
| 315 | | - R1(transaction_id, transaction_name, amount, net_amount, date, tag_id) |
| 316 | | - R2(tag_id, tag_name) |
| 317 | | |
| 318 | | R1 ∩ R2 = {tag_id} |
| 319 | | |
| 320 | | - {tag_id} → {tag_name} |
| 321 | | |
| 322 | | (tag_id) → R2 |
| 323 | | ⇒ Декомпозицијата е lossless |
| 324 | | |
| 325 | | ==== 3 |
| 326 | | |
| 327 | | TRANSACTION_ACCOUNT_WITH_USER_DATA → TRANSACTION_ACCOUNT + USER |
| 328 | | |
| 329 | | - R(transaction_account_id, account_name, balance, user_id, user_name, email) |
| 330 | | - R1(transaction_account_id, account_name, balance, user_id) |
| 331 | | - R2(user_id, user_name, email) |
| 332 | | |
| 333 | | R1 ∩ R2 = {user_id} |
| 334 | | |
| 335 | | - {user_id} → {user_name, email} |
| 336 | | |
| 337 | | (user_id) → R2 |
| 338 | | ⇒ Декомпозицијата е lossless |
| 339 | | |
| 340 | | ==== 4 |
| 341 | | TRANSACTION_WITH_TAG_NAME → TRANSACTION + TAG_ASSIGNED_TO_TRANSACTION |
| 342 | | |
| 343 | | - R(transaction_id, transaction_name, amount, net_amount, date, tag_id) |
| 344 | | - R1(transaction_id, transaction_name, amount, net_amount, date) |
| 345 | | - R2(transaction_id, tag_id) |
| 346 | | |
| 347 | | R1 ∩ R2 = {transaction_id} |
| 348 | | |
| 349 | | - {transaction_id} → {transaction_name, amount, net_amount, date} |
| 350 | | |
| 351 | | (transaction_id) → R1 |
| 352 | | ⇒ Декомпозицијата е lossless |
| 353 | | |
| 354 | | ==== 5 |
| 355 | | TAG |
| 356 | | |
| 357 | | - R(tag_id, tag_name) |
| 358 | | - R1(tag_id, tag_name) |
| 359 | | |
| 360 | | (Нема реална декомпозиција – табелата е веќе атомска) |
| 361 | | ⇒ Тривијално lossless |
| 362 | | |
| 363 | | ==== 4 |
| 364 | | TRANSACTION_BREAKDOWN |
| 365 | | |
| 366 | | - R(transaction_breakdown_id, transaction_id, transaction_account_id, spent_amount, earned_amount) |
| 367 | | |
| 368 | | Не е извршена декомпозиција, примарниот клуч функционално ги определува сите атрибути |
| 369 | | ⇒ Нема потреба од lossless join тест |
| 370 | | |