Encje, atrybuty i klucze: główny, obcy, sztuczny, złożony

INF.03 · teoria
autor: redakcja · 07.09.2026 · aktualizacja: 08.09.2026
Czym jest encja i jej atrybuty, jak wybrać klucz główny, po co jest klucz obcy i jak dobrać typ danych do każdej kolumny, gdy projektujesz tabelę od zera. Lekcja 7.2 kursu INF.03.
Encja (entity) to typ obiek­tu, o którym baza prze­cho­wu­je dane: klient, pro­dukt, za­mó­wie­nie. W bazie re­la­cyj­nej encji od­po­wia­da tabela, po­je­dyn­cze­mu wy­stą­pie­niu encji rekord, a atry­bu­to­wi encji ko­lum­na. Na eg­za­mi­nie pi­sem­nym wra­ca­ją z tego trzy py­ta­nia: przez co jest re­pre­zen­to­wa­na encja, co jed­no­znacz­nie iden­ty­fi­ku­je rekord i jaki typ danych pasuje do opi­sa­nej ko­lum­ny. W za­da­niu prak­tycz­nym ta sama wiedza jest po­trzeb­na dwa razy: przy czy­ta­niu sche­ma­tu re­la­cji z ar­ku­sza i przy po­le­ce­niu ALTER TABLE ... ADD, w którym typ nowej ko­lum­ny podano sło­wa­mi.

Encja i atry­but

Encja to rze­czow­nik z opisu za­da­nia, o którym trzy­ma­my WIELE wy­stą­pień o tym samym ze­sta­wie cech. Atry­but to jedna taka cecha. Pro­jekt bazy za­czy­na się od zdań za­ma­wia­ją­ce­go:
Biuro turystyczne prowadzi listę wycieczek: nazwa, kraj, cena, liczba dni, termin wyjazdu.
Encją jest tutaj wy­ciecz­ka, bo wy­cie­czek jest wiele i każda ma nazwę, kraj, cenę, liczbę dni i termin. Te pięć rzeczy to atry­bu­ty: opi­su­ją wy­ciecz­kę, ale nie są obiek­ta­mi, o któ­rych zbie­ra­my osobne dane. Kraj bywa gra­nicz­nym przy­pad­kiem: jeżeli za­ma­wia­ją­cy chce trzy­mać przy kraju walutę i wy­ma­ga­ne do­ku­men­ty, kraj staje się osobną encją. De­fi­ni­cję encji z atry­bu­ta­mi za­pi­su­je się w pro­jek­cie skró­to­wo, z klu­czem głów­nym na pierw­szym miej­scu:
wycieczka(id, nazwa, kraj, cena, dni, termin)
Dzie­dzi­na (domain) atry­bu­tu to zbiór war­to­ści, które wolno w nim za­pi­sać. Dzie­dzi­ną atry­bu­tu dni są liczby cał­ko­wi­te do­dat­nie, dzie­dzi­ną atry­bu­tu cena liczby nie­ujem­ne z dwoma miej­sca­mi po prze­cin­ku. Dzie­dzi­na jest tym, co potem prze­kła­da się na typ danych i na ogra­ni­cze­nia ko­lum­ny.
Atry­but prosty ma jedną, nie­po­dziel­ną war­tość: cena, termin. Atry­but zło­żo­ny roz­pa­da się na części, jak adres na ulicę, kod pocz­to­wy i miasto. W tabeli za­pi­su­je się go jako osobne ko­lum­ny ulica, kod, miasto, bo wy­szu­ki­wa­nie po samym mie­ście z jednej wspól­nej ko­lum­ny jest nie­wy­ko­nal­ne. Atry­but jed­no­war­to­ścio­wy trzyma jedną war­tość na wy­stą­pie­nie, a atry­but wie­lo­war­to­ścio­wy wiele: klient z dwoma nu­me­ra­mi te­le­fo­nu. Ko­lum­na telefon z wpisem 600100200, 601200300 to sygnał, że bra­ku­je osob­nej tabeli. Dla­cze­go tak jest, tłu­ma­czy lekcja o nor­ma­li­za­cji.

Klucz główny

Klucz główny (PRIMARY KEY, w py­ta­niach na­zy­wa­ny też klu­czem pod­sta­wo­wym) to ko­lum­na albo zestaw kolumn, które jed­no­znacz­nie iden­ty­fi­ku­ją rekord w tabeli. Po jego war­to­ści baza trafia w do­kład­nie jeden wiersz i po niej wska­zu­ją go inne tabele.
  • War­tość jest uni­kal­na: dwa re­kor­dy nie mogą mieć tej samej.
  • War­tość nigdy nie jest pusta, więc ko­lum­nę za­bez­pie­cza się atry­bu­tem NOT NULL.
  • Tabela ma do­kład­nie jeden klucz główny.
  • Dobry klucz jest krótki i nie­zmien­ny, bo po­wta­rza się w klu­czach obcych innych tabel.
Klucz kan­dy­du­ją­cy (candidate key) to każda ko­lum­na albo zestaw kolumn, które mo­gły­by pełnić tę rolę. W tabeli klient kan­dy­da­ta­mi są numer PESEL i adres e-mail, a imię nie, bo Anna może być druga. Z kan­dy­da­tów wy­bie­ra się jeden i on zo­sta­je klu­czem głów­nym.
Klucz na­tu­ral­ny po­cho­dzi z danych, które i tak opi­su­ją obiekt: PESEL, numer in­dek­su, ISBN książ­ki. Klucz sztucz­ny (surrogate key) to numer dodany tylko po to, żeby iden­ty­fi­ko­wać rekord, w MySQL naj­czę­ściej id INT AUTO_INCREMENT. W prak­ty­ce prawie zawsze wy­bie­ra się sztucz­ny: na­tu­ral­ny bywa długi, bywa nie­zna­ny w chwili do­da­wa­nia re­kor­du, po­tra­fi się zmie­nić (na­zwi­sko po ślubie, adres e-mail), a PESEL to do­dat­ko­wo dana oso­bo­wa, której nie chce się ko­pio­wać do połowy tabel. Dla­te­go w bazie sklepu klient, produkt i zamowienie mają zwykłe id.
Klucz zło­żo­ny (composite key) to klucz główny zbu­do­wa­ny z dwóch albo więcej kolumn, które do­pie­ro razem są uni­kal­ne. Typowo w tabeli łą­czą­cej: w tabeli uczen_przedmiot ko­lum­ny uczen_id i przedmiot_id osobno po­wta­rza­ją się wiele razy, ale para uczeń plus przed­miot wy­stę­pu­je raz.
Pu­łap­ka: klucz główny nie musi być liczbą i nie musi na­zy­wać się id, ale musi być uni­kal­ny i różny od NULL. Wła­śnie to nazywa się in­te­gral­no­ścią encji.

Klucz obcy

Klucz obcy (FOREIGN KEY) to ko­lum­na, która prze­cho­wu­je war­tość klucza głów­ne­go innej tabeli. Tworzy się go po to, żeby zde­fi­nio­wać re­la­cję jeden do wielu: klucz obcy stoi zawsze po stro­nie „wiele". Jeden klient ma wiele za­mó­wień, więc to zamowienie do­sta­je ko­lum­nę klient_id, a nie od­wrot­nie. W bazie sklepu wy­glą­da to tak: klient(id, imie, miasto) z klu­czem głów­nym id oraz zamowienie(id, klient_id, produkt_id, ilosc, kwota), w którym klient_id wska­zu­je na klient.id.
W tabeli klient kluczem głównym jest kolumna id, a w tabeli zamowienie kolumna klient_id jest kluczem obcym wskazującym na tę wartość, przy czym zamówienie 13 ma w niej NULL
Klucz obcy pil­nu­je in­te­gral­no­ści re­fe­ren­cyj­nej: każdej war­to­ści klucza obcego musi od­po­wia­dać ist­nie­ją­ca war­tość klucza głów­ne­go w tabeli po­wią­za­nej. Baza nie po­zwo­li dodać za­mó­wie­nia klien­ta o nu­me­rze 99, skoro ta­kie­go klien­ta nie ma, ani ska­so­wać klien­ta, do któ­re­go za­mó­wie­nia się od­wo­łu­ją. Sam klucz obcy może być pusty, jeżeli ko­lum­na nie ma NOT NULL: za­mó­wie­nie 13 z ry­sun­ku ma NULL w klient_id, bo po­wsta­ło bez konta. NULL nie łamie in­te­gral­no­ści, bo nie wska­zu­je na nic.
Typ ko­lum­ny z klu­czem obcym musi być iden­tycz­ny z typem klucza głów­ne­go, na który wska­zu­je. Jeżeli klient.id jest INT UNSIGNED, to zamowienie.klient_id też, ina­czej baza od­rzu­ci de­fi­ni­cję re­la­cji.
CREATE TABLE zamowienie ( id INT AUTO_INCREMENT PRIMARY KEY, klient_id INT, produkt_id INT NOT NULL, ilosc INT NOT NULL, FOREIGN KEY (klient_id) REFERENCES klient (id) );
Gdy klucz główny wska­zy­wa­nej tabeli jest zło­żo­ny, klucz obcy też obej­mu­je kilka kolumn i za­pi­su­je się go z nazwą ogra­ni­cze­nia. Tak wy­glą­da od­wo­ła­nie tabeli ocena do zło­żo­ne­go klucza tabeli uczen_przedmiot:
CONSTRAINT fk_ocena FOREIGN KEY (uczen_id, przedmiot_id) REFERENCES uczen_przedmiot (uczen_id, przedmiot_id)
Pełną skład­nię two­rze­nia tabel opi­su­je lekcja o CREATE, ALTER i DROP, a ro­dza­je re­la­cji i ich li­czeb­ność lekcja o re­la­cjach i dia­gra­mach E/R.

Typ danych dla atry­bu­tu

Typ danych mówi, co wolno wpisać do ko­lum­ny. Do­bie­ra się go do dzie­dzi­ny atry­bu­tu, a nie do tego, jak war­tość wy­glą­da na pa­pie­rze.
Atry­but
Typ w MySQL
Dla­cze­go
imię
VARCHAR(40)
tekst zmien­nej dłu­go­ści, 40 znaków wy­star­czy
na­zwi­sko
VARCHAR(60)
dłuż­sze niż imię, na­zwi­ska dwu­czło­no­we
kod pocz­to­wy
CHAR(6)
zawsze 6 znaków z myśl­ni­kiem, stała dłu­gość
PESEL
CHAR(11)
zera wio­dą­ce zo­sta­ją, a na nu­me­rze się nie liczy
cena
DECIMAL(8,2)
pie­nią­dze li­czo­ne do­kład­nie, bez za­okrą­gleń
liczba sztuk
INT albo SMALLINT
liczba cał­ko­wi­ta, mała war­tość mieści się w SMALLINT
ocena od 1 do 6
TINYINT UNSIGNED
naj­mniej­szy typ, który mieści zakres 0 do 255
data uro­dze­nia
DATE
sama data, bez go­dzi­ny
moment zło­że­nia za­mó­wie­nia
DATETIME
data razem z go­dzi­ną
czy ak­tyw­ny
BOOLEAN
dwie war­to­ści, prawda albo fałsz
opis wy­ciecz­ki
TEXT
tekst dłuż­szy niż kil­ka­set znaków
status za­mó­wie­nia
ENUM('nowe','wyslane')
war­tość z za­mknię­tej listy
płeć
ENUM('K','M') albo CHAR(1)
jeden znak z usta­lo­ne­go zbioru
iden­ty­fi­ka­tor re­kor­du
INT AUTO_INCREMENT
klucz sztucz­ny, numer nadaje baza
Cztery zasady, które roz­strzy­ga­ją więk­szość przy­pad­ków:
  • Wy­bierz naj­mniej­szy typ, który mieści wszyst­kie do­pusz­czal­ne war­to­ści.
  • Tekst stałej dłu­go­ści to CHAR, tekst zmien­nej dłu­go­ści to VARCHAR.
  • Pie­nią­dze to DECIMAL, nigdy FLOAT.
  • Ciąg cyfr, na którym się nie liczy (te­le­fon, kod pocz­to­wy, PESEL, numer konta), to tekst.
Pełną listę typów z za­kre­sa­mi ma lekcja o ro­dza­jach po­le­ceń i typach danych.

Ćwi­cze­nie: biuro tu­ry­stycz­ne

Opis z ar­ku­sza brzmi tak: biuro tu­ry­stycz­ne ofe­ru­je wy­ciecz­ki, każda ma nazwę, kraj, cenę i liczbę dni; klient ma imię, na­zwi­sko i adres e-mail; klient za­pi­su­je się na wy­ciecz­ki. Za­pro­jek­tuj encje, wskaż klucze i do­bierz typy.
Roz­wią­za­nie za­czy­na się od wy­pi­sa­nia encji. Rze­czow­ni­ki z wie­lo­ma wy­stą­pie­nia­mi to wy­ciecz­ka i klient. Zdanie „klient za­pi­su­je się na wy­ciecz­ki" opi­su­je po­wią­za­nie: jeden klient jeździ na wiele wy­cie­czek, a na jedną wy­ciecz­kę za­pi­su­je się wielu klien­tów, więc po­wsta­je trze­cia encja, tabela łą­czą­ca zapis.
wycieczka(id, nazwa, kraj, cena, dni) klient(id, imie, nazwisko, email) zapis(wycieczka_id, klient_id, data_zapisu)
Tabela
Klucz główny
Klucze obce
wycieczka
id, sztucz­ny
brak
klient
id, sztucz­ny; email był kan­dy­da­tem, ale bywa zmie­nia­ny
brak
zapis
zło­żo­ny: wycieczka_id plus klient_id
wycieczka_id, klient_id
Atry­but
Typ
wycieczka.nazwa
VARCHAR(100) NOT NULL
wycieczka.kraj
VARCHAR(50)
wycieczka.cena
DECIMAL(8,2) NOT NULL
wycieczka.dni
TINYINT UNSIGNED
klient.imie
VARCHAR(40)
klient.email
VARCHAR(120)
zapis.data_zapisu
DATE

Na eg­za­mi­nie

Py­ta­nia pi­sem­ne z tej lekcji są krót­kie i po­wta­rzal­ne. „Encja jest re­pre­zen­to­wa­na przez" z od­po­wie­dzią tabela. „Jed­no­znacz­ne­mu iden­ty­fi­ka­to­ro­wi re­kor­du od­po­wia­da" z od­po­wie­dzią klucz główny. „Klucz obcy tworzy się po to, aby zde­fi­nio­wać re­la­cję 1..n wią­żą­cą go z klu­czem głów­nym innej tabeli", i to zdanie warto znać w tej wła­śnie po­sta­ci, bo dys­trak­to­ry mówią o sor­to­wa­niu albo o przy­spie­sza­niu za­py­tań, czym zaj­mu­je się indeks, a nie klucz obcy. „Klucz główny za­bez­pie­cza się przed pustą war­to­ścią atry­bu­tem" z od­po­wie­dzią NOT NULL. „Typ dla kodów pocz­to­wych o stałej dłu­go­ści" z od­po­wie­dzią CHAR. Osobne py­ta­nie po­ka­zu­je zapis CONSTRAINT nazwa FOREIGN KEY (a, b) REFERENCES tabela (a, b) i pyta, co on robi: de­fi­niu­je klucz obcy zło­żo­ny z dwóch kolumn.
W za­da­niu prak­tycz­nym arkusz daje gotowy plik .sql i ry­su­nek sche­ma­tu. Ko­lum­ny z koń­ców­ką _id to prawie zawsze klucze obce i to one wy­zna­cza­ją, po czym łączyć tabele w kwe­ren­dzie „wy­ko­rzy­stu­ją­cej re­la­cję". Drugie miej­sce to ALTER TABLE ... ADD z ko­lum­ną opi­sa­ną sło­wa­mi: „pole na ocenę od 1 do 6" to TINYINT UNSIGNED, „pole na cenę" to DECIMAL(8,2), „pole na kod pocz­to­wy" to CHAR(6). Naj­częst­szy błąd na tym po­le­ce­niu to INT wszę­dzie tam, gdzie w treści po­ja­wia się cyfra.

Ściąga

Po­ję­cie
Za­pa­mię­taj
encja
typ obiek­tu, w bazie re­la­cyj­nej tabela
wy­stą­pie­nie encji
jeden rekord, czyli wiersz tabeli
atry­but
cecha encji, czyli ko­lum­na
dzie­dzi­na
zbiór war­to­ści do­pusz­czal­nych w atry­bu­cie
klucz główny
uni­kal­ny, NOT NULL, jeden na tabelę
klucz kan­dy­du­ją­cy
każdy kan­dy­dat na klucz główny; wy­bie­ra się jeden
klucz sztucz­ny
id INT AUTO_INCREMENT, do­myśl­ny wybór
klucz na­tu­ral­ny
PESEL, ISBN; bywa zmien­ny i długi
klucz zło­żo­ny
dwie ko­lum­ny razem, typowy w tabeli łą­czą­cej
klucz obcy
wska­zu­je na klucz główny innej tabeli, stoi po stro­nie „wiele"
in­te­gral­ność re­fe­ren­cyj­na
każdej war­to­ści klucza obcego od­po­wia­da ist­nie­ją­cy klucz główny
typ klucza obcego
iden­tycz­ny z typem klucza głów­ne­go
kod pocz­to­wy, PESEL
CHAR, bo stała dłu­gość i zera wio­dą­ce
cena
DECIMAL(m,d), nigdy FLOAT
war­tość 0 do 255
TINYINT UNSIGNED
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ą.