Cum se descompune această relație în relații 3NF?

Astăzi am citit despre algoritmul de descompunere 3NF. Scria:

  1. Găsiți o bază minimă de F, spuneți G
  2. Pentru fiecare FD X → A în G, folosiți {X, A} ca schemă a uneia dintre relațiile din descompunere
  3. Dacă niciunul dintre seturile de relații de la Pasul 2 nu este o supercheie pentru R, adăugați o altă relație a cărei schemă este o cheie pentru R

Vreau să descompun această relație în 3NF.

R(A,B,C) S={A→B, A→C, B→A, B→C, C→A, C→ B, AB→ C, BC→A, AC→B, A→BC, B→AC, C→AB} 

După cum putem vedea, cheia lui R este: {A},{B},{C}

S are mai multe baze minime, precum:

  1. {A→B, B→A, B→C, C→B} și
  2. {A→B, B→C, C→A}

Problema este că, dacă folosim prima bază minimă, atunci descompunem R în 2 relații : (A, B), (B, C).

Dacă folosim a doua bază minimă, R se transformă în: (A, B), (B, C), (C, A).

Întrebarea mea este: care este corectă?

Răspuns

În primul rând, rețineți că relația inițială este deja în a treia formă normală, deoarece fiecare atribut este prim (fiecare atribut este o cheie, de fapt), astfel încât definiția 3NF este respectată.

Apoi, rețineți că algoritmul este incomplet. Pașii sunt:

  1. Găsiți o bază minimă de F, spuneți G
  2. Pentru fiecare grup de FD cu același partea stângă, X → A 1 , X → A 2 , …, X → A n în G, utilizați {X, A 1 , A 2 , …, A n } ca schemă a uneia dintre relațiile din descompunere
  3. Ștergeți toate relațiile ale căror atribute sunt conținute într-o altă relație.
  4. Dacă niciunul dintre seturile de relații de la Pasul 2 nu este o supercheie pentru R, adăugați o altă relație a cărei schemă este o cheie pentru R.

Deci, în primul caz, obțineți trei grupuri de dependențe:

A → B B → A B → C C → B 

care produc trei relații, R 1 (A, B), R 2 (A, B, C), R 3 (B, C) și, urmând algoritmul, obțineți ca rezultat numai R 2 , deoarece celelalte două au atribute conținute în ele.

Deci aveți două ieșiri diferite din algoritm, în funcție de baza minimă utilizată (care la rândul său depinde de ordinea în care luați în considerare dependențele atunci când calculați acoperirea minimă).

Deci, răspunsul la întrebarea dvs.:

care unul este corect?

este: ambele sunt corecte , deoarece ambele îndeplinesc definiția 3NF. Ați descoperit pur și simplu că algoritmul de sinteză pentru descompunerea unei relații în 3NF poate produce soluții diferite.

O întrebare diferită este: care este „mai bun” și, bineînțeles, soluția cu o singură relație este „mai bună” , deoarece nu trebuie să vă alăturați tabelelor atunci când faceți interogări.

Desigur, dacă s-ar putea verifica la început dacă relația este deja în 3NF, atunci poate evita aplicarea algoritmului. Dar acest lucru în general nu se poate face, deoarece verificarea necesită calculul exponențial al tuturor cheilor, pentru a găsi atributele principale ale relației.

Comentarii

  • Vă mulțumim pentru răspuns! Dar cum ați produs 3 relații: R1 (A, B), R2 (A, B, C), R3 (B, C)? Am crezut că are doar R1 și R3. R2 este relația inițială.
  • Pentru al doilea pas al algoritmului corect, există două dependențe cu aceeași parte din stânga, B → A și B → C, deci ar trebui să puneți toate atributele împreună și să obțineți relația (A, B, C). Este dictat doar de algoritm.
  • Uau, nu ' nu știam despre acel al doilea pas. Am luat algoritmul dintr-o carte numită A First Course in Database System - 3rd edition. Pe care ar trebui să îl urmez acum?
  • Acest algoritm nu este complet. Toate cărțile importante despre bazele de date au algoritmul pe care l-am descris în răspuns.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *