Relacje 1:1, 1:N, N:M i diagramy E/R: Chen, krucza stopka, UML

INF.03 · teoria
autor: redakcja · 07.09.2026 · aktualizacja: 08.09.2026
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, re­la­cja między en­cja­mi) to po­wią­za­nie między en­cja­mi: klient SKŁADA za­mó­wie­nie, za­mó­wie­nie DOTYCZY pro­duk­tu. Dia­gram E/R (Entity-Relationship Diagram, dia­gram związ­ków encji) to ry­su­nek encji, ich atry­bu­tów i związ­ków, który po­wsta­je przed pierw­szym CREATE TABLE. Na eg­za­mi­nie pi­sem­nym wra­ca­ją py­ta­nia z ry­sun­kiem: wskaż typ re­la­cji, podaj no­ta­cję, po­wiedz, co ozna­cza symbol na końcu linii i co znaczy zapis FK1. W za­da­niu prak­tycz­nym arkusz daje gotowy sche­mat re­la­cji, a ty od­czy­tu­jesz z niego klucze, żeby na­pi­sać kwe­ren­dę ze złą­cze­niem.

Li­czeb­ność związ­ku: 1:1, 1:N, N:M

Li­czeb­ność (kar­dy­nal­ność) mówi, ile wy­stą­pień jednej encji może łączyć się z jednym wy­stą­pie­niem dru­giej. Typy są trzy.
Typ
Czyta się
Przy­kład
1:1
jeden do jed­ne­go
pra­cow­nik i jego dane lo­go­wa­nia; uczeń i le­gi­ty­ma­cja
1:N
jeden do wielu
klient i jego za­mó­wie­nia; klasa i ucznio­wie
N:M
wiele do wielu
uczeń i przed­miot; aktor i film
Typ roz­po­zna­je się przez za­da­nie py­ta­nia w OBIE strony. Ile za­mó­wień może mieć jeden klient? Wiele. Ilu klien­tów ma jedno za­mó­wie­nie? Jed­ne­go. Wiele po jednej stro­nie i jeden po dru­giej daje 1:N, naj­częst­szy zwią­zek w bazach z ar­ku­szy. Gdy od­po­wiedź brzmi „wiele" po obu stro­nach (jeden uczeń uczy się wielu przed­mio­tów, jed­ne­go przed­mio­tu uczy się wielu uczniów), zwią­zek jest N:M. Gdy po obu stro­nach wypada „jeden", jest to 1:1.
Osobna sprawa to opcjo­nal­ność, czyli czy po­wią­za­nie MUSI ist­nieć. Za­pi­su­je się ją jako parę mi­ni­mum i mak­si­mum: 0..1, 1..1, 0..N, 1..N. Klient bez ani jed­ne­go za­mó­wie­nia to nor­mal­na sy­tu­acja, więc po stro­nie za­mó­wień stoi 0..N. Za­mó­wie­nie bez klien­ta bywa do­zwo­lo­ne (zakup bez konta, klucz obcy NULL), więc po stro­nie klien­ta stoi 0..1. Gdyby pro­jekt wy­ma­gał, żeby każde za­mó­wie­nie miało klien­ta, byłoby 1..1, a ko­lum­na do­sta­ła­by NOT NULL.

Jak zwią­zek za­mie­nia się w tabele

Dia­gram jest ry­sun­kiem, baza ma tabele, więc każdy typ związ­ku ma swój sposób zapisu.
Zwią­zek 1:N: w tabeli po stro­nie „wiele" de­fi­niu­je się klucz obcy wska­zu­ją­cy na klucz główny tabeli po stro­nie „jeden". W bazie sklep po stro­nie „wiele" stoi zamowienie, więc to ono ma ko­lum­nę klient_id, a nie od­wrot­nie. Tabela klient nie wie nic o za­mó­wie­niach i nie musi.
Zwią­zek 1:1: klucz obcy leży po jednej ze stron, ale do­sta­je UNIQUE, żeby nie dało się przy­piąć dwóch wier­szy do tego samego. Druga moż­li­wość to wspól­ny klucz główny, gdzie obie tabele mają to samo id, a klucz główny tabeli pod­rzęd­nej jest jed­no­cze­śnie klu­czem obcym. Dla­te­go dwie tabele po­łą­czo­ne klu­cza­mi głów­ny­mi to zawsze re­la­cja 1:1.
Zwią­zek N:M: ta­kie­go związ­ku nie da się za­pi­sać dwiema ta­be­la­mi. Po­trzeb­na jest tabela po­śred­nia (łą­czą­ca, junction table) z dwoma klu­cza­mi obcymi, które razem tworzą klucz główny zło­żo­ny. Ucznio­wie i przed­mio­ty wy­glą­da­ją w bazie tak:
Tabela uczen:
id
imie
klasa
1
Anna
4a
2
Piotr
4a
Tabela przedmiot:
id
nazwa
1
ma­te­ma­ty­ka
2
in­for­ma­ty­ka
Tabela uczen_przedmiot:
uczen_id
przed­miot_id
ocena
1
1
4
1
2
5
2
2
3
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­żo­ny z dwóch kolumn pil­nu­je, żeby ta sama para ucznia i przed­mio­tu nie po­wtó­rzy­ła się dwa razy. Ko­lum­na ocena po­ka­zu­je, po co tabela łą­czą­ca bywa czymś więcej niż sklej­ką: opi­su­je sam zwią­zek, a nie żadną ze stron. Zapis kluczy w po­le­ce­niu two­rzą­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 atry­bu­ty (ilosc, kwota). Róż­ni­ca jest jedna: do­sta­ła własny klucz główny id, bo ten sam klient może za­mó­wić ten sam pro­dukt drugi raz. Jak przejść przez taką tabelę za­py­ta­niem, po­ka­zu­je lekcja o złą­cze­niach.

Bloki skła­do­we dia­gra­mu E/R

Na każdym dia­gra­mie E/R, nie­za­leż­nie od no­ta­cji, wy­stę­pu­je pięć rzeczy.
  • Encja: obiekt, o którym baza prze­cho­wu­je dane; w bazie od­po­wia­da mu tabela (klient, ksiazka).
  • Atry­but: cecha encji, w bazie ko­lum­na (imie, tytul, data_od).
  • Klucz główny: atry­but, który jed­no­znacz­nie wska­zu­je jedno wy­stą­pie­nie encji. Każda encja do­sta­je do­kład­nie jeden, uni­kal­ny i nigdy pusty. Jeśli żaden na­tu­ral­ny atry­but się nie nadaje (imiona się po­wta­rza­ją, tytuły też), encja do­sta­je sztucz­ny id. W no­ta­cji Chena klucz główny jest PODKREŚLONY, w kru­czej stopce ozna­czo­ny skró­tem PK, a klucz obcy skró­tem FK albo FK1.
  • Zwią­zek: linia między en­cja­mi, opi­sa­na cza­sow­ni­kiem („składa", „wy­po­ży­cza").
  • Li­czeb­ność i opcjo­nal­ność: ozna­cze­nie przy końcu linii, które mówi „jeden" albo „wiele" oraz czy po­wią­za­nie jest obo­wiąz­ko­we.
Osobne po­ję­cie to encja słaba: taka, która nie ist­nie­je bez innej i nie ma sa­mo­dziel­ne­go klucza. Po­zy­cja za­mó­wie­nia bez za­mó­wie­nia jest niczym, więc iden­ty­fi­ku­je ją do­pie­ro para numer za­mó­wie­nia i numer po­zy­cji.

No­ta­cje: Chen, krucza stopka, UML

No­ta­cja to zestaw sym­bo­li, któ­ry­mi rysuje się dia­gram. Ten sam zwią­zek „klient składa za­mó­wie­nie" wy­glą­da w każdej ina­czej, 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..*)
No­ta­cja Chena rysuje encję jako pro­sto­kąt, zwią­zek jako ROMB z cza­sow­ni­kiem w środku, a każdy atry­but jako osobną elipsę do­cze­pio­ną do encji. Li­czeb­ność za­pi­su­je się przy li­niach li­te­ra­mi 1 i N. Jest naj­czy­tel­niej­sza przy nauce i naj­częst­sza w pod­ręcz­ni­kach, ale zaj­mu­je dużo miej­sca, bo dzie­sięć atry­bu­tów to dzie­sięć elips.
No­ta­cja Mar­ti­na, zwana kruczą stopką (crow's foot), rysuje encję jako pro­sto­kąt z listą atry­bu­tów w środku, ozna­czo­nych PK i FK. Rombów nie ma, cała in­for­ma­cja o związ­ku siedzi w koń­ców­kach linii. Tę no­ta­cję zo­ba­czysz w na­rzę­dziach: MySQL Work­bench, Pro­jek­tant w phpMyAdmin, draw.io, i to ona naj­czę­ściej trafia na ry­sun­ki w ar­ku­szach.
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 opi­su­je encję po PRZECIWNEJ stro­nie linii. Dwie kreski znaczą „do­kład­nie jeden", roz­wi­dle­nie przy­po­mi­na­ją­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 opcjo­nal­ność, a kreska to zawsze jeden.
Po­zo­sta­łe no­ta­cje wra­ca­ją w py­ta­niach głów­nie z nazwy. UML to dia­gram klas: encja jest klasą (pro­sto­kąt z nazwą i listą pól), a li­czeb­ność za­pi­su­je się jako 1, 0..1, 1..* albo *. No­ta­cja Min-Max stawia przy linii parę liczb w na­wia­sie, na przy­kład (0,N). No­ta­cja Bach­ma­na używa strza­łek, któ­rych grot wska­zu­je stronę „wiele".
No­ta­cja
Encja
Jak ozna­cza „wiele"
Gdzie spo­tkasz
Chen
pro­sto­kąt, atry­bu­ty w elip­sach
litera N przy linii
pod­ręcz­ni­ki, za­da­nia szkol­ne
Martin (krucza stopka)
pro­sto­kąt z listą atry­bu­tów
roz­wi­dle­nie linii
MySQL Work­bench, phpMyAdmin, draw.io
UML
klasa z listą pól
0..* albo *
pro­jek­to­wa­nie opro­gra­mo­wa­nia
Min-Max
pro­sto­kąt
druga liczba pary, (0,N)
opra­co­wa­nia aka­de­mic­kie
Bach­man
pro­sto­kąt
grot strzał­ki
star­sze opra­co­wa­nia

Jak czytać dia­gram krok po kroku

Ry­su­nek z ar­ku­sza czyta się zawsze tak samo. Weź dia­gram bi­blio­te­ki z en­cja­mi czy­tel­nik, wy­po­ży­cze­nie i książ­ka.
  • 1.
    Wypisz encje, czyli pro­sto­ką­ty. Każdy z nich to jedna tabela.
  • 2.
    Znajdź w każdym pro­sto­ką­cie klucz główny, ozna­czo­ny PK albo pod­kre­śle­niem.
  • 3.
    Znajdź klucze obce, ozna­czo­ne FK albo FK1. Bez ozna­czeń po­znasz je po nazwie koń­czą­cej się na _id, która po­wta­rza nazwę innej encji.
  • 4.
    Od­czy­taj koń­ców­ki obu linii i nazwij zwią­zek sło­wa­mi, w obie strony.
  • 5.
    Zapisz wynik jako tabele z ko­lum­na­mi.
Dla bi­blio­te­ki wynik wy­glą­da tak:
czytelnik(id, imie, nazwisko, miasto) ksiazka(id, tytul, autor, rok) wypozyczenie(id, czytelnik_id, ksiazka_id, data_od, data_do)
Odczyt sło­wa­mi: jeden czy­tel­nik ma zero albo wiele wy­po­ży­czeń, jedno wy­po­ży­cze­nie należy do do­kład­nie jed­ne­go czy­tel­ni­ka. Po stro­nie książ­ki jest tak samo. Dwa razy 1:N spo­ty­ka­ją­ce się w środku to znak roz­po­znaw­czy związ­ku N:M roz­bi­te­go na tabele: wypozyczenie jest tabelą łą­czą­cą czy­tel­ni­ka z książ­ką, a data_od i data_do to atry­bu­ty samego wy­po­ży­cze­nia. Gdyby za­da­nie kazało wy­pi­sać, kto co wy­po­ży­czył, droga pro­wa­dzi przez tę tabelę dwoma złą­cze­nia­mi.

Na eg­za­mi­nie

Py­ta­nie pi­sem­ne prawie zawsze po­ka­zu­je ry­su­nek. Typowe po­le­ce­nia: wskaż typ re­la­cji między dwiema ta­be­la­mi, podaj nazwę no­ta­cji (Mar­ti­na, czyli kru­czej stopki, albo Chena), po­wiedz, jaki zwią­zek przed­sta­wia symbol „wiele do jed­ne­go z opcjo­nal­no­ścią po prawej stro­nie", wy­ja­śnij zapis FK1, czyli klucz obcy. Wra­ca­ją też py­ta­nia o same po­ję­cia: ele­men­ty czy­tel­nik, wy­po­ży­cze­nie i książ­ka na dia­gra­mie to encje, a po­wią­za­nie między zbio­ra­mi encji to zwią­zek.
Pu­łap­ka: re­la­cja 1:N łączy klucz OBCY jednej tabeli z klu­czem GŁÓWNYM dru­giej. Od­po­wiedź „klucz obcy z klu­czem obcym" jest zawsze błędna, a „klucz główny z klu­czem głów­nym" opi­su­je re­la­cję 1:1.
Druga pu­łap­ka do­ty­czy strony, po której leży klucz obcy. Przy jeden do wielu de­fi­niu­je się go w tabeli po stro­nie WIELE i wska­zu­je nim klucz pod­sta­wo­wy tabeli po stro­nie jeden. Od­wrot­ny zapis wy­ma­gał­by wielu war­to­ści w jednej ko­mór­ce.
W części prak­tycz­nej dia­gram nie jest ozdobą: to jedyne miej­sce, z któ­re­go wia­do­mo, którą ko­lum­ną łączyć tabele w kwe­ren­dzie „wy­ko­rzy­stu­ją­cej re­la­cję". Zanim na­pi­szesz za­py­ta­nie, znajdź na sche­ma­cie linię między po­trzeb­ny­mi ta­be­la­mi i od­czy­taj z niej parę kolumn do wa­run­ku ON. Gdy tabele nie są­sia­du­ją ze sobą, droga pro­wa­dzi przez tabelę po­śred­nią i dwa złą­cze­nia.

Ściąga

Zwią­zek
Jak za­pi­sać w ta­be­lach
Przy­kład
1:1
klucz obcy z UNIQUE albo wspól­ny klucz główny w obu ta­be­lach
pra­cow­nik i jego dane lo­go­wa­nia
1:N
klucz obcy w tabeli po stro­nie „wiele", wska­zu­je klucz główny strony „jeden"
klient i za­mó­wie­nie
N:M
tabela po­śred­nia z dwoma klu­cza­mi obcymi jako klu­czem głów­nym zło­żo­nym
uczeń i przed­miot
opcjo­nal­ność 0..1
klucz obcy może być NULL
za­mó­wie­nie bez konta klien­ta
opcjo­nal­ność 1..1
klucz obcy z NOT NULL
po­zy­cja nie ist­nie­je bez za­mó­wie­nia
ozna­cze­nia kluczy
PK klucz główny (u Chena pod­kre­śle­nie), FK1 klucz obcy
zamowienie(id PK, klient_id FK1)
Pobierz ściągę PDF
ZAWODNIK
egzamin zawodowy INF.02 · INF.03 · INF.04
Serwer Discord
Egzaminy zawodowe IT/Matury/Studia
@yastor
© 2026 Zawodnik · by Yastor
Arkusze i zasady oceniania pochodzą z CKE. Serwis nie jest powiązany z Centralną Komisją Egzaminacyjną.