KWALIFIKACJA INF3 - STYCZEŃ 2017

PYTANIE NR 22.
Na rysunku przedstawiono dwie tabele. Aby połączyć je relacją jeden do wielu, jeden po stronie Klienci, wiele po stronie Zamowienia, należy
Ilustracja przedstawia dwie tabele, które są częścią schematu bazy danych.
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
W relacji jeden do wielu klucz obcy umieszcza się po stronie "wiele", aby każdy rekord podrzędny wskazywał na jeden rekord nadrzędny. Dlatego w tabeli Zamowienia należy dodać pole będące kluczem obcym, które odwołuje się do pola ID (klucza głównego) w tabeli Klienci. To zapewnia integralność referencyjną.

Pełne wyjaśnienie:

Relacja jeden do wielu (1:N) oznacza, że jeden rekord w tabeli nadrzędnej może być powiązany z wieloma rekordami w tabeli podrzędnej. W typowym przykładzie: jeden klient może złożyć wiele zamówień, ale każde pojedyncze zamówienie należy do dokładnie jednego klienta.

Aby poprawnie odwzorować to w relacyjnej bazie danych, stosuje się parę: klucz główny w tabeli po stronie "jeden" oraz klucz obcy w tabeli po stronie "wiele". Klucz obcy przechowuje wartość identyfikatora rekordu nadrzędnego, na który wskazuje. W praktyce oznacza to, że w tabeli Zamowienia powinno istnieć pole typu np. KlientID, które jest kluczem obcym wskazującym na Klienci.ID.

  • Dlaczego "dodać pole klucza obcego do tabeli Zamowienia i połączyć je z ID tabeli Klienci" jest poprawne?
    Bo tabela Zamowienia jest po stronie "wiele", więc to ona powinna przechowywać odwołanie do rekordu klienta. Dzięki temu każde zamówienie ma przypisanego właściciela, a system może wymuszać, by nie dało się dodać zamówienia dla nieistniejącego klienta.
  • Dlaczego "połączyć relacją pola ID z obu tabel" jest niepoprawne?
    Łączenie ID z ID sugeruje relację 1:1 (lub sztucznie ograniczałoby 1:N), ponieważ po stronie zamówień identyfikator zamówienia nie jest identyfikatorem klienta. Te pola mają różne znaczenie biznesowe.
  • Dlaczego "dodać klucz obcy do tabeli Klienci i połączyć go z ID tabeli Zamowienia" jest niepoprawne?
    Wtedy w rekordzie klienta trzeba byłoby przechowywać informację o zamówieniu, co nie działa dla wielu zamówień (musiałaby powstać lista/kolumny wielowartościowe) i łamie zasady poprawnego modelu relacyjnego.
  • Dlaczego "zdefiniować trzecią tabelę z dwoma kluczami obcymi" jest niepoprawne w 1:N?
    Tabela pośrednia jest typowym rozwiązaniem dla relacji wiele do wielu (N:M). Dla 1:N jest zbędna i komplikuje model oraz zapytania.

Wskazówka egzaminacyjna: jeśli w treści widzisz "jeden klient – wiele zamówień", automatycznie szukaj klucza obcego w tabeli zamówień (po stronie "wiele").

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Relacja jeden do wielu (1:N) oznacza, że jeden rekord w tabeli nadrzędnej może mieć wiele powiązanych rekordów w tabeli podrzędnej. Przykład: jeden klient może mieć wiele zamówień, ale każde zamówienie ma jednego klienta.
Klucz obcy dodaje się w tabeli po stronie "wiele" (podrzędnej). To ona przechowuje identyfikator rekordu z tabeli po stronie "jeden" (nadrzędnej), np. Zamowienia.KlientID wskazuje na Klienci.ID.
Bo każdy rekord podrzędny musi wskazać, do którego rekordu nadrzędnego należy. Gdyby klucz obcy był w tabeli po stronie "jeden", trzeba byłoby przechowywać wiele wartości w jednym polu albo tworzyć wiele kolumn, co łamie zasady modelu relacyjnego.
Integralność referencyjna to zasada, że wartość klucza obcego musi wskazywać na istniejący rekord w tabeli nadrzędnej (lub być pusta, jeśli dopuszcza to projekt). Chroni to przed "osieroconymi" rekordami, np. zamówieniem bez klienta.
Najczęściej spotkasz nazwy typu KlientID, IdKlienta albo customer_id (zależnie od konwencji). Ważne, aby było jasne, że pole przechowuje identyfikator klienta i jest powiązane z kluczem głównym Klienci.ID.
Tabela pośrednia jest potrzebna głównie przy relacji wiele do wielu (N:M), np. Produkty–Zamówienia, gdzie jedno zamówienie ma wiele produktów, a produkt występuje w wielu zamówieniach. Wtedy tabela pośrednia przechowuje dwa klucze obce.
Zwykle nie. Pole ID w tabeli Zamowienia identyfikuje zamówienie, a ID w tabeli Klienci identyfikuje klienta—mają inne znaczenie. W relacji 1:N potrzebujesz osobnego pola w Zamowienia (np. KlientID) jako klucza obcego do Klienci.ID.
Częste błędy to: mylenie 1:N z N:M i dodawanie zbędnej tabeli pośredniej, łączenie ID z ID bez analizy krotności oraz umieszczanie klucza obcego po złej stronie relacji. Warto zawsze wskazać, gdzie występuje "wiele".
Klucz obcy wymusza spójność: gdy dodajesz rekord w tabeli podrzędnej, wartość klucza obcego musi istnieć w tabeli nadrzędnej. Jeśli próbujesz wstawić Zamowienia.KlientID, którego nie ma w Klienci.ID, baza zwróci błąd (przy włączonych ograniczeniach).
Ćwicz na prostych modelach: Klienci–Zamowienia (1:N) oraz Produkty–Zamowienia (N:M). Rysuj mini-diagram ERD i zawsze zadawaj sobie pytanie: "kto jest stroną wiele?" Potem przełóż to na klucz obcy i proste zapytania JOIN.
info

Około 57% zdających odpowiada poprawnie na to pytanie. średnie

Eksperci podkreślają: "W relacji jeden do wielu klucz obcy umieszcza się po stronie "wiele", aby każdy rekord podrzędny wskazywał na jeden rekord nadrzędny."

Źródła:

  • PostgreSQL Documentation: "CREATE TABLE" / sekcja "FOREIGN KEY" (integralność referencyjna), https://www.postgresql.org/docs/current/sql-createtable.html (dostęp: 2026-03-01)
  • MySQL 8.0 Reference Manual: "CREATE TABLE" / "FOREIGN KEY Constraints", https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html (dostęp: 2026-03-01)
  • Microsoft Support: "Guide to table relationships" (relacje tabel i klucze), https://support.microsoft.com/en-us/office/guide-to-table-relationships-30446197-4f4d-48a0-8c6b-8e8d5b0f0e0b (dostęp: 2026-03-01)

Materiały:

  • Dokumentacja DBMS (MySQL/PostgreSQL) dotycząca FOREIGN KEY i referential integrity
  • Materiały do projektowania baz danych i diagramów ERD (podstawy modelu relacyjnego)
  • Ćwiczenia praktyczne: tworzenie dwóch tabel i relacji 1:N oraz testowanie wstawiania danych

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego