Dawno, dawno temu, kiedy dinozaury były wielkie... a dokładniej w 1970 roku, pewien gość o imieniu Edgar Codd stwierdził, że chaos w danych już dawno przestał być twórczym nieporządkiem i bardziej przypomina czarną dziurę, która pożera czas i zasoby. Edgar długo myślał i wymyślił sposób, jak to wszystko ogarnąć, a przy okazji — położył fundament pod cały świat, gdzie dane układają się w schludne tabelki, jak książki na półce w idealnej bibliotece. Wiersze, kolumny, porządek — i żadnego "jakoś to będzie" czy "no przecież wszystko jasne".
Relacyjny model opiera się na przedstawieniu danych w postaci tabel, gdzie każda tabela składa się z wierszy i kolumn. Intuicyjnie wszystko jasne: wiersze to rekordy, kolumny to właściwości lub atrybuty rekordu. Takie podejście ułatwia przetwarzanie i manipulowanie danymi.
Wyobraź sobie, że składasz zamówienie w sklepie internetowym. Żeby to zamówienie zostało poprawnie obsłużone i dostarczone, system musi uwzględnić mnóstwo szczegółów: kim jesteś (klient), jaką firmę kurierską wybrałeś, gdzie dostarczyć i jak śledzić status paczki.
Gdyby wszystkie te informacje były trzymane w jednej wielkiej tabeli, byłby totalny chaos: dane by się powtarzały, ciężko byłoby je aktualizować, a jeszcze trudniej — szybko znaleźć potrzebne info. Relacyjne podejście pomaga wprowadzić porządek, rozdzielając informacje między tabele, które mogą się wymieniać danymi.
Na tym schemacie masz przykład organizacji danych dla procesu śledzenia dostaw:
- Klienci - tutaj trzymane są informacje o każdym kliencie – z unikalnym Numerem Klienta.
- Firmy kurierskie - ta tabela zawiera listę firm, które mogą realizować dostawę, z ich unikalnym Numerem Firmy.
- Dostawa zamówienia - to centralna, łącząca tabela. Każdy wiersz to jedna konkretna dostawa. Zawiera swój Numer Dostawy, a także odnosi się do klienta, firmy kurierskiej, może odnosić się do konkretnego zamówienia, daty i aktualnego statusu.
Strzałki pokazują, jak rekordy z tabeli Dostawa zamówienia są powiązane z rekordami w tabelach Klienci i Firmy kurierskie.
Przykładowa tabela Dostawa zamówienia:
| Numer Dostawy | Numer Klienta | Numer Firmy | Numer Zamówienia | Data utworzenia | Status dostawy |
|---|---|---|---|---|---|
| 121 | 101 | 1 | 1569 | 2025-03-23 | Dostarczono |
| 122 | 234 | 3 | 1570 | 2025-03-24 | Dostarczono |
| 123 | 1011 | 2 | 1571 | 2025-03-25 | Aktywny |
| 124 | 1011 | 2 | 1572 | 2025-03-25 | Oczekuje |
Zalety takiego podejścia:
- Informacje o klientach lub firmach kurierskich są przechowywane tylko raz, co pozwala uniknąć powtórzeń w każdym osobnym rekordzie dostawy.
- Powiązania przez unikalne numery (nazywane też kluczami) pomagają zagwarantować, że nie będzie np. dostaw bez istniejącego klienta albo przez nieistniejącą firmę.
- Łatwo łączyć dane z różnych tabel, żeby uzyskać złożone raporty lub konkretne zestawienia.
- Zmiana danych odbywa się w jednym miejscu i od razu jest widoczna we wszystkich powiązanych operacjach (np. numer telefonu firmy kurierskiej).
Struktura relacyjnej bazy danych
Sercem relacyjnej bazy danych są tabele. Każda tabela ma:
- Nazwę (Table Name), żebyśmy mogli ją zidentyfikować — na przykład customers.
- Zestaw kolumn (Columns/Attributes), które określają właściwości obiektu.
- Przy nazywaniu kolumn, które służą jako unikalne numery (klucze główne), często używamy wzorca
nazwa_id. Sufiks_idoznacza tutaj "identifier". Przykład:Numer Klientastaje sięcustomer_id. - Na przykład, dla tabeli customers: mogą to być
customer_id,first_name,emaili tak dalej.
- Przy nazywaniu kolumn, które służą jako unikalne numery (klucze główne), często używamy wzorca
- Dane w wierszach (Rows/Records) - jeden wiersz w tabeli customers: będzie zawierał pełne informacje o jednym konkretnym kliencie (101, Alex Song itd.).
Przykład tabeli — customers:
| customer_id | full_name | phone_number | delivery_address | registration_date | |
|---|---|---|---|---|---|
| 101 | Alex Song | alex.song@example.com | 555-0101 | 123 Main St, Anytown | 2023-01-15 |
| 234 | Maria Garcia | maria.g@example.org | 555-0102 | 456 Oak Ave, Otherville | 2022-11-30 |
| 1011 | David Lee | david.lee@example.net | 555-0103 | 789 Pine Ln, Sometown | 2023-03-01 |
Klucze tabel
Żeby jednoznacznie określić każdy wiersz w tabeli, używa się klucza głównego (Primary Key, PK). To kolumna (albo kilka), której wartości są unikalne dla każdego wiersza i nie mogą być puste. Wyobraź sobie to jako unikalny numer dla każdego rekordu, np. customer_id w naszej tabeli customers: jednoznacznie identyfikuje każdego klienta.
Klucz główny jest jak paszport, a dokładniej — jego numer: jest unikalny dla każdego obiektu. I pomaga uniknąć problemów z rekordami o tych samych danych.
Do tworzenia powiązań między tabelami używa się klucza obcego (Foreign Key, FK). To kolumna w jednej tabeli, która odnosi się do klucza głównego w innej tabeli. Klucze obce to "mosty" między tabelami. Często nazwa kolumny klucza obcego jest taka sama jak nazwa klucza głównego, do którego się odnosi. Na przykład, w tabeli deliveries kolumna customer_id będzie kluczem obcym, przechowującym wartości z kolumny customer_id tabeli customers, łącząc w ten sposób dostawę z klientem.
To znany nam schemat, ale teraz przedstawiony w bardziej realistycznej formie.
- Tabela customers zawiera informacje o klientach; jej klucz główny to
customer_id. - Tabela delivery_services przechowuje dane o firmach kurierskich; jej klucz główny to
service_id. - Tabela orders (pokazana dla kompletności, bo jest do niej odniesienie
order_idz tabeli dostaw) służy do informacji o zamówieniach, z kluczem głównymorder_id. - Tabela deliveries jest centralna do śledzenia operacji dostawy. Ma:
- Własny klucz główny:
delivery_id. - Trzy klucze obce do tworzenia powiązań:
customer_id(FK): łączy dostawę z konkretnym klientem z tabeli customers.service_id(FK): łączy dostawę z wybraną firmą z tabeli delivery_services.order_id(FK): łączy dostawę z odpowiednim zamówieniem z tabeli orders.
- Pole
created_datewskazuje na datę i godzinę utworzenia rekordu dostawy.
- Własny klucz główny:
Takie użycie kluczy głównych i obcych zapewnia spójność danych. System nie pozwoli utworzyć rekordu dostawy, jeśli podany customer_id albo order_id nie istnieje w odpowiednich tabelach i pozwala elastycznie pobierać powiązane informacje.
Zalety relacyjnego modelu
Relacyjny model ma sporo konkretnych plusów, które sprawiają, że jest liderem wśród innych podejść:
- Prosta struktura. Tabele z kolumnami i wierszami są czytelne i proste.
- Elastyczność w pracy z danymi. Możesz łatwo dodawać nowe dane lub je zmieniać, nie psując spójności.
- Wsparcie dla złożonych zapytań. Dzięki SQL możesz pobierać dane z wielu tabel, łączyć je, filtrować i robić praktycznie wszystko, czego wymaga twoje zadanie. Na przykład, znaleźć wszystkich studentów zapisanych na konkretny kurs — prościzna!
- Spójność danych przez klucze. Użycie kluczy głównych i obcych gwarantuje, że dane w bazie będą zgodne. Nie możesz np. dodać rekordu o studencie na kursie, jeśli taki kurs nie istnieje.
Relacyjny model danych to fundament współczesnych baz danych. Jest prosty, potężny i świetnie nadaje się do przechowywania uporządkowanych danych. Jak powiedział Edgar Codd: "Porządkuj albo giń!" (no, powiedział to trochę inaczej, ale sens jest mniej więcej taki...). W następnym wykładzie dowiesz się, czym relacyjny model różni się od innych typów baz danych (np. NoSQL) i gdzie najlepiej je stosować.
GO TO FULL VERSION