Trzecia postać normalna

Trzecia Postac Normalna



To jest trzecia część serii Pięć form normalnych. Tytuły dwóch pierwszych części (samouczków) to pierwsza postać normalna, po której następuje druga postać normalna. W tej części serii wyjaśniono Trzecią Postać Normalną.

Wyjaśnienie jest zgodne z fabułą: zmarł ojciec i zostawił synowi trochę pieniędzy. Syn postanowił zainwestować pieniądze w sklep spożywczy. Sklep ogólnospożywczy, znany również jako sklep ogólnospożywczy, to mała firma zajmująca się handlem detalicznym, która otrzymuje artykuły codziennego użytku od dostawców i sprzedaje je indywidualnym klientom w okolicy.







W tym momencie sklep jest już zaopatrzony, a niektóre wyprzedaże zostały już dokonane. Syn, który jest właścicielem firmy, ma kilku pracowników, których w tym samouczku nazywa się urzędnikami. Właściciel i każdy pracownik może odbierać dostawy i dokonywać sprzedaży po zarejestrowaniu produktów.



Jednak przed uruchomieniem sklepu ani właściciel, ani pracownicy nie wiedzieli nic o normalnych formach. Więc wszystko zapisywali jako transakcje w jednej tabeli i jednym zeszycie. Nie mieli komputera.



Ty, czytelniku, ukończyłeś pięć części tej serii samouczków; jesteś teraz programistą baz danych. Właściciel sklepu spożywczego jest twoim przyjacielem. Odwiedziłeś sklep dwa dni temu i przeszkoliłeś właściciela oraz ekspedientów w produkcji stołu w jego pierwszej normalnej postaci. Wczoraj odwiedziłeś również sklep i przeszkoliłeś ich, jak stworzyć tabelę w drugiej postaci normalnej z pierwszej postaci normalnej.





Dzisiaj właśnie przybyłeś do sklepu z wizytą, aby poinstruować ich, jak utworzyć tabelę w trzeciej postaci normalnej z drugiej postaci normalnej. Wszystkie tabele, które mają obecnie, są w drugiej postaci normalnej. Tabele (według nazwy i nagłówków kolumn) to:

Produkty(identyfikator produktu, identyfikator kategorii, produkt)
Kategorie (identyfikator kategorii, kategoria)



Sales(saleID, klient, pracownik, data)
SaleDetails(saleID, productID, numberSold, sellPrice)

Zamówienia(identyfikator zamówienia, dostawca, pracownik, data)
OrderDetails(orderID, productID, numberBought, costPrice)

Klawisze pojedyncze lub złożone są podkreślone.

Po podsumowaniu tego, czego nauczano w ciągu ostatnich dwóch dni i zanim zdążyłeś cokolwiek zrobić, właściciel pyta:

„A co z numerami telefonów, adresami itp. dla klientów i pracowników?

A co z ilością w magazynie, poziomem ponownego zamówienia itp. dla produktów?
Czy potrzebują własnych, osobnych stołów, czy też powinny być wkomponowane w obecne stoły?”

Ty, programista bazy danych, odpowiedz:

„Gratulacje, właścicielu! Pośrednio wprowadziłeś problem trzeciej postaci normalnej.

Kontynuuj.

Inne niezbędne kolumny

Inne niezbędne kolumny są najpierw dodawane do poprzednich tabel, które znajdują się w 1NF i 2NF. Niektóre z poprzednich nazw kolumn zostały zmodyfikowane.

Tabela Kategorie powinna zawierać co najmniej następujące kolumny:

Kategorie (identyfikator kategorii, nazwa kategorii, opis)

Opis to krótki akapit opisujący kategorię. Ta tabela kategorii znajduje się już w 1NF, 2NF i 3NF. 3NF wyjaśniono poniżej:

Tabela Products powinna zawierać co najmniej następujące kolumny:

Produkty (identyfikator produktu, identyfikator kategorii, identyfikator dostawcy, nazwa produktu, cena jednostkowa, ilość w magazynie, poziom ponownego zamówienia)

Ponieważ każdy produkt jest sprzedawany, niski poziom (liczba) produktów zostanie osiągnięty, gdy produkt będzie musiał zostać ponownie zamówiony, więc klienci nie powinni przychodzić do sklepu i nie mieć produktu. Taka nieobecność nie służy biznesowi. ilośćInStock to numer konkretnego produktu w magazynie. Obejmuje to, co jest w sklepie i co jest na półce.

IDkategorii i IDdostawcy są kluczami obcymi. Dlatego mają podkreślenie kreską zamiast pojedynczego podkreślenia. Klucz obcy wyjaśniono poniżej. W poprzedniej części serii (Second Normal Form), categoryID był częścią klucza podstawowego z pojedynczym podkreśleniem ze względu na sposób jego pozyskania. Jednak z poniższego wyjaśnienia byłoby jasne, że identyfikator kategorii powinien być kluczem obcym (z podkreśleniem myślnikiem).

Ta tabela produktów jest już w 1NF, 2NF i 3NF. Zobacz, dlaczego jest w 3NF poniżej:

Tabela SaleDetails powinna zawierać co najmniej następujące kolumny:

SaleDetails(saleID, productID, unitSellingPrice, ilość, rabat)

Oczekuje się, że wartość rabatu przez większość czasu będzie wynosić zero. Rabat to rabat, który sklep daje klientowi.

Tabela OrderDetails powinna zawierać co najmniej następujące kolumny:

OrderDetails(orderID, productID, unitCostPrice, ilość, rabat)

Oczekuje się, że wartość rabatu przez większość czasu będzie wynosić zero. Rabat w tym przypadku to rabat, który dostawca daje sklepowi.

Jak widać poniżej, tabelę Produkty można rozpatrywać w 2NF lub 3NF. Tabele Sales i Order mają numer 3NF. Tylko tabela sprzedaży zostanie wykorzystana do wyjaśnienia problemu i rozwiązania. Tabela 3NF dla tabeli zamówień i tabeli produktów opiera się na podobnym rozumowaniu i zostałaby po prostu zacytowana.

Podczas dodawania kolumn tabela Sales wyglądałaby następująco:

Sales(identyfikator sprzedaży, dataSold customerName, telefon, adres, miasto, region, kod pocztowy, kraj, pracownik)

Siedem kolumn zastąpiło kolumnę klienta w oryginalnej tabeli. Ponieważ klientami są osoby z sąsiedztwa, komórki dla kolumn miasta, regionu (stanu), kodu pocztowego i kraju można pozostawić puste, chociaż w tym artykule nie są one puste.

Ta tabela sprzedaży nadal znajduje się w 2NF, ponieważ zasady 1NF i 2NF nie zostały naruszone. Należy jednak zauważyć, że w wierszu tabeli Sales klient (nazwa) został zastąpiony siedmioma komórkami wiersza klienta.

Uwaga: komórka adresowa zawiera numer domu, nazwę ulicy lub drogi oraz nazwę miejscowości, oddzielone przecinkami. Miasto można uznać za złożone z kilku miast. Chociaż przecinki oddzielają te poszczególne elementy łańcuchowe, tworzą one jedną wartość komórki, a nie trzy wartości komórek.

Kolumnę pracowników należy również zastąpić siedmioma takimi kolumnami. Jednak nie jest to zrobione w tym samouczku, aby zaoszczędzić czas i miejsce na nauczanie. Tak więc tabela Sales z danymi może wyglądać następująco:

Tabela sprzedaży — 2NF — bez identyfikatora klienta

Kolumna SaleID typu danych to liczba całkowita lub, lepiej, autoinkrementacja. Typ danych kolumny dateSold to data, a nie liczba, ponieważ zawiera znak „/”, który nie jest cyfrą. Typ danych dla pozostałych kolumn, w tym kolumny telefonu, to łańcuch (lub tekst). Wartość telefonu ma znak „-”, który nie jest cyfrą.

Zwróć uwagę, że w każdym wierszu klient (nazwa), podobnie jak w poprzedniej części serii, został zastąpiony siedmioma komórkami, z których jedna nadal zawiera nazwę klienta. Oznacza to, że dane klienta są jednostką. Obecnie nazwa-klienta identyfikuje pozostałe sześć danych z rzędu. Jeśli ta tabela jest zaprogramowana, wygodnie będzie identyfikować podmiot klienta w każdym wierszu za pomocą liczby całkowitej (bez autoinkrementacji). W takim przypadku kolumna customerID powinna poprzedzać nazwę klienta. Poprzednia tabela staje się:

Tabela sprzedaży – 2NF – Z identyfikatorem klienta

Istnieją trzy identyfikatory klientów: 1, 2 i 3, przy czym 1 występuje pięć razy w przypadku Johna Smitha, 2 występuje dwa razy w przypadku Jamesa Taylora, a 3 występuje raz w przypadku Susan Wright.

Zwróć uwagę, że niektóre identyfikatory klientów i osoby pozostające na ich utrzymaniu powtarzają się.

Reguły dla trzeciej postaci normalnej

Tabela jest w trzeciej postaci normalnej, jeśli spełnia następujące zasady:

  1. Powinien być już w drugiej postaci normalnej.
  2. I nie powinien mieć zależności przejściowej.

Następnie jeden z urzędników (pracowników) pyta: „Co to jest zależność przechodnia?”. A ty, twórca bazy danych, odpowiadasz: „To dobre pytanie!”

Zależność przechodnia

Prawdą jest, że w wierszu SaleID identyfikuje wszystkie wartości w wierszu; jednak customerID identyfikuje siedem wartości danych, ale nie identyfikuje pozostałych wartości identyfikowanych przez SaleID w tym wierszu. Innymi słowy, SaleID zależy od wartości dziesięciu komórek w każdym wierszu. Jednak identyfikator klienta zależy od wartości siedmiu komórek w tym samym wierszu, ale identyfikator klienta nie zależy od identyfikatora sprzedaży i innych wartości, od których zależy identyfikator sprzedaży.

Taka zależność dla identyfikatora klienta jest zależnością przechodnią. A identyfikator klienta jest nazywany kluczem obcym i jest podkreślony kreską w tej serii samouczków, The Five Normal Forms.

Załóżmy, że atrybut inny niż główny (wartość komórki innej niż podstawowa) zależy od innych atrybutów drugorzędnych, a dany atrybut inny niż główny (np. identyfikator klienta i jego elementy zależne) nie zależy od klucza podstawowego i reszty komórki wartości w rzędzie. Wtedy jest to zależność przechodnia.

Poprzednia tabela Sales z kluczem obcym i jego zależnościami powodowałaby problemy księgowe (anomalie).

Tabela sprzedaży od 2NF do 3NF

Aby rozwiązać problem związany z kluczem obcym i jego podmiotami zależnymi, usuń klucz obcy i jego podmioty zależne, aby utworzyć nową tabelę bez powtórzeń. Jednak nawet jeśli klucz obcy nie zależy od klucza podstawowego, klucz podstawowy zależy od klucza obcego. Tak więc kopia klucza obcego musi pozostać w tabeli nadrzędnej. W tym momencie nowa tabela sprzedaży jest zgodna z 1NF, 2NF i 3NF; jest to tabela nadrzędna. Nowa tabela podrzędna z poprzedniej tabeli Sales jest również zgodna z 1NF, 2NF i 3NF. Nazwa tabeli podrzędnej z kluczem obcym i jego podmiotami zależnymi to Klienci. Jeśli nie można znaleźć odpowiedniej nazwy, oznacza to, że coś poszło nie tak z analizą. Nowa tabela sprzedaży w 3NF to:

Końcowa tabela sprzedaży w 3NF

Ta tabela w 3NF ma taką samą liczbę wierszy jak ta w 2NF, ale z mniejszą liczbą kolumn.

Notacja tabeli dla tej końcowej tabeli Sales w 3NF to:

Sales(identyfikator sprzedaży, data sprzedaży, identyfikator klienta, identyfikator pracownika)

saleID to klucz podstawowy z pojedynczym podkreśleniem. identyfikator klienta to klucz obcy z podkreśleniem myślnikiem. identyfikator pracownika jest również kluczem obcym z podkreśleniem myślnikiem. Należy zauważyć, że sytuacja pracownika w tabeli Sprzedaż w 2NF jest taka sama jak sytuacja klienta. Identyfikator pracownika i jego własne osoby zależne muszą zostać ściągnięte, aby utworzyć inną tabelę; pozostaje kopia identyfikatora pracownika.

Uwaga: identyfikator sprzedaży, identyfikator klienta i identyfikator pracownika nie tworzą klucza złożonego. saleID jest zależny od identyfikatora klienta i identyfikatora pracownika.

Relacja między identyfikatorem sprzedaży a identyfikatorem klienta jest typu wiele do jednego.

Tabela klientów w 3NF

Ta tabela ma trzy wiersze zamiast 9 wierszy w tabeli 2NF Sales. W tej tabeli identyfikator klienta jest kluczem podstawowym. Jest taki sam jak klucz obcy w tabeli Sales, ale bez powtórzeń. Klucz obcy w tabeli Sales i klucz podstawowy w tabeli Customer łączą obie tabele.

Powtarzające się wiersze w tabeli Klient zostały usunięte, aby nie naruszać 1NF.

Jak czytelnik widzi, umieszczenie tabeli w 3NF rozwiązałoby również problem powtarzających się wierszy (nadmiarowość).

Notacja tabeli dla Customers Table to:

Klienci (identyfikator klienta, nazwa klienta, telefon, adres, miasto, region, kod pocztowy, kraj)

Ponownie odwiedzono tabelę produktów

Tabela produktów podana powyżej w formie notacji to:

Produkty (identyfikator produktu, identyfikator kategorii, identyfikator dostawcy, nazwa produktu, cena jednostkowa, ilość w magazynie, poziom ponownego zamówienia)

Kluczem podstawowym jest tutaj productID. IDkategorii i IDdostawcy są kluczami obcymi. Podobnie jak w przypadku tabeli Klient istnieje tabela Kategorie, w której kluczem podstawowym jest identyfikator_kategorii, oraz tabela Dostawca, w której kluczem podstawowym jest identyfikator_dostawcy.

Jeśli wartości komórek dla unitPrice, qualityInStock i reorderLevel pozostaną niezmienione, wówczas tabela Produkty w obecnej postaci jest rzeczywiście w formacie 3NF. Jeśli te wartości będą się zmieniać, to tabela Products, tak jak jest, jest w 2NF. W tej części serii samouczków zakłada się, że wartości te pozostają stałe w czasie.

Wszystkie stoły

Wszystkie stoły są teraz w 3NF. Są one pokazane jako:

Pracownicy (identyfikator pracownika, imię i nazwisko, telefon, adres, miasto, region, kod pocztowy, kraj, data urodzenia, data zatrudnienia, data zwolnienia)

Dostawcy (identyfikator dostawcy, nazwa, telefon, adres, miasto, region, kod pocztowy, kraj)

Produkty (identyfikator produktu, identyfikator kategorii, identyfikator dostawcy, nazwa produktu, cena jednostkowa, ilość w magazynie, poziom ponownego zamówienia)
Kategorie (identyfikator kategorii, nazwa kategorii, opis)

Sales(identyfikator sprzedaży, data sprzedaży, identyfikator klienta, identyfikator pracownika)
SaleDetails(saleID, productID, numberSold, sellPrice)
Klienci (identyfikator klienta, nazwa klienta, telefon, adres, miasto, region, kod pocztowy, kraj)

Zamówienia (identyfikator zamówienia, data sprzedaży, identyfikator dostawcy, identyfikator pracownika)
OrderDetails(orderID, productID, numberBought, costPrice)

Do dziewięciu profesjonalnych tabel zostało wyprodukowanych z jednego stołu wyprodukowanego przez nowicjuszy, aby zapobiec redundancji i problemom z rachunkowością (anomalie z wstawiania, usuwania i aktualizacji). Sam stół dla początkujących doprowadziłby do strat finansowych.

Testowanie personelu

W tym momencie wszyscy pracownicy, w tym właściciel, powinni byli zrozumieć 1NF, 2NF i 3NF. Trzeba je jednak przetestować. Wszyscy, łącznie z właścicielem, usiądą w różnych miejscach i rozwiążą test. Test składający się z jednego pytania zajmie godzinę i wygląda następująco:

Pytanie: Korzystając z reguł dla 1NF, 2NF i 3NF, udowodnij, że wszystkie dziewięć powyższych tabel jest już w pierwszej postaci normalnej, drugiej postaci normalnej i trzeciej postaci normalnej. Klienci i dostawcy nie muszą być realnymi podmiotami. Dane do tabel powinny stanowić kopię zapasową notacji tabeli.

Kiedy oni kończą test, ty, jako twórca bazy danych, wychodzisz na przekąskę i piwo, by wrócić po godzinie.

Bliska i daleka przyszłość

Podczas gdy ty, programista bazy danych, jesteś poza domem, zastanawiasz się również, jakiej rady udzielić im, jeśli wszyscy zdadzą test.

Ponadto, kiedy ich szkoliłeś, a teraz, gdy przystępują do testu, klienci przychodzili i wychodzili bez obsługi. To nie jest dobre dla biznesu i ty, programista bazy danych, wiesz o tym. Niektórzy klienci mogą pójść do sklepów konkurencji i nigdy nie wrócić.

Ty, programista bazy danych, masz 30 lat. Właściciel, jako Twój przyjaciel, również ma 30 lat. Urzędnicy (pracownicy) są w wieku od 18 do 24 lat. Wszystkie cechy potrzebne do pracy u właściciela to: zdrowie, umiejętność czytania i pisania, umiejętność dodawania, odejmowania, mnożenia i dzielenia oraz możliwość korzystania z komputera i Internetu.

Gdy tabela znajduje się w 3NF, większość luk została usunięta z bazy danych. Wiele komercyjnych baz danych nie wykracza poza 3NF, a firmy lub firmy są wygodne.

Tak więc, jeśli wszyscy zdadzą test, poprosisz urzędników, aby poszli i kontynuowali pracę. Doradzisz im również, aby oszczędzali część swoich pensji, aby mogli posiadać swoje sklepy ogólnospożywcze. Będziesz jutro kontynuował szkolenie tylko właściciela w 4NF i 5NF. Dzięki znajomości 4NF i 5NF wszystkie znane luki są usuwane.

Ocena

Po godzinie ty, programista bazy danych, wracasz. Zaznaczasz ich skrypty. Kawał świetnej wiadomości! Wszyscy, łącznie z właścicielem, mają po 100%. Hurra! To jest świetne!

Zatem gratulacje dla Was wszystkich: nauczyciela i uczniów.

W tym samouczku nie pozostaje nic innego, jak tylko zakończyć.

Wniosek

Tabela jest w pierwszej postaci normalnej, jeśli nie narusza żadnej z poniższych zasad:

  1. Wszystkie kolumny w tabeli powinny mieć unikalne nazwy nagłówków.
  2. Każda komórka musi zawierać tylko jedną wartość.
  3. Wartości przechowywane w kolumnie powinny być tego samego typu.
  4. Rzędy powinny być odrębne.
  5. Kolejność kolumn lub wierszy nie ma znaczenia.

Tabela jest w drugiej postaci normalnej, jeśli nie narusza żadnej z poniższych zasad:

  1. Tabela musi być już w pierwszej postaci normalnej.
  2. Nie może być częściowej zależności.

Tabela jest w trzeciej postaci normalnej, jeśli nie narusza żadnej z poniższych zasad:

  1. Musi być już w drugiej postaci normalnej.
  2. I nie może mieć zależności przejściowej.

Ty, twórca bazy danych, powiedz urzędnikom, że nauczyli się wystarczająco dużo. Udzielasz porad i prosisz ich, aby domyślnie wrócili do pracy i pozostali na swoich stanowiskach.

Umawiasz się tylko z właścicielem na jutro w jego biurze na szkolenie z 4NF i 5NF.