Celem tego zadania jest zrozumienie i praktyczne zastosowanie procesu normalizacji bazy danych. Nauczysz się, jak przekształcić nasze istniejące, nieoptymalne tabele w strukturę zgodną z trzema pierwszymi postaciami normalnymi (1NF, 2NF, 3NF). Zrozumiesz, dlaczego normalizacja jest kluczowa dla utrzymania integralności danych, redukcji redundancji i zwiększenia wydajności bazy. Wprowadzisz także relacje między tabelami za pomocą kluczy obcych (FOREIGN KEY) i stworzysz tabelę łączącą, aby modelować wypożyczenia książek.
Nasza baza danych biblioteki działa, ale jest zbudowana na kruchych fundamentach. Tabela czytelnicy przechowuje adresy i telefony w pojedynczych polach, co utrudnia wyszukiwanie i aktualizację. W tabeli ksiazki nazwisko autora i kategoria powtarzają się przy każdym tytule, co jest marnotrawstwem miejsca i prowadzi do błędów przy wprowadzaniu danych. Twoim zadaniem jest przeprowadzenie gruntownej restrukturyzacji bazy, aby wyeliminować te problemy. Będziesz działał jak chirurg bazodanowy, precyzyjnie "operując" na istniejących tabelach. Najpierw doprowadzisz tabelę czytelnicy do pierwszej postaci normalnej (1NF), dzieląc złożone dane na atomowe części i tworząc osobną tabelę na numery telefonów. Następnie, zajmiesz się tabelą ksiazki, doprowadzając ją do drugiej (2NF) i trzeciej (3NF) postaci normalnej poprzez wydzielenie autorów i kategorii do osobnych tabel. Kluczowym elementem tej operacji będzie wprowadzenie relacji za pomocą kluczy obcych, które połączą nowe tabele z istniejącymi. Na koniec stworzysz zupełnie nową tabelę wypozyczenia, która połączy czytelników z książkami, pozwalając na rejestrowanie, która książka została wypożyczona przez kogo i kiedy. To zadanie pokaże Ci, jak z chaosu stworzyć logiczny, wydajny i spójny model danych.
Będziemy modyfikować istniejące tabele. W środowisku produkcyjnym takie operacje zawsze należy poprzedzić wykonaniem kopii zapasowej!
czytelnicyZasada 1NF: Każda komórka w tabeli musi zawierać pojedynczą, atomową (niepodzielną) wartość, a każdy wiersz musi być unikalny.
imie_nazwisko, pelny_adres i telefony łamią tę zasadę.czytelnicy: Dodajmy nowe kolumny na imię, nazwisko i części adresu.
            SUBSTRING_INDEX do podziału.
            telefony:
            ksiazkiZasada 2NF: Tabela musi być w 1NF, a wszystkie atrybuty niekluczowe muszą być w pełni zależne od całego klucza głównego. (Dotyczy głównie kluczy złożonych).
Zasada 3NF: Tabela musi być w 2NF, a wszystkie atrybuty muszą zależeć tylko od klucza głównego, a nie od innych atrybutów niekluczowych.
ksiazki, autor i kategoria są powtarzającymi się tekstami. Zmiana nazwiska autora wymagałaby aktualizacji wielu wierszy. To naruszenie 3NF.autorzy:
            autorzy unikalnymi wartościami:
            kategorie i jej wypełnienie:
            ksiazki: Dodamy kolumny na klucze obce i usuniemy stare.
            wypozyczeniaTeraz, gdy mamy znormalizowane tabele, możemy poprawnie modelować relację "wielu-do-wielu" między czytelnikami a książkami. Jeden czytelnik może wypożyczyć wiele książek, a jedna książka może być wypożyczana przez wielu czytelników (w różnym czasie).
wypozyczenia:
            ON DELETE CASCADE: Jeśli usuniemy czytelnika, automatycznie usunięte zostaną wszystkie jego wpisy w tabeli telefony.ON UPDATE CASCADE: Jeśli zmienimy ID czytelnika, zmiana zostanie automatycznie przeniesiona do powiązanych tabel.SET NULL, RESTRICT, NO ACTION.wypozyczenia: Przygotuj i zaimportuj plik wypozyczenia.sql z przykładowymi danymi.
+-------------+      +----------------+      +-----------------+
|   autorzy   |      |    ksiazki     |      |    kategorie    |
+-------------+      +----------------+      +-----------------+
| PK id_autora|--<{--| FK id_autora   |--}-->| PK id_kategorii |
| nazwisko_imie|      | PK id_ksiazki  |      | nazwa           |
+-------------+      | tytul, ...     |      +-----------------+
                     | FK id_kategorii|
                     +----------------+
                            |
                            {
                            |
+-------------+      +-----------------+
|  czytelnicy |      |  wypozyczenia   |
+-------------+      +-----------------+
|PK id_czytelnika|--<{--|FK id_czytelnika |
| imie, ...   |      |FK id_ksiazki    |
+-------------+      |PK id_wypozyczenia|
      |              | daty, ...       |
      {              +-----------------+
      |
+-------------+
|   telefony  |
+-------------+
|PK id_telefonu|
|FK id_czytelnika|
| numer       |
+-------------+
    
    JOIN), ale operują na zoptymalizowanych strukturach.START TRANSACTION; ... COMMIT;). Gwarantuje to, że albo wszystkie kroki się powiodą, albo żaden (w razie błędu można wycofać zmiany poleceniem ROLLBACK;).