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.
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.
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.
"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"
"imie","nazwisko","stanowisko","email" "Krystyna","Janda","Dyrektor","k.janda@biblioteka.pl" "Marek","Kondrat","Bibliotekarz","m.kondrat@biblioteka.pl"
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
);
            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;
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;
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.