Czym różni się związek 1:1, 1:N i N:M, jak każdy z nich zapisać w tabelach kluczem obcym albo tabelą pośrednią i jak czytać diagram E/R w notacji Chena, kruczej stopki i UML. Lekcja 7.3 kursu INF.03.
Związek (relationship, relacja między encjami) to powiązanie między encjami: klient SKŁADA zamówienie, zamówienie DOTYCZY produktu. Diagram E/R (Entity-Relationship Diagram, diagram związków encji) to rysunek encji, ich atrybutów i związków, który powstaje przed pierwszym CREATE TABLE. Na egzaminie pisemnym wracają pytania z rysunkiem: wskaż typ relacji, podaj notację, powiedz, co oznacza symbol na końcu linii i co znaczy zapis FK1. W zadaniu praktycznym arkusz daje gotowy schemat relacji, a ty odczytujesz z niego klucze, żeby napisać kwerendę ze złączeniem.
Liczebność związku: 1:1, 1:N, N:M
Liczebność (kardynalność) mówi, ile wystąpień jednej encji może łączyć się z jednym wystąpieniem drugiej. Typy są trzy.
1:1
jeden do jednego
pracownik i jego dane logowania; uczeń i legitymacja
1:N
jeden do wielu
klient i jego zamówienia; klasa i uczniowie
N:M
wiele do wielu
uczeń i przedmiot; aktor i film
Typ rozpoznaje się przez zadanie pytania w OBIE strony. Ile zamówień może mieć jeden klient? Wiele. Ilu klientów ma jedno zamówienie? Jednego. Wiele po jednej stronie i jeden po drugiej daje 1:N, najczęstszy związek w bazach z arkuszy. Gdy odpowiedź brzmi „wiele" po obu stronach (jeden uczeń uczy się wielu przedmiotów, jednego przedmiotu uczy się wielu uczniów), związek jest N:M. Gdy po obu stronach wypada „jeden", jest to 1:1.
Osobna sprawa to opcjonalność, czyli czy powiązanie MUSI istnieć. Zapisuje się ją jako parę minimum i maksimum: 0..1, 1..1, 0..N, 1..N. Klient bez ani jednego zamówienia to normalna sytuacja, więc po stronie zamówień stoi 0..N. Zamówienie bez klienta bywa dozwolone (zakup bez konta, klucz obcy NULL), więc po stronie klienta stoi 0..1. Gdyby projekt wymagał, żeby każde zamówienie miało klienta, byłoby 1..1, a kolumna dostałaby NOT NULL.
Jak związek zamienia się w tabele
Diagram jest rysunkiem, baza ma tabele, więc każdy typ związku ma swój sposób zapisu.
Związek 1:N: w tabeli po stronie „wiele" definiuje się klucz obcy wskazujący na klucz główny tabeli po stronie „jeden". W bazie sklep po stronie „wiele" stoi zamowienie, więc to ono ma kolumnę klient_id, a nie odwrotnie. Tabela klient nie wie nic o zamówieniach i nie musi.
Związek 1:1: klucz obcy leży po jednej ze stron, ale dostaje UNIQUE, żeby nie dało się przypiąć dwóch wierszy do tego samego. Druga możliwość to wspólny klucz główny, gdzie obie tabele mają to samo id, a klucz główny tabeli podrzędnej jest jednocześnie kluczem obcym. Dlatego dwie tabele połączone kluczami głównymi to zawsze relacja 1:1.
Związek N:M: takiego związku nie da się zapisać dwiema tabelami. Potrzebna jest tabela pośrednia (łącząca, junction table) z dwoma kluczami obcymi, które razem tworzą klucz główny złożony. Uczniowie i przedmioty wyglądają w bazie tak:
Tabela uczen:
Tabela przedmiot:
Tabela uczen_przedmiot:
uczen_id
przedmiot_id
ocena
CREATE TABLE uczen_przedmiot (
uczen_id INT NOT NULL,
przedmiot_id INT NOT NULL,
ocena TINYINT,
PRIMARY KEY (uczen_id, przedmiot_id),
FOREIGN KEY (uczen_id) REFERENCES uczen(id),
FOREIGN KEY (przedmiot_id) REFERENCES przedmiot(id)
);
Klucz główny złożony z dwóch kolumn pilnuje, żeby ta sama para ucznia i przedmiotu nie powtórzyła się dwa razy. Kolumna ocena pokazuje, po co tabela łącząca bywa czymś więcej niż sklejką: opisuje sam związek, a nie żadną ze stron. Zapis kluczy w poleceniu tworzącym tabelę omawia lekcja o CREATE, ALTER i DROP. Tabela zamowienie z bazy sklep jest właśnie taką tabelą łączącą: stoi między klient a produkt, ma dwa klucze obce (klient_id, produkt_id) i własne atrybuty (ilosc, kwota). Różnica jest jedna: dostała własny klucz główny id, bo ten sam klient może zamówić ten sam produkt drugi raz. Jak przejść przez taką tabelę zapytaniem, pokazuje lekcja o złączeniach. Bloki składowe diagramu E/R
Na każdym diagramie E/R, niezależnie od notacji, występuje pięć rzeczy.
›
Encja: obiekt, o którym baza przechowuje dane; w bazie odpowiada mu tabela (klient, ksiazka).
›
Atrybut: cecha encji, w bazie kolumna (imie, tytul, data_od).
›
Klucz główny: atrybut, który jednoznacznie wskazuje jedno wystąpienie encji. Każda encja dostaje dokładnie jeden, unikalny i nigdy pusty. Jeśli żaden naturalny atrybut się nie nadaje (imiona się powtarzają, tytuły też), encja dostaje sztuczny id. W notacji Chena klucz główny jest PODKREŚLONY, w kruczej stopce oznaczony skrótem PK, a klucz obcy skrótem FK albo FK1.
›
Związek: linia między encjami, opisana czasownikiem („składa", „wypożycza").
›
Liczebność i opcjonalność: oznaczenie przy końcu linii, które mówi „jeden" albo „wiele" oraz czy powiązanie jest obowiązkowe.
Osobne pojęcie to encja słaba: taka, która nie istnieje bez innej i nie ma samodzielnego klucza. Pozycja zamówienia bez zamówienia jest niczym, więc identyfikuje ją dopiero para numer zamówienia i numer pozycji.
Notacje: Chen, krucza stopka, UML
Notacja to zestaw symboli, którymi rysuje się diagram. Ten sam związek „klient składa zamówienie" wygląda w każdej inaczej, a znaczy to samo.
Ten sam związek klient składa zamówienie w notacji Chena (romb i elipsy), kruczej stopki (listy atrybutów i końcówki linii) oraz UML (klasy z liczebnościami 1 i 0..*)
Notacja Chena rysuje encję jako prostokąt, związek jako ROMB z czasownikiem w środku, a każdy atrybut jako osobną elipsę doczepioną do encji. Liczebność zapisuje się przy liniach literami 1 i N. Jest najczytelniejsza przy nauce i najczęstsza w podręcznikach, ale zajmuje dużo miejsca, bo dziesięć atrybutów to dziesięć elips.
Notacja Martina, zwana kruczą stopką (crow's foot), rysuje encję jako prostokąt z listą atrybutów w środku, oznaczonych PK i FK. Rombów nie ma, cała informacja o związku siedzi w końcówkach linii. Tę notację zobaczysz w narzędziach: MySQL Workbench, Projektant w phpMyAdmin, draw.io, i to ona najczęściej trafia na rysunki w arkuszach.
Końcówki linii w notacji kruczej stopki: dwie kreski to dokładnie jeden, kółko to zero, rozwidlenie to wiele; przykład czyta się: klient ma zero albo wiele zamówień, zamówienie ma zero albo jednego klienta
Symbol opisuje encję po PRZECIWNEJ stronie linii. Dwie kreski znaczą „dokładnie jeden", rozwidlenie przypominające ptasią stopę znaczy „wiele", kółko z kreską „zero albo jeden", kreska ze stopką „jeden albo wiele", kółko ze stopką „zero albo wiele". Kółko to zawsze zero, czyli opcjonalność, a kreska to zawsze jeden.
Pozostałe notacje wracają w pytaniach głównie z nazwy. UML to diagram klas: encja jest klasą (prostokąt z nazwą i listą pól), a liczebność zapisuje się jako 1, 0..1, 1..* albo *. Notacja Min-Max stawia przy linii parę liczb w nawiasie, na przykład (0,N). Notacja Bachmana używa strzałek, których grot wskazuje stronę „wiele".
Notacja
Encja
Jak oznacza „wiele"
Gdzie spotkasz
Chen
prostokąt, atrybuty w elipsach
litera N przy linii
podręczniki, zadania szkolne
Martin (krucza stopka)
prostokąt z listą atrybutów
rozwidlenie linii
MySQL Workbench, phpMyAdmin, draw.io
UML
klasa z listą pól
0..* albo *
projektowanie oprogramowania
Min-Max
prostokąt
druga liczba pary, (0,N)
opracowania akademickie
Bachman
prostokąt
grot strzałki
starsze opracowania
Jak czytać diagram krok po kroku
Rysunek z arkusza czyta się zawsze tak samo. Weź diagram biblioteki z encjami czytelnik, wypożyczenie i książka.
1.
Wypisz encje, czyli prostokąty. Każdy z nich to jedna tabela.
2.
Znajdź w każdym prostokącie klucz główny, oznaczony PK albo podkreśleniem.
3.
Znajdź klucze obce, oznaczone FK albo FK1. Bez oznaczeń poznasz je po nazwie kończącej się na _id, która powtarza nazwę innej encji.
4.
Odczytaj końcówki obu linii i nazwij związek słowami, w obie strony.
5.
Zapisz wynik jako tabele z kolumnami.
Dla biblioteki wynik wygląda tak:
czytelnik(id, imie, nazwisko, miasto)
ksiazka(id, tytul, autor, rok)
wypozyczenie(id, czytelnik_id, ksiazka_id, data_od, data_do)
Odczyt słowami: jeden czytelnik ma zero albo wiele wypożyczeń, jedno wypożyczenie należy do dokładnie jednego czytelnika. Po stronie książki jest tak samo. Dwa razy 1:N spotykające się w środku to znak rozpoznawczy związku N:M rozbitego na tabele: wypozyczenie jest tabelą łączącą czytelnika z książką, a data_od i data_do to atrybuty samego wypożyczenia. Gdyby zadanie kazało wypisać, kto co wypożyczył, droga prowadzi przez tę tabelę dwoma złączeniami.
Na egzaminie
Pytanie pisemne prawie zawsze pokazuje rysunek. Typowe polecenia: wskaż typ relacji między dwiema tabelami, podaj nazwę notacji (Martina, czyli kruczej stopki, albo Chena), powiedz, jaki związek przedstawia symbol „wiele do jednego z opcjonalnością po prawej stronie", wyjaśnij zapis FK1, czyli klucz obcy. Wracają też pytania o same pojęcia: elementy czytelnik, wypożyczenie i książka na diagramie to encje, a powiązanie między zbiorami encji to związek.
Pułapka: relacja 1:N łączy klucz OBCY jednej tabeli z kluczem GŁÓWNYM drugiej. Odpowiedź „klucz obcy z kluczem obcym" jest zawsze błędna, a „klucz główny z kluczem głównym" opisuje relację 1:1.
Druga pułapka dotyczy strony, po której leży klucz obcy. Przy jeden do wielu definiuje się go w tabeli po stronie WIELE i wskazuje nim klucz podstawowy tabeli po stronie jeden. Odwrotny zapis wymagałby wielu wartości w jednej komórce.
W części praktycznej diagram nie jest ozdobą: to jedyne miejsce, z którego wiadomo, którą kolumną łączyć tabele w kwerendzie „wykorzystującej relację". Zanim napiszesz zapytanie, znajdź na schemacie linię między potrzebnymi tabelami i odczytaj z niej parę kolumn do warunku ON. Gdy tabele nie sąsiadują ze sobą, droga prowadzi przez tabelę pośrednią i dwa złączenia.
Ściąga
Związek
Jak zapisać w tabelach
Przykład
1:1
klucz obcy z UNIQUE albo wspólny klucz główny w obu tabelach
pracownik i jego dane logowania
1:N
klucz obcy w tabeli po stronie „wiele", wskazuje klucz główny strony „jeden"
klient i zamówienie
N:M
tabela pośrednia z dwoma kluczami obcymi jako kluczem głównym złożonym
uczeń i przedmiot
opcjonalność 0..1
klucz obcy może być NULL
zamówienie bez konta klienta
opcjonalność 1..1
klucz obcy z NOT NULL
pozycja nie istnieje bez zamówienia
oznaczenia kluczy
PK klucz główny (u Chena podkreślenie), FK1 klucz obcy
zamowienie(id PK, klient_id FK1)
Pobierz ściągę PDF