Głównym celem tego zadania jest nauczenie studenta dwóch fundamentalnych i niezwykle często wykonywanych w praktyce czynności: tworzenia nowej tabeli oraz masowego importu danych z zewnętrznego źródła, jakim jest plik CSV. Zadanie to ma jednak głębszy wymiar edukacyjny. Student celowo stworzy tabelę, która w rażący sposób łamie podstawowe zasady projektowania relacyjnych baz danych, w szczególności Pierwszą Postać Normalną (1NF). Dzięki temu, na własnym przykładzie doświadczy problemów wynikających z przechowywania danych w sposób nieustrukturyzowany (nieatomowy). Nauczy się korzystać z polecenia `CREATE TABLE` do precyzyjnego definiowania struktury tabeli oraz opanuje składnię potężnego narzędzia `LOAD DATA INFILE`, służącego do wydajnego ładowania dużych wolumenów danych. To ćwiczenie stanowi kluczowe preludium do zrozumienia potrzeby normalizacji, pokazując "stan przed", który w kolejnych zadaniach zostanie świadomie naprawiony.
Student, kontynuując pracę nad systemem dla biblioteki, otrzymuje od bibliotekarza stary plik Excela, w którym przez lata prowadzono ewidencję czytelników. Plik jest typowym przykładem "brudnych danych" (dirty data). W jednej kolumnie znajduje się imię i nazwisko, w drugiej pełny adres (ulica, numer, kod pocztowy, miasto), a w trzeciej, co najgorsze, lista wypożyczonych książek wpisana jako jeden ciąg znaków oddzielony średnikami. Student wie, że bezpośrednie przeniesienie takiej struktury do bazy danych jest złym pomysłem, ale jego zadaniem na tym etapie jest właśnie zaimportowanie danych w ich obecnej formie, aby później zademonstrować proces ich "czyszczenia" i normalizacji. Pierwszym krokiem jest przygotowanie danych. Otwiera plik w arkuszu kalkulacyjnym i zapisuje go w uniwersalnym formacie CSV (Comma-Separated Values), upewniając się, że wybrane jest kodowanie UTF-8, aby poprawnie obsłużyć polskie znaki. Tak przygotowany plik, nazwany `czytelnicy.csv`, umieszcza w specjalnie utworzonym katalogu `C:\dane_import\` – wie, że ze względów bezpieczeństwa MySQL często ogranicza możliwość ładowania plików tylko z określonych, zaufanych lokalizacji. Następnie loguje się do konsoli MySQL i tworzy nową bazę danych o nazwie `biblioteka`. Wewnątrz tej bazy, za pomocą polecenia `CREATE TABLE`, definiuje strukturę tabeli `czytelnicy_import`. Świadomie wybiera dla problematycznych kolumn ogólny typ danych `TEXT`, który jest w stanie pomieścić długie i niestandardowe ciągi znaków. Definiuje również kolumnę `id` jako klucz główny z automatyczną inkrementacją, aby każdy wiersz miał unikalny identyfikator. Najważniejszym momentem jest konstrukcja polecenia `LOAD DATA INFILE`. Student starannie określa wszystkie parametry: ścieżkę do pliku (pamiętając o użyciu ukośników `/` zamiast `\`), separator pól (przecinek), znak, w który ujęte są teksty (cudzysłów) oraz sekwencję końca linii (dla plików z Windows będzie to `\r\n`). Po wykonaniu polecenia serwer w ułamku sekundy importuje tysiące rekordów z pliku CSV. Student weryfikuje wynik, wykonując `SELECT * FROM czytelnicy_import LIMIT 10;`. Widzi w konsoli dane dokładnie w takiej formie, w jakiej były w arkuszu kalkulacyjnym – z połączonymi imionami i nazwiskami oraz listami książek w jednej kolumnie. Cel został osiągnięty: stworzył cyfrową kopię starego systemu, która jest idealnym materiałem do dalszej obróbki i refaktoryzacji.
Utwórz na dysku katalog, np. `C:\dane_import\`. Następnie, używając dowolnego edytora tekstu (np. Notatnik++) lub arkusza kalkulacyjnego, stwórz plik `czytelnicy.csv` o poniższej zawartości. Zwróć uwagę na strukturę – dane nie są atomowe.
"Jan Kowalski","ul. Słoneczna 5/3, 00-123 Warszawa","111-222-333","j.kowalski@email.com","Pan Tadeusz;Lalka" "Anna Nowak","al. Jerozolimskie 120, 02-345 Warszawa","444-555-666","a.nowak@email.com","Zbrodnia i kara" "Piotr Wiśniewski","ul. Leśna 8, 30-005 Kraków","777-888-999","p.wisniewski@email.com","Władca Pierścieni;Hobbit;Silmarillion"
Zaloguj się do konsoli MySQL. Utwórz nową bazę danych i tabelę, która będzie odzwierciedlać strukturę pliku CSV. Użyjemy typów danych, które pomieszczą "brudne" dane.
-- Tworzymy bazę danych, jeśli jeszcze nie istnieje, aby uniknąć błędu.
CREATE DATABASE IF NOT EXISTS biblioteka;
-- Przełączamy się na kontekst tej bazy.
USE biblioteka;
-- Tworzymy tabelę. Zwróć uwagę na użycie typu TEXT dla kolumn,
-- które będą przechowywać połączone, nieatomowe dane.
CREATE TABLE czytelnicy_import (
    id INT AUTO_INCREMENT PRIMARY KEY,
    imie_nazwisko TEXT,
    adres_pelny TEXT,
    telefon TEXT,
    email TEXT,
    wypozyczone_ksiazki TEXT
);
            To jest kluczowy moment. Użyjemy polecenia, które jest zoptymalizowane pod kątem szybkiego ładowania dużych ilości danych z plików tekstowych.
LOAD DATA INFILE 'C:/dane_import/czytelnicy.csv' INTO TABLE czytelnicy_import CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
Po imporcie zawsze należy sprawdzić, czy dane zostały załadowane poprawnie. Możemy również od razu wykonać proste modyfikacje na całej tabeli.
-- Wyświetlamy 5 pierwszych rekordów, aby szybko zweryfikować import. SELECT * FROM czytelnicy_import LIMIT 5; -- Dodajmy nową kolumnę, aby zobaczyć, jak działa modyfikacja struktury. ALTER TABLE czytelnicy_import ADD COLUMN data_dodania TIMESTAMP DEFAULT CURRENT_TIMESTAMP; -- Sprawdźmy ponownie, czy nowa kolumna została dodana i wypełniona. SELECT id, imie_nazwisko, data_dodania FROM czytelnicy_import LIMIT 5;
Umiejętność importowania danych z zewnętrznych źródeł jest jedną z najważniejszych i najczęściej wykorzystywanych kompetencji w świecie baz danych. Zadanie to w sposób praktyczny pokazało, jak za pomocą polecenia `LOAD DATA INFILE` można w niezwykle wydajny sposób załadować do bazy tysiące rekordów, co jest nieporównywalnie szybsze niż wykonywanie pojedynczych zapytań `INSERT`. Jednocześnie, ćwiczenie to było ważną lekcją na temat jakości danych. Celowe zaimportowanie "brudnych", nieznormalizowanych danych jest doskonałym punktem wyjścia do zrozumienia, dlaczego normalizacja jest tak kluczowa. Problemy, które napotkalibyśmy, próbując na tej tabeli wykonać proste zapytania (np. "znajdź wszystkich czytelników o nazwisku Kowalski" lub "która książka jest najczęściej wypożyczana?"), są niemal niemożliwe do rozwiązania w sposób wydajny i niezawodny. Kluczowym wnioskiem jest więc dwojaka nauka: po pierwsze, opanowaliśmy potężne narzędzie do importu danych, a po drugie, na własne oczy zobaczyliśmy, dlaczego struktura danych jest równie ważna, co same dane. Stworzona tabela `czytelnicy_import` jest idealnym "pacjentem", na którym w kolejnych krokach przeprowadzimy operację normalizacji, przekształcając chaos w uporządkowaną i logiczną strukturę.