Zadanie 6 — Tabela czytelników (pierwotnie nie znormalizowana)

Cel zadania

Celem tego zadania jest praktyczne zrozumienie problemów wynikających z nieprawidłowego projektowania tabel w bazach danych. Nauczysz się, jak stworzyć tabelę, która celowo łamie zasady pierwszej postaci normalnej (1NF), aby na własne oczy zobaczyć, jakie komplikacje to powoduje. Stworzysz swoją pierwszą bazę danych i tabelę, a następnie zaimportujesz do niej dane, poznając przy tym podstawowe pojęcia takie jak klucz główny (PRIMARY KEY), AUTO_INCREMENT oraz ograniczenia NULL/NOT NULL.

Scenariusz / opis zadania

Wyobraź sobie, że zostałeś poproszony o stworzenie prostej bazy danych dla małej, osiedlowej biblioteki, która do tej pory wszystkie dane przechowywała w jednym arkuszu kalkulacyjnym. Twoim zadaniem jest przeniesienie listy czytelników do bazy danych. Niestety, dane w arkuszu są w chaosie: w jednej komórce znajduje się pełen adres (ulica, numer, miasto), a w innej kilka numerów telefonów oddzielonych średnikami. Twoim pierwszym krokiem jest stworzenie tabeli czytelnicy, która będzie odzwierciedlać tę nieuporządkowaną strukturę. Zrobisz to celowo, aby zrozumieć, dlaczego takie podejście jest problematyczne. Stworzysz nową bazę danych o nazwie biblioteka, a w niej tabelę czytelnicy z kolumnami takimi jak imie_nazwisko, pelny_adres i telefony. Następnie przygotujesz plik SQL z przykładowymi danymi (INSERT-y) i nauczysz się, jak zaimportować go z wiersza poleceń. W trakcie tego procesu wprowadzimy pojęcie klucza głównego (PK), czyli unikalnego identyfikatora dla każdego wiersza. Zastanowisz się, dlaczego w tak zaprojektowanej tabeli trudno jest zdefiniować sensowny klucz główny i jakie problemy z redundancją i wyszukiwaniem danych generuje taki projekt. To ćwiczenie jest fundamentem do zrozumienia potrzeby normalizacji, którą zajmiemy się w kolejnych zadaniach.

Pomocnik wykonania

  1. Zaloguj się do serwera: Połącz się z serwerem MariaDB/MySQL za pomocą ulubionego klienta (np. HeidiSQL lub konsola).
  2. Stwórz nową bazę danych: Pierwszym krokiem jest stworzenie dedykowanej bazy danych dla naszego projektu. Nazwijmy ją biblioteka.
    CREATE DATABASE biblioteka CHARACTER SET utf8mb4 COLLATE utf8mb4_polish_ci;
  3. Wybierz nową bazę: Przełącz się na kontekst nowo utworzonej bazy.
    USE biblioteka;
  4. Zaprojektuj tabelę niezgodną z 1NF: Stworzymy teraz tabelę czytelnicy, która celowo łamie zasady normalizacji.
  5. Napisz polecenie CREATE TABLE:
    CREATE TABLE czytelnicy ( id_czytelnika INT AUTO_INCREMENT PRIMARY KEY, imie_nazwisko VARCHAR(100) NOT NULL, pelny_adres VARCHAR(255) NULL, telefony VARCHAR(100) NULL, email VARCHAR(100) UNIQUE NULL, data_rejestracji DATE NOT NULL );
  6. Omówienie kluczowych pojęć:
  7. Przygotuj plik z danymi: Utwórz na swoim komputerze plik tekstowy o nazwie czytelnicy.sql. Wklej do niego 50 poleceń INSERT, które dodadzą przykładowych czytelników. Przykładowe dane zostaną wygenerowane w osobnym pliku.
  8. Problem z kluczem głównym: W naszej tabeli użyliśmy sztucznego klucza id_czytelnika. Zastanów się, czy moglibyśmy użyć innej kolumny jako klucza głównego? imie_nazwisko może się powtarzać. email mógłby być, ale jest opcjonalny (NULL). Tabela bez klucza głównego jest trudna w zarządzaniu i uniemożliwia tworzenie relacji.
  9. Import danych z wiersza poleceń (Windows): Otwórz cmd.exe. Upewnij się, że jesteś w katalogu, w którym zapisałeś plik czytelnicy.sql. Wykonaj polecenie:
    mysql -u root -p biblioteka < czytelnicy.sql
    Po podaniu hasła, dane z pliku zostaną zaimportowane do tabeli czytelnicy w bazie biblioteka.
  10. Import danych z wiersza poleceń (Linux): Proces jest bardzo podobny:
    mysql -u root -p biblioteka < czytelnicy.sql
  11. Weryfikacja importu: Zaloguj się do bazy i sprawdź, czy dane zostały poprawnie zaimportowane.
    USE biblioteka;
    SELECT * FROM czytelnicy LIMIT 10;

Przykłady kodu i poleceń

Poniżej znajduje się kod SQL do utworzenia bazy i tabeli. Dane do importu (50 wierszy) znajdują się w osobnym pliku czytelnicy.sql.

Tworzenie struktury

-- Tworzenie bazy danych z odpowiednim kodowaniem
CREATE DATABASE IF NOT EXISTS biblioteka CHARACTER SET utf8mb4 COLLATE utf8mb4_polish_ci;

-- Uzycie bazy
USE biblioteka;

-- Tworzenie celowo nieznormalizowanej tabeli czytelnikow
CREATE TABLE czytelnicy (
    id_czytelnika INT AUTO_INCREMENT PRIMARY KEY,
    imie_nazwisko VARCHAR(100) NOT NULL,
    pelny_adres VARCHAR(255) NULL,
    telefony VARCHAR(100) NULL,
    email VARCHAR(100) UNIQUE NULL,
    data_rejestracji DATE NOT NULL
);
    

Polecenia importu

# Windows (zapisz dane w pliku czytelnicy.sql)
mysql -u root -p biblioteka < C:\path\to\your\file\czytelnicy.sql

# Linux (zapisz dane w pliku czytelnicy.sql)
mysql -u root -p biblioteka < /path/to/your/file/czytelnicy.sql
    

Ilustracja konsoli

+---------------------------------------------------+
|                                                   |
|   C:\Users\Student> mysql -u root -p biblioteka < czytelnicy.sql |
|   Enter password: ****                            |
|                                                   |
|   C:\Users\Student> _                             |
|   (brak komunikatu oznacza sukces)                |
|                                                   |
|   ...                                             |
|   MariaDB [biblioteka]> SELECT COUNT(*) FROM czytelnicy; |
|   +----------+                                    |
|   | COUNT(*) |                                    |
|   +----------+                                    |
|   |       50 |                                    |
|   +----------+                                    |
|                                                   |
+---------------------------------------------------+
    

Informacje dodatkowe / uwagi