Zadanie 7 - Budowa schematu bazy danych

Wprowadzenie: Dlaczego jedna tabela to za mało?

Analogia: Książka adresowa w telefonie

Wyobraź sobie, że Twoja książka adresowa ma tylko jedno pole: "Dane". Wpisujesz tam wszystko: "Jan Kowalski, ul. Miła 5, tel. 500-600-700, urodziny 15 maja". Jak znaleźć wszystkich, którzy mają urodziny w maju? Albo wszystkich mieszkających przy ulicy Miłej? Byłoby to bardzo trudne.

Dlatego aplikacja do kontaktów ma osobne pola: "Imię", "Nazwisko", "Ulica", "Numer telefonu", "Data urodzin". Dzięki temu możesz łatwo sortować i wyszukiwać kontakty.

Nasza pierwsza tabela, czytelnicy_denormalized, jest jak ta książka adresowa z jednym polem. Czas to naprawić, tworząc nowe, wyspecjalizowane tabele dla książek i pracowników, gdzie każda informacja będzie miała swoją własną "szufladkę" (kolumnę).

Cel zadania

Celem jest rozbudowa naszej bazy biblioteka o dwie kluczowe tabele: ksiazki i pracownicy. Nauczysz się, jak starannie projektować ich strukturę, dobierać odpowiednie typy danych i stosować ograniczenia (UNIQUE, ENUM, DEFAULT), aby zapewnić spójność i poprawność danych. Na koniec zaimportujesz duże zestawy danych, aby nasza baza stała się w pełni funkcjonalna.

Część A: Tworzenie tabeli "ksiazki"

Krok 1: Projektowanie i tworzenie tabeli

Zanim napiszemy kod, zastanówmy się, jakie informacje o książce są nam potrzebne. Będą to: unikalny identyfikator, tytuł, autor, numer ISBN, rok wydania, kategoria i status. Upewnij się, że pracujesz w kontekście bazy biblioteka (USE biblioteka;).


CREATE TABLE ksiazki (
  id_ksiazki INT AUTO_INCREMENT PRIMARY KEY,
  tytul VARCHAR(255) NOT NULL,
  autor VARCHAR(255) NOT NULL,
  isbn VARCHAR(17) UNIQUE,
  rok_wydania YEAR NULL,
  kategoria VARCHAR(100) NULL,
  status ENUM('Dostępna', 'Wypożyczona', 'Wycofana') NOT NULL DEFAULT 'Dostępna'
);
    
Dogłębna analiza definicji kolumn:
Krok 2: Weryfikacja struktury tabeli

Po wykonaniu powyższego polecenia, warto sprawdzić, czy serwer "zrozumiał" nasze intencje. Użyj polecenia SHOW CREATE TABLE, które pokaże dokładny kod SQL użyty do stworzenia tabeli.

SHOW CREATE TABLE ksiazki;

Wynik będzie bardzo podobny do kodu, który napisaliśmy, co potwierdza, że tabela została utworzona zgodnie ze specyfikacją.

Krok 3: Import danych do tabeli ksiazki
  1. Przygotuj plik: Skopiuj treść polecenia INSERT INTO ksiazki... z pliku źródłowego do pliku import_ksiazek.sql na Pulpicie.
  2. Metoda 1: Import z wiersza poleceń (zalecane dla dużych plików):
  3. mysql -u root -p biblioteka < C:\Users\TwojaNazwaUzytkownika\Desktop\import_ksiazek.sql
  4. Metoda 2: Import przez HeidiSQL (łatwiejsze dla początkujących):
    • W HeidiSQL wybierz z menu Plik -> Wczytaj plik SQL....
    • Wskaż swój plik import_ksiazek.sql. Jego zawartość pojawi się w oknie zapytań.
    • Naciśnij klawisz F9 (lub ikonę "play"), aby wykonać wszystkie polecenia z pliku.
  5. Weryfikacja: Sprawdź, czy dane zostały poprawnie dodane, wykonując dwa zapytania:
  6. 
    -- Policzmy, ile dokładnie wierszy zostało zaimportowanych
    SELECT COUNT(*) FROM ksiazki;
    
    -- Wyświetlmy kilka losowych książek z kategorii "Science Fiction"
    SELECT tytul, autor FROM ksiazki WHERE kategoria = 'Science Fiction' LIMIT 3;
          

Część B: Tworzenie tabeli "pracownicy"

Krok 1: Definicja tabeli pracownicy

CREATE TABLE pracownicy (
  id_pracownika INT AUTO_INCREMENT PRIMARY KEY,
  imie VARCHAR(100) NOT NULL,
  nazwisko VARCHAR(100) NOT NULL,
  stanowisko VARCHAR(100) NOT NULL,
  data_zatrudnienia DATE NOT NULL,
  email VARCHAR(255) NOT NULL UNIQUE
);
    
Dogłębna analiza definicji kolumn:
Krok 2: Import i weryfikacja danych pracowników

Proces jest identyczny jak w przypadku książek. Przygotuj plik import_pracownikow.sql, zaimportuj go jedną z poznanych metod, a następnie zweryfikuj wynik.


-- Sprawdźmy, ilu mamy bibliotekarzy
SELECT COUNT(*) FROM pracownicy WHERE stanowisko = 'Bibliotekarz';

-- Znajdźmy najstarszego stażem pracownika
SELECT imie, nazwisko, data_zatrudnienia FROM pracownicy ORDER BY data_zatrudnienia ASC LIMIT 1;
    

Wnioski i co dalej?

Podsumowanie i wizualizacja problemu

Doskonale! Twoja baza danych jest teraz znacznie bogatsza. Posiadasz trzy tabele, z których dwie (ksiazki i pracownicy) są dobrze zaprojektowane. Problem wciąż leży w naszej pierwszej tabeli:

[Tabela: czytelnicy_denormalized]
+--+----------------------------------+--------------------------------------------------+
|id| dane_osobowe                     | wypozyczenia                                     |
+--+----------------------------------+--------------------------------------------------+
| 1| Anna Nowak, anna.nowak@email.com | "1:Władca Pierścieni:2025-10-01;12:Diuna:2025-10-15"| <-- Zwykły tekst!
+--+----------------------------------+--------------------------------------------------+

[Tabela: ksiazki]
+----------+------------------------------------------+
|id_ksiazki| tytul                                    |
+----------+------------------------------------------+
| 1        | Władca Pierścieni: Drużyna Pierścienia |
| ...      | ...                                      |
| 12       | Diuna                                    |
+----------+------------------------------------------+
    

Jak widać, kolumna wypozyczenia to tylko tekst. Baza danych nie wie, że "1" i "12" w tym tekście odnoszą się do konkretnych książek w tabeli ksiazki. Nie możemy łatwo sprawdzić, kto wypożyczył "Diunę".

W następnym zadaniu rozwiążemy ten problem, przeprowadzając normalizację tabeli czytelników i tworząc między tabelami relacje za pomocą kluczy obcych. To serce projektowania relacyjnych baz danych!