Jak rozłożyć tę relację na relacje 3NF?

Dzisiaj czytałem o algorytmie dekompozycji 3NF. Jest napisane:

  1. Znajdź minimalną podstawę F, powiedz G
  2. Dla każdego FD X → A w G, użyj {X, A} jako schematu jednej z relacji w dekompozycji
  3. Jeśli żaden z zestawów relacji z Kroku 2 nie jest superkluczem dla R, dodaj kolejną relację, której schemat jest kluczem dla R

Chcę rozłożyć tę relację na 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} 

Jak widać, klucz R to: {A},{B},{C}

S ma kilka minimalnych podstaw, takich jak:

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

Problem polega na tym, że jeśli użyjemy pierwszej minimalnej podstawy, rozłożymy R na 2 relacje : (A, B), (B, C).

Jeśli użyjemy drugiej podstawy minimalnej, R zamienia się w: (A, B), (B, C), (C, A).

Moje pytanie brzmi: która z nich jest poprawna?

Odpowiedź

Przede wszystkim zwróć uwagę, że Oryginalna relacja jest już w trzeciej postaci normalnej, ponieważ każdy atrybut jest liczbą pierwszą (właściwie każdy atrybut jest kluczem), więc definicja 3NF jest przestrzegana.

Następnie zauważ, że algorytm jest niekompletny. Kroki są następujące:

  1. Znajdź minimalną podstawę F, powiedz G
  2. Dla każdej grupy FD o tym samym lewa część, X → A 1 , X → A 2 , …, X → A n w G, użyj {X, A 1 , A 2 , …, A n } jako schemat jednej z relacji w dekompozycji
  3. Usuń wszystkie relacje, których atrybuty są zawarte w innej relacji.
  4. Jeśli żaden z zestawów relacji z Kroku 2 nie jest superkluczem dla R, dodaj kolejną relację, której schemat jest kluczem dla R.

W pierwszym przypadku otrzymujemy trzy grupy zależności:

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

, które tworzą trzy relacje, R 1 (A, B), R 2 (A, B, C), R 3 (B, C) i zgodnie z algorytmem otrzymujesz wynik tylko R 2 , ponieważ pozostałe dwa mają zawarte w sobie atrybuty.

Więc masz dwa różne wyniki z algorytmu, w zależności od użytej minimalnej podstawy (która z kolei zależy od kolejność, w jakiej bierzesz pod uwagę zależności przy obliczaniu minimalnego pokrycia).

A więc odpowiedź na twoje pytanie:

które jeden jest poprawny?

to: oba są poprawne , ponieważ oba spełniają definicję 3NF. Po prostu odkryłeś, że algorytm syntezy do dekompozycji relacji w 3NF może dawać różne rozwiązania.

Inne pytanie brzmi: co jest „lepsze” i oczywiście rozwiązanie z jedną relacją jest „lepsze” , ponieważ nie musisz łączyć tabel podczas wykonywania zapytań.

Oczywiście, jeśli ktoś mógłby sprawdzić na początku, czy relacja jest już w 3NF, to może uniknąć zastosowania algorytmu. Ale generalnie nie można tego zrobić, ponieważ sprawdzenie wymaga wykładniczego obliczenia wszystkich kluczy w celu znalezienia głównych atrybutów relacji.

Komentarze

  • Dzięki za odpowiedź! Ale jak stworzyłeś 3 relacje: R1 (A, B), R2 (A, B, C), R3 (B, C)? Myślałem, że ma tylko R1 i R3. R2 jest oryginalną relacją.
  • W drugim kroku prawidłowego algorytmu istnieją dwie zależności z tą samą lewą częścią, B → A i B → C, więc powinieneś umieścić wszystkie atrybuty razem i uzyskać relacja (A, B, C). Jest to po prostu podyktowane algorytmem.
  • Wow, nie ' nie wiedziałem o tym drugim kroku. Algorytm zaczerpnąłem z książki o nazwie A First Course in Database System - 3rd edition. Którą z nich mam teraz przestrzegać?
  • Ten algorytm nie jest kompletny. Wszystkie główne książki o bazach danych mają algorytm, który opisałem w odpowiedzi.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *