Definiowanie typów danych zgodnie z projektem

Dobór, optymalizacja, oszczędność miejsca i wydajność — INF.03 Dział V

Teoria Typy danych — jak mądrze projektować tabelę?

  • Wybór typu danych wpływa na wydajność, rozmiar bazy i poprawność danych.
  • INT, SMALLINT, TINYINT – liczby całkowite, do identyfikatorów, wieku, liczników.
  • VARCHAR(n) – tekst o zmiennej długości, n dobieraj do realnej maksymalnej długości.
  • CHAR(n) – tekst o stałej długości (np. PESEL, kody, skróty).
  • DATE, DATETIME – daty oraz data+czas, ułatwiają sortowanie i filtrowanie.
  • DECIMAL(x,y) – wartości pieniężne i dokładne obliczenia, FLOAT/DOUBLE – przybliżone.
  • BOOLEAN/TINYINT(1) – wartości prawda/fałsz.
  • ENUM – ograniczony zbiór dopuszczalnych wartości (status, kategoria).
  • TEXT, BLOB – duże teksty/opisy lub dane binarne, używaj tylko gdy naprawdę potrzebne.

Podstawowa zasada: wybierz najmniejszy typ, który spełnia wymagania i pozwala przechować wszystkie możliwe wartości.

Ćwiczenie 1 Dobór typów dla tabeli „uczniowie”

Zadanie: Wybierz typy kolumn dla tabeli uczniowie. Pola: id, imie, nazwisko, pesel, wiek, email, data_ur, aktywny (czy nadal uczy się w szkole).
  • Dla identyfikatora użyj typu całkowitego z AUTO_INCREMENT.
  • Dla PESEL wybierz typ o stałej długości.
  • Dla „aktywny” użyj typu logicznego/małej liczby.
CREATE TABLE uczniowie (
  id INT PRIMARY KEY AUTO_INCREMENT,
  imie VARCHAR(30) NOT NULL,
  nazwisko VARCHAR(40) NOT NULL,
  pesel CHAR(11) UNIQUE,                -- stała długość
  wiek TINYINT CHECK (wiek BETWEEN 6 AND 25),
  email VARCHAR(80) UNIQUE,
  data_ur DATE,
  aktywny TINYINT(1) DEFAULT 1          -- 1 = aktywny, 0 = nieaktywny
);

Ćwiczenie 2 Tabela „produkty” dla sklepu

Zadanie: Zaprojektuj tabelę produkty: id, nazwa, cena, ilosc, data_dodania, opis, aktywny.
  • Dla ceny użyj typu dokładnego (DECIMAL).
  • Dla ilości wybierz typ wystarczający dla magazynu.
  • Dla opisu użyj typu umożliwiającego dłuższy tekst.
CREATE TABLE produkty (
  id INT PRIMARY KEY AUTO_INCREMENT,
  nazwa VARCHAR(70) NOT NULL,
  cena DECIMAL(10,2) CHECK (cena >= 0),
  ilosc SMALLINT UNSIGNED DEFAULT 0,
  data_dodania DATETIME DEFAULT CURRENT_TIMESTAMP,
  opis TEXT,
  aktywny TINYINT(1) DEFAULT 1
);

Ćwiczenie 3 Typy dla „zamowienia” i statusów

Zadanie: Zaprojektuj kolumnę status w tabeli zamowienia, która może przyjmować tylko: „nowe”, „w realizacji”, „zrealizowane”, „anulowane”. Dodaj też pole wartosc i data_zamowienia.
  • Ogranicz dopuszczalne wartości statusu.
  • Dla wartości zamówienia użyj DECIMAL.
  • Dla daty zamówienia użyj odpowiedniego typu czasowego.
CREATE TABLE zamowienia (
  id INT PRIMARY KEY AUTO_INCREMENT,
  klient_id INT NOT NULL,
  wartosc DECIMAL(10,2) CHECK (wartosc >= 0),
  data_zamowienia DATETIME DEFAULT CURRENT_TIMESTAMP,
  status ENUM('nowe', 'w realizacji', 'zrealizowane', 'anulowane') DEFAULT 'nowe'
);

Ćwiczenie 4 Oszczędność miejsca – tabela logów

Zadanie: Dobierz typy tak, by każdy log zajmował minimalną ilość miejsca. Pola: id, typ_zdarzenia (login, zapis, błąd), opis (krótki), data_zdarzenia, udany (tak/nie).
  • Użyj małych typów numerycznych lub ENUM.
  • Opis ogranicz do rozsądnej długości.
  • Dodaj pole logiczne dla wyniku operacji.
CREATE TABLE logi (
  id INT PRIMARY KEY AUTO_INCREMENT,
  typ_zdarzenia ENUM('login', 'zapis', 'blad') NOT NULL,
  opis VARCHAR(80),
  data_zdarzenia DATETIME DEFAULT CURRENT_TIMESTAMP,
  udany TINYINT(1) DEFAULT 1
);

Ćwiczenie 5 Korekta źle dobranych typów

Sytuacja: Istnieje tabela klienci:
CREATE TABLE klienci (
  id INT,
  imie TEXT,
  nazwisko TEXT,
  telefon INT,
  data_urodzenia VARCHAR(20)
);
Zadanie: Zaproponuj lepsze typy i pokaż ALTER TABLE, który poprawi strukturę.
  • Zamień TEXT na VARCHAR o rozsądnej długości.
  • Zamień telefon z INT na typ znakowy (numery z wiodącym zerem, znaki „+”).
  • Zamień datę z VARCHAR na DATE.
ALTER TABLE klienci
MODIFY id INT PRIMARY KEY AUTO_INCREMENT,
MODIFY imie VARCHAR(30) NOT NULL,
MODIFY nazwisko VARCHAR(40) NOT NULL,
MODIFY telefon VARCHAR(15),
MODIFY data_urodzenia DATE;

Zadanie INF.03 Analiza wymagań i dobór typów

Opis: Firma kurierska potrzebuje tabeli przesylki z polami:
  • id przesyłki,
  • numer listu przewozowego (max 15 znaków, czasem z literami),
  • waga w kg (dokładność do 0,01),
  • wartosc zadeklarowana (zł),
  • data_nadania, data_doreczenia,
  • status („nadana”, „w trasie”, „doręczona”, „zwrot”),
  • ubezpieczona (tak/nie).
  1. Dobierz typy danych dla każdego pola.
  2. Zapisz definicję tabeli w SQL.
CREATE TABLE przesylki (
  id INT PRIMARY KEY AUTO_INCREMENT,
  nr_listu VARCHAR(15) NOT NULL UNIQUE,
  waga_kg DECIMAL(6,2) CHECK (waga_kg >= 0),
  wartosc_zl DECIMAL(10,2) CHECK (wartosc_zl >= 0),
  data_nadania DATETIME NOT NULL,
  data_doreczenia DATETIME,
  status ENUM('nadana', 'w trasie', 'doreczona', 'zwrot') DEFAULT 'nadana',
  ubezpieczona TINYINT(1) DEFAULT 0
);

Quiz Sprawdź wiedzę o typach danych!

  1. Kiedy użyć CHAR zamiast VARCHAR?
  2. Jaki typ będzie optymalny dla kolumny „wiek” w bazie szkoły?
  3. Jak ograniczyć ilość miejsca zajmowanego przez opis produktu?
  4. Jaki typ wybrać dla pola „cena” w sklepie internetowym?
  5. Czym różni się DATE od DATETIME?
  6. Dlaczego nie powinno się przechowywać dat w kolumnach VARCHAR?
  • Gdy długość jest zawsze taka sama (np. PESEL, kod kraju, skrót klasy).
  • Najczęściej TINYINT lub SMALLINT, bo zakres wartości jest niewielki.
  • Ustalić maksymalną długość (np. VARCHAR(100)) zamiast TEXT, jeśli nie trzeba bardzo długiego tekstu.
  • DECIMAL(x,2), aby przechować wartości pieniężne bez błędów zaokrągleń.
  • DATE zapisuje tylko rok‑miesiąc‑dzień, DATETIME dodatkowo godzinę, minutę i sekundę.
  • Bo utrudnia to sortowanie, filtrowanie, walidację i wymaga konwersji typów przy obliczeniach.

Checklista Sprawdź umiejętności

  • Dobieram typy danych zgodnie z projektem i rzeczywistymi zakresami wartości.
  • Optymalizuję rozmiar tabel, stosując najmniejsze sensowne typy.
  • Poprawnie wykorzystuję typy znakowe, liczbowe oraz daty i czas.
  • Stosuję ograniczenia CHECK, UNIQUE, NOT NULL dla poprawy jakości danych.
Materiały: INF.03 — Typy danych w SQL · Autor: Tomasz Puchała © 2025