Zadanie 7: Rozbudowa schematu bazy danych o nowe tabele

Cel zadania

Głównym celem tego zadania jest nauczenie studenta, jak w sposób przemyślany i metodyczny rozbudowywać istniejący schemat bazy danych o nowe encje, czyli w praktyce – o nowe tabele. Student przećwiczy proces projektowania i implementacji dwóch kluczowych dla systemu bibliotecznego tabel: `ksiazki` oraz `pracownicy`. Zadanie kładzie silny nacisk na świadomy dobór odpowiednich typów danych dla każdego atrybutu, co ma fundamentalne znaczenie dla integralności danych, wydajności zapytań i optymalnego wykorzystania zasobów serwera. Ponadto, student utrwali i rozwinie swoje umiejętności w zakresie masowego importu danych z plików CSV, tym razem ucząc się, jak obsługiwać pliki zawierające wiersz nagłówkowy. Stworzenie tych tabel jest niezbędnym krokiem w ewolucji modelu bazy danych – od pojedynczej, płaskiej struktury do bardziej złożonego, wielotabelowego schematu, który stanowi podstawę do późniejszego wprowadzenia relacji.

Scenariusz

Po pomyślnym zaimportowaniu surowych danych o czytelnikach, student-administrator staje przed kolejnym etapem cyfryzacji biblioteki: wprowadzeniem do systemu pełnego katalogu książek oraz listy pracowników. Otrzymuje dwa kolejne pliki w formacie Excel. Pierwszy, `ksiazki.xlsx`, zawiera tysiące pozycji z takimi informacjami jak tytuł, autor, rok wydania, numer ISBN oraz kategoria. Drugi, `pracownicy.xlsx`, to prosta lista osób zatrudnionych w bibliotece, zawierająca ich imiona, nazwiska, stanowiska i dane kontaktowe. Student wie, że nie może po prostu zaimportować tych danych do jednej, wielkiej tabeli. Zaczyna od starannego zaprojektowania struktur dla dwóch nowych tabel. Dla tabeli `ksiazki` decyduje, że `tytul` będzie typu `VARCHAR(255)`, aby pomieścić nawet bardzo długie tytuły, a `rok_wydania` typu `INT`, co umożliwi w przyszłości łatwe wyszukiwanie książek z określonego okresu. Dla numeru ISBN wybiera `VARCHAR(20)`, a nie typ liczbowy, ponieważ ISBN może zawierać litery (np. 'X') i myślniki, a nie wykonuje się na nim operacji arytmetycznych. Podobną analizę przeprowadza dla tabeli `pracownicy`, dobierając odpowiednie długości dla pól `imie`, `nazwisko` i `stanowisko`. W obu tabelach konsekwentnie implementuje klucz główny `id` z autoinkrementacją. Następnie, podobnie jak w poprzednim zadaniu, konwertuje oba pliki Excela do formatu CSV z kodowaniem UTF-8, tym razem jednak świadomie pozostawiając w nich pierwszy wiersz z nagłówkami, ponieważ ułatwi to weryfikację poprawności plików. Po umieszczeniu plików `ksiazki.csv` i `pracownicy.csv` w katalogu importu, student loguje się do konsoli MySQL. Wykonuje dwa polecenia `CREATE TABLE`, materializując w bazie danych swoje projekty. Następnie, przystępuje do importu. Używając polecenia `LOAD DATA INFILE`, tym razem dodaje do niego nową, ważną klauzulę: `IGNORE 1 ROWS`. Dzięki temu serwer wie, że ma pominąć pierwszy wiersz każdego pliku, traktując go jako nagłówek, a nie dane do zaimportowania. Po pomyślnym wykonaniu obu importów, student przeprowadza weryfikację. Wykonuje zapytania `SELECT` na obu tabelach, sprawdzając, czy dane zostały zaimportowane poprawnie, czy polskie znaki są dobrze wyświetlane i czy liczba wierszy w tabelach zgadza się z liczbą rekordów w plikach CSV. Na tym etapie baza `biblioteka` zawiera już trzy odizolowane od siebie tabele. Jest to świadomy krok przejściowy, który w następnym zadaniu zostanie przekształcony w spójny, połączony relacjami model danych.

Wykonanie krok po kroku

  1. Przygotowanie plików CSV z nagłówkami

    Przygotuj dwa pliki CSV. Tym razem zwróć uwagę, że pierwszy wiersz w każdym pliku zawiera nazwy kolumn. Jest to bardzo dobra praktyka, ułatwiająca zarządzanie danymi.

    Plik `ksiazki.csv` (w `C:\dane_import\`):

    "tytul","autor","rok_wydania","isbn","gatunek"
    "Władca Pierścieni: Drużyna Pierścienia","J.R.R. Tolkien",1954,"978-83-7758-582-3","Fantasy"
    "Mistrz i Małgorzata","Michaił Bułhakow",1967,"978-83-240-4363-1","Powieść"
    "Solaris","Stanisław Lem",1961,"978-83-08-06028-7","Science Fiction"

    Plik `pracownicy.csv` (w `C:\dane_import\`):

    "imie","nazwisko","stanowisko","email"
    "Krystyna","Janda","Dyrektor","k.janda@biblioteka.pl"
    "Marek","Kondrat","Bibliotekarz","m.kondrat@biblioteka.pl"
  2. Projekt i tworzenie tabel `ksiazki` i `pracownicy`

    Zaloguj się do konsoli MySQL i przełącz na bazę `biblioteka`. Następnie utwórz dwie nowe tabele zgodnie z przemyślanym projektem.

    USE biblioteka;
    
    -- Tworzenie tabeli na dane o książkach.
    CREATE TABLE ksiazki (
        id INT AUTO_INCREMENT PRIMARY KEY,
        tytul VARCHAR(255) NOT NULL,
        autor VARCHAR(255),
        rok_wydania INT,
        isbn VARCHAR(20) UNIQUE, -- UNIQUE zapewnia, że każdy ISBN będzie unikalny w tabeli
        gatunek VARCHAR(100)
    );
    
    -- Tworzenie tabeli na dane o pracownikach.
    CREATE TABLE pracownicy (
        id INT AUTO_INCREMENT PRIMARY KEY,
        imie VARCHAR(100) NOT NULL,
        nazwisko VARCHAR(100) NOT NULL,
        stanowisko VARCHAR(100),
        email VARCHAR(150) UNIQUE -- Adres email również powinien być unikalny
    );
    Wyjaśnienie: Dodanie ograniczenia `UNIQUE` do kolumny (np. `isbn` czy `email`) to mechanizm integralności danych. Serwer bazy danych będzie aktywnie pilnował, aby w tej kolumnie nie pojawiły się dwie takie same wartości, co chroni nas przed duplikatami.
  3. Import danych z pominięciem wiersza nagłówkowego

    Teraz zaimportujemy dane do nowo utworzonych tabel. Kluczowe będzie użycie opcji `IGNORE 1 ROWS`, aby pominąć nagłówki z plików CSV.

    -- Import danych do tabeli ksiazki
    LOAD DATA INFILE 'C:/dane_import/ksiazki.csv'
    INTO TABLE ksiazki
    CHARACTER SET utf8mb4
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\r\n'
    IGNORE 1 ROWS; -- Ta linia instruuje serwer, aby zignorował pierwszy wiersz pliku
    
    -- Import danych do tabeli pracownicy
    LOAD DATA INFILE 'C:/dane_import/pracownicy.csv'
    INTO TABLE pracownicy
    CHARACTER SET utf8mb4
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\r\n'
    IGNORE 1 ROWS;
    Wyjaśnienie: Klauzula `IGNORE 1 ROWS` jest niezwykle użyteczna i jest standardową praktyką przy imporcie danych z plików CSV, które prawie zawsze zawierają wiersz nagłówkowy.
  4. Weryfikacja importu i schematu

    Po każdym imporcie należy zweryfikować, czy dane zostały załadowane poprawnie i czy struktura tabel jest zgodna z oczekiwaniami.

    -- Sprawdzenie danych w tabeli ksiazki
    SELECT * FROM ksiazki;
    
    -- Sprawdzenie danych w tabeli pracownicy
    SELECT * FROM pracownicy;
    
    -- Wyświetlenie szczegółowej struktury tabeli ksiazki
    -- Polecenie DESCRIBE jest skrótem od DESCRIBE TABLE.
    DESCRIBE ksiazki;
    Wyjaśnienie: `DESCRIBE` to bardzo przydatne polecenie diagnostyczne. Wyświetla ono listę kolumn w tabeli, ich typy danych, informację, czy mogą być `NULL`, czy są kluczem (`KEY`) oraz ich wartości domyślne. Pozwala to szybko zweryfikować, czy tabela została utworzona zgodnie z projektem.

Podsumowanie i wnioski

Rozbudowa schematu bazy danych jest naturalnym i nieuniknionym procesem w cyklu życia każdej aplikacji. To zadanie pokazało, jak w sposób metodyczny i przemyślany podejść do tego procesu. Kluczowym wnioskiem jest to, że projektowanie tabeli to nie tylko nadawanie nazw kolumnom, ale przede wszystkim świadomy dobór typów danych i ograniczeń (takich jak `NOT NULL` czy `UNIQUE`). Wybory te mają bezpośredni i długofalowy wpływ na jakość, spójność i wydajność całej bazy danych. Utrwalenie umiejętności masowego importu danych, tym razem w bardziej realistycznym scenariuszu z plikami zawierającymi nagłówki, jest kolejnym ważnym krokiem w kierunku profesjonalizmu. Na obecnym etapie nasza baza `biblioteka` składa się z trzech odrębnych "silosów" danych. Taka struktura jest jeszcze daleka od ideału, ponieważ nie odzwierciedla logicznych powiązań istniejących w rzeczywistości (czytelnik wypożycza książkę, pracownik obsługuje wypożyczenie). Jest to jednak świadomie zaplanowany stan przejściowy, który w następnym, kluczowym zadaniu, zostanie przekształcony w spójny i wydajny model relacyjny.