Jak działa relacyjna baza danych?
Tabela to początek. Dobrze zaprojektowana baza opisuje obiekty, ich cechy oraz zasady, które chronią dane przed sprzecznościami.
Część bazodanowa INF.03Od rzeczywistości do modelu
Wyobraź sobie sklep internetowy. Obsługuje klientów, sprzedaje produkty i przyjmuje zamówienia. W opisie potrzeb biznesowych szukamy encji: rodzajów obiektów, o których chcemy zapisywać informacje. Klient i produkt to dwie różne encje. Konkretny klient, np. Ala, jest wystąpieniem encji Klient.
Atrybut opisuje cechę, np. imię klienta lub cenę produktu. W prostym projekcie relacyjnym encję odwzorowujemy jako tabelę, a atrybut jako kolumnę. Relacja w matematycznym modelu relacyjnym oznacza zbiór krotek; w codziennym języku bazodanowym słowo „relacja” bywa też używane na określenie powiązania tabel. Warto rozróżniać te znaczenia.
Struktura — schemat
Nazwy tabel, kolumny, typy, klucze i ograniczenia. Schemat odpowiada na pytanie: jakie dane oraz jakie zależności wolno zapisywać?
Stan — dane
Rekordy przechowywane w określonym momencie. Dodanie nowego klienta zmienia dane, ale zwykle nie zmienia schematu.
Tabela, wiersz, kolumna i dziedzina
Tabela produkty ma trzy kolumny. Każdy wiersz zawiera wartości opisujące jeden produkt. Dziedzina to dopuszczalny zbiór wartości atrybutu; opisuje ją typ wraz z regułami biznesowymi. Sama liczba dziesiętna dopuszcza wartości ujemne, ale cena sprzedaży może mieć dodatkowy warunek cena >= 0.
| id | nazwa | cena |
|---|---|---|
| 1 | Klawiatura | 120,00 |
| 2 | Mysz | 60,00 |
| 3 | Monitor | 800,00 |
| 4 | Kabel | 25,00 |
Ta tabela ma cztery rekordy i trzy kolumny. Jej liczność to 4, a stopień relacji to 3. Nie pomyl liczby wierszy z liczbą pól w strukturze. Nagłówki nie są rekordem danych.
W relacyjnym modelu kolejność krotek nie ma znaczenia. W SQL bez ORDER BY kolejność wyniku również nie jest gwarantowana. SQL dopuszcza ponadto powtarzające się wiersze wyniku, jeśli nie zażądasz usunięcia duplikatów — to praktyczna różnica względem matematycznego zbioru.
Dlaczego nie jedna wielka tabela?
Gdy wpiszesz pełne dane klienta przy każdej pozycji zamówienia, powielisz informacje. Zmiana jego danych będzie wymagała poprawek w wielu miejscach. Jeden pominięty rekord spowoduje sprzeczność. Dlatego rozdzielamy różne fakty:
klienci: id, imie, miasto, email;produkty: id, nazwa, cena;zamowienia: id, klient_id, data, status;pozycje: zamowienie_id, produkt_id, ilosc.
Połączenie tabel nie polega na ich fizycznym sklejeniu. Zapytanie JOIN może zbudować wynik z pasujących rekordów, pozostawiając strukturę przechowywania bez zmian. O kluczach i liczebnościach powiązań będzie następna lekcja.
Spójność nie powinna zależeć tylko od formularza
Użytkownik może wprowadzić dane przez stronę, import pliku albo skrypt. Jeżeli kontrolę umieścisz wyłącznie w formularzu, inna droga może ją ominąć. Dlatego SZBD egzekwuje ograniczenia:
- PRIMARY KEY — identyfikacja rekordu;
- NOT NULL — wartość jest obowiązkowa;
- UNIQUE — wymagana unikalność według reguł silnika;
- FOREIGN KEY — poprawność odwołania do powiązanego rekordu;
- CHECK — warunek na dane, np. ilość większa od zera.
Typ, ograniczenie i walidacja aplikacji uzupełniają się. Nie wszystkie reguły, np. złożone limity zależne od wielu rekordów, dają się zapisać pojedynczym CHECK. Liczy się też wersja silnika — np. historyczne wersje MySQL traktowały CHECK inaczej niż współczesne.
Ten sam model w różnych silnikach
| Środowisko | Co pozostaje wspólne? | Co trzeba sprawdzić? |
|---|---|---|
| MySQL / MariaDB | Tabele, kolumny, klucze, zapytania | Wersję, silnik tabel, kodowanie i reguły typów |
| SQL Server | Ten sam model klientów i zamówień | Typy T-SQL, schematy, IDENTITY i kolacje |
| Oracle | Te same zależności logiczne | Typy Oracle, sekwencje/identity, zachowanie NULL |
| Access / ACE | Relacyjne tabele i powiązania | Typy Access, autonumerowanie, tryb SQL i tabele podłączone |
Projekt logiczny może być podobny, ale fizyczne polecenie CREATE TABLE nie musi być identyczne. W tej lekcji projektujesz model; nie potrzebujesz jeszcze wykonywać SQL.
Ćwiczenia
- Biblioteka ma książki, czytelników i wypożyczenia. Wypisz trzy encje i po trzy sensowne atrybuty.
- Czy dodanie nowego produktu zmienia schemat czy dane? A dodanie kolumny masa?
- Co jest nie tak z kolumną telefony zawierającą tekst „111,222,333”, jeśli aplikacja ma wyszukiwać i sprawdzać każdy numer osobno?
Rozwiązania z omówieniem
- Książka: id, tytuł, ISBN; Czytelnik: id, imię, nazwisko; Wypożyczenie: id, czytelnik_id, egzemplarz_id oraz daty wypożyczenia/zwrotu. Jeśli biblioteka ma kilka kopii tej samej książki, warto wydzielić encję Egzemplarz. Opis biznesowy jest ważniejszy od mechanicznej liczby tabel.
- Nowy produkt zmienia dane. Nowa kolumna zmienia schemat.
- Lista utrudnia kontrolę i wyszukiwanie pojedynczych wartości. Zwykle lepiej utworzyć tabelę numerów powiązaną z właścicielem. Do atomowości i normalizacji wrócimy w części 4.
Powiązanie z INF.03.4: pojęcia i projektowanie relacyjnych baz danych. Źródło zakresu: podstawa programowa ORE. Następnie: klucze, relacje i diagram E/R.

