INF.03 Moduł 22 Klasa 4 TI

Model E/R → Tabele SQL

Definiowanie tabel i relacji na podstawie diagramu encja–związek na przykładzie projektu EduCourses (portal kursów online).

E/R → SQL PRIMARY KEY FOREIGN KEY 1‑N, N‑N AUTO_INCREMENT
📐

Teoria – z E/R do tabel SQL

Encje → tabele

Każdą encję z diagramu E/R odwzorowujemy jako osobną tabelę SQL. Atrybuty encji stają się kolumnami, a klucz główny encji staje się kluczem głównym tabeli (najczęściej INTEGER z AUTO_INCREMENT).

Relacje 1‑wiele (1‑N)

Relację 1‑wiele odwzorowujemy dodając w tabeli „wiele” kolumnę klucza obcego, która wskazuje na klucz główny tabeli „jeden”. Przykład: jeden użytkownik może być zapisany na wiele kursów.

Relacje wiele‑wiele (N‑N)

Relację wiele‑wiele odwzorowujemy poprzez tabelę pośredniczącą (łącznikową), która zawiera co najmniej dwa klucze obce do tabel encji. Często klucz główny jest złożony z tych dwóch kluczy.

Typy danych i ograniczenia

Dla każdego atrybutu dobieramy odpowiedni typ SQL (VARCHAR, INT, DATE, DECIMAL...). Atrybuty wymagane oznaczamy jako NOT NULL. Dodatkowo możemy dopisać UNIQUE, aby uniemożliwić duplikaty (np. email użytkownika).

! Najpierw zaprojektuj strukturę (E/R), dopiero potem pisz CREATE TABLE. „Klejenie” tabel bez projektu zwykle kończy się chaosem w relacjach.
🧩

Projekt E/R – EduCourses (portal kursów online)

Projekt EduCourses – prosty portal kursów online. Występują w nim m.in.:

🗄

Tablice SQL – struktura bazy EduCourses

UZYTKOWNICY
uzytkownik_id INT PK
imie VARCHAR(50)
email VARCHAR(100) UNIQUE
data_rejestracji DATE
KURSY
kurs_id INT PK
tytul VARCHAR(100)
poziom ENUM/BASIC VARCHAR
cena DECIMAL(7,2)
LEKCJE
lekcja_id INT PK
kurs_id FK → KURSY
tytul VARCHAR(100)
nr_kolejnosci INT
ZAPISY
zapis_id INT PK
uzytkownik_id FK → UZYTKOWNICY
kurs_id FK → KURSY
data_zapisu DATE
status VARCHAR(20)
🧱

Tworzenie bazy danych EduCourses

CREATE DATABASE + wybór bazy

Zanim utworzysz tabele, musisz mieć bazę danych i wybrać ją poleceniem USE. Dzięki temu wszystkie polecenia CREATE TABLE trafią do właściwej bazy.

00
Utworzenie bazy danych EduCourses
CREATE DATABASE
ZADANIE
Utwórz bazę danych educourses i ustaw ją jako bieżącą. Użyj kodowania UTF‑8 z polską kolacją, aby poprawnie przechowywać polskie znaki.
SQL
-- Utworzenie bazy danych dla projektu EduCourses
CREATE DATABASE IF NOT EXISTS educourses
    DEFAULT CHARACTER SET utf8mb4
    COLLATE utf8mb4_polish_ci;

-- Ustawienie bazy jako bieżącej
USE educourses;

Ćwiczenia – z diagramu do CREATE TABLE

01
Definiowanie tabeli UZYTKOWNICY
CREATE TABLE
ZADANIE
Na podstawie encji UŻYTKOWNIK z diagramu E/R zdefiniuj tabelę uzytkownicy. Kluczem głównym ma być uzytkownik_id (AUTO_INCREMENT). Pole email powinno być unikalne.
SQL
-- Tabela użytkowników systemu EduCourses
CREATE TABLE uzytkownicy (
    uzytkownik_id INT PRIMARY KEY AUTO_INCREMENT,
    imie           VARCHAR(50) NOT NULL,
    email          VARCHAR(100) NOT NULL UNIQUE,
    data_rejestracji DATE NOT NULL
);
02
Definiowanie tabeli KURSY
TYPY DANYCH
ZADANIE
Utwórz tabelę kursy z kolumnami: kurs_id (PK, AUTO_INCREMENT), tytul, poziom (np. 'podstawowy', 'średni', 'zaawansowany') oraz cena. Dobierz odpowiednie typy danych.
SQL
-- Tabela kursów dostępnych w portalu EduCourses
CREATE TABLE kursy (
    kurs_id INT PRIMARY KEY AUTO_INCREMENT,
    tytul   VARCHAR(100) NOT NULL,
    poziom  VARCHAR(20) NOT NULL,
    cena    DECIMAL(7,2) NOT NULL
);
03
Relacja 1‑N: LEKCJE w kursie
FOREIGN KEY
ZADANIE
Narysuj w myślach fragment E/R: jeden kurs ma wiele lekcji. Zaimplementuj to jako tabelę lekcje z kluczem obcym do kursy. Dodaj kolumnę nr_kolejnosci do sortowania lekcji.
SQL
-- Tabela lekcji należących do kursów
CREATE TABLE lekcje (
    lekcja_id    INT PRIMARY KEY AUTO_INCREMENT,
    kurs_id      INT NOT NULL,
    tytul        VARCHAR(100) NOT NULL,
    nr_kolejnosci INT NOT NULL,
    FOREIGN KEY (kurs_id) REFERENCES kursy(kurs_id)
);
04
Relacja N‑N: UZYTKOWNICY ↔ KURSY
TABELA POŚREDNICZĄCA
ZADANIE
Użytkownik może zapisać się na wiele kursów, a kurs może mieć wielu użytkowników. Odwzoruj relację N‑N jako tabelę zapisy z dwoma kluczami obcymi. Dodaj kolumny data_zapisu i status.
SQL
-- Tabela zapisów użytkowników na kursy
CREATE TABLE zapisy (
    zapis_id      INT PRIMARY KEY AUTO_INCREMENT,
    uzytkownik_id INT NOT NULL,
    kurs_id       INT NOT NULL,
    data_zapisu   DATE NOT NULL,
    status        VARCHAR(20) NOT NULL,
    FOREIGN KEY (uzytkownik_id) REFERENCES uzytkownicy(uzytkownik_id),
    FOREIGN KEY (kurs_id)      REFERENCES kursy(kurs_id)
);
05
Czy SQL zgadza się z diagramem?
KONTROLA JAKOŚCI
ZADANIE
Sprawdź, czy każda relacja z diagramu E/R ma swoje odzwierciedlenie w kluczu obcym i czy nie zapomniałeś o żadnym atrybucie. Uzupełnij brakujące kolumny lub relacje.
! Różnice między projektem a SQL-em (np. brak atrybutu, brak relacji) mogą później powodować błędne raporty. Zawsze porównaj CREATE TABLE z diagramem E/R.
📊

Zadanie projektowe – własna baza wg E/R

INF.03 PROJEKT KOŃCOWY

Od diagramu E/R do skryptu CREATE TABLE

Na podstawie własnego projektu E/R (np. wypożyczalnia rowerów, hotel, biblioteka, sklep internetowy) przygotuj kompletny skrypt tworzący bazę danych. Każdą tabelę i relację opisz komentarzem SQL --.

Quiz – sprawdź, czy rozumiesz E/R → SQL

Q1
Jak zwykle odwzorowujemy encję z diagramu E/R w bazie SQL?
A
Jako pojedynczą kolumnę w istniejącej tabeli
B
Jako nową tabelę z kolumnami odpowiadającymi atrybutom encji
C
Jako osobną bazę danych
D
Tylko jako komentarz, bez tabel
Q2
Jak odwzorowujemy relację 1‑wiele (1‑N) między dwiema encjami?
A
Tworzymy nową tabelę pośredniczącą
B
Dodajemy klucz obcy w tabeli po stronie „wiele” wskazujący na tabelę po stronie „jeden”
C
Łączymy obie tabele w jedną
D
Nie odwzorowujemy relacji w SQL
Q3
Co jest typowym sposobem odwzorowania relacji wiele‑wiele (N‑N)?
A
Dodanie wielu kluczy głównych w jednej tabeli
B
Utworzenie tabeli pośredniczącej z dwoma kluczami obcymi
C
Usunięcie jednej z encji
D
Zastąpienie relacji komentarzem
Q4
Które stwierdzenie o kluczu głównym (PRIMARY KEY) jest prawdziwe?
A
Może zawierać duplikaty
B
Musi być unikalny i nie może być NULL
C
Musi mieć typ VARCHAR
D
Nie może być użyty jako klucz obcy
Q5
Po co w praktyce używamy AUTO_INCREMENT przy kluczu głównym?
A
Aby skrócić tekst kolumny
B
Aby baza sama nadawała kolejne unikalne identyfikatory bez ręcznego podawania
C
Aby kolumna zawsze była typu VARCHAR
D
Nie ma to znaczenia, to tylko dekoracja
0/5

Checklista – definicje tabel wg projektu

Postęp 0 / 8
Potrafię odczytać diagram E/R (encje, atrybuty, relacje).
Zamieniam encje na tabele z poprawnie dobranymi typami danych.
Definiuję klucze główne tabel z użyciem PRIMARY KEY (często AUTO_INCREMENT).
Potrafię odwzorować relacje 1‑N za pomocą kluczy obcych.
Tworzę tabele pośredniczące dla relacji N‑N.
Dbam o spójność nazw między diagramem a SQL (bez „mieszanki” języków).
Dodaję ograniczenia NOT NULL i UNIQUE tam, gdzie są potrzebne.
Potrafię napisać kompletny skrypt CREATE TABLE na podstawie projektu.