Relacje w bazach danych są używane do określenia sposobu, w jaki dane są powiązane ze sobą. Dowiedz się jakie są typy relacji w bazach danych. W systemach zarządzania bazami danych, takich jak MySQL, istnieją różne typy relacji, które można utworzyć między tabelami. Oto kilka przykładów:
- Jedno do jednego (1:1) – ta relacja występuje, gdy każdy rekord w jednej tabeli ma dokładnie jeden odpowiadający rekord w drugiej tabeli. Przykładem może być relacja między tabelami „klienci” i „adresy”, gdzie każdy klient ma dokładnie jeden adres.
- Jedno do wielu (1:n) – ta relacja występuje, gdy jeden rekord w jednej tabeli może mieć wiele odpowiadających rekordów w drugiej tabeli. Przykładem może być relacja między tabelami „produkty” i „zamówienia”, gdzie jeden produkt może być zamawiany wielokrotnie przez różnych klientów.
- Wiele do wielu (n:m) – ta relacja występuje, gdy rekordy w jednej tabeli mogą mieć wiele odpowiadających rekordów w drugiej tabeli, a rekordy w drugiej tabeli mogą mieć wiele odpowiadających rekordów w pierwszej tabeli. Przykładem może być relacja między tabelami „klienci” i „produkty”, gdzie jeden klient może kupić wiele produktów, a jeden produkt może być kupiony przez wielu klientów.
Przykład relacji Jeden do jednego (1:1)
W bazie danych firmy może być tabela „Pracownicy” zawierająca informacje o pracownikach, oraz tabela „Samochody” zawierająca informacje o samochodach, które pracownicy mogą wynająć. Relacja jeden do jednego między tymi tabelami pozwoli nam połączyć każdego pracownika z jednym samochodem, tak abyśmy mogli sprawdzić, który pracownik wynajmuje dany samochód.
Aby utworzyć relację jeden do jednego w MySQL, możemy dodać do tabeli „Pracownicy” kolumnę zawierającą klucz obcy z tabeli „Samochody”, a do tabeli „Samochody” kolumnę zawierającą klucz obcy z tabeli „Pracownicy”. Następnie możemy skorzystać z polecenia CREATE INDEX, aby utworzyć indeksy na tych kolumnach, co umożliwi szybkie wyszukiwanie i łączenie rekordów z obu tabel.
Na przykład, polecenie:
CREATE TABLE Pracownicy ( id INT PRIMARY KEY, imie VARCHAR(255), nazwisko VARCHAR(255), samochod_id INT, FOREIGN KEY (samochod_id) REFERENCES Samochody(id) );
CREATE TABLE Samochody ( id INT PRIMARY KEY, marka VARCHAR(255), model VARCHAR(255), pracownik_id INT, FOREIGN KEY (pracownik_id) REFERENCES Pracownicy(id) );
CREATE INDEX idx_pracownicy_samochod ON Pracownicy (samochod_id); CREATE INDEX idx_samochody_pracownik ON Samochody (pracownik_id);
Możemy teraz dla przykładu dodać nowego pracownika za pomocą polecenia INSERT:
INSERT INTO Pracownicy (id, imie, nazwisko, samochod_id) VALUES (1, 'Jan', 'Kowalski', 1);
Możemy także dodać nowy samochód za pomocą polecenia INSERT:
INSERT INTO Samochody (id, marka, model, pracownik_id) VALUES (1, 'Ford', 'Focus', 1);
Po dodaniu tych rekordów, relacja jeden do jednego między tabelami „Pracownicy” i „Samochody” będzie w pełni aktywna. Możemy teraz wyszukiwać informacje o pracownikach i samochodach, łącząc je za pomocą kluczy obcych.
Na przykład, możemy wyświetlić imię i nazwisko pracownika oraz markę i model samochodu za pomocą złączenia tabel za pomocą polecenia SELECT:
SELECT Pracownicy.imie, Pracownicy.nazwisko, Samochody.marka, Samochody.model FROM Pracownicy JOIN Samochody ON Pracownicy.samochod_id = Samochody.id;
Przykład relacji Jeden do wielu (1:n)
Relacja jeden do wielu w MySQL może być reprezentowana przez dwa tabele połączone kluczem obcym. Na przykład, tabela „Rodzice” może mieć kolumnę „ID Rodzica” jako klucz główny, a tabela „Dzieci” może mieć kolumnę „ID Rodzica” jako klucz obcy, który odnosi się do kolumny „ID Rodzica” w tabeli „Rodzice”. W takim przypadku relacja między tabelami jest jeden do wielu, ponieważ jeden rodzic może mieć wiele dzieci, ale każde dziecko ma tylko jednego rodzica.
CREATE TABLE Rodzice (
ID Rodzica INT PRIMARY KEY,
Imie VARCHAR(255),
Nazwisko VARCHAR(255)
);
CREATE TABLE Dzieci (
ID Dziecka INT PRIMARY KEY,
ID Rodzica INT,
Imie VARCHAR(255),
FOREIGN KEY (ID-Rodzica) REFERENCES Rodzice(ID Rodzica)
);
INSERT INTO Rodzice (ID-Rodzica, Imie, Nazwisko)
VALUES
(1, 'Jan', 'Kowalski'),
(2, 'Anna', 'Nowak');
INSERT INTO Dzieci (ID-Dziecka, ID Rodzica, Imie)
VALUES
(1, 1, 'Janek'),
(2, 1, 'Ania'),
(3, 2, 'Piotrek');
Teraz, żeby wyświetlić wszystkie dzieci, rodzica o na przyklad ID-Rodzica równym 2, piszemy
SELECT Imie FROM Dzieci WHERE ID-Rodzica = 2;
Ta kwerenda pobierze wszystkie rekordy z tabeli „Dzieci”, gdzie kolumna „ID Rodzica” ma wartość 2, i wyświetli imiona tych dzieci. W przykładzie danych podanym wcześniej, ta kwerenda zwróci jeden rekord: „Piotrek”.
Przykład relacji wielu do wielu (n:m)
Relacja wiele do wielu w MySQL może być reprezentowana przez trzy tabele: dwie tabele reprezentujące obie strony relacji oraz trzecią tabelę, która łączy te dwie tabele. Na przykład, jeśli chcemy utworzyć relację między tabelami „Użytkownicy” i „Grupy”, możemy utworzyć tabelę „Użytkownicy-Grupy”, która będzie zawierała dwie kolumny „ID Użytkownika” i „ID Grupy” jako klucze obce odnoszące się do odpowiednich kolumn w tabelach „Użytkownicy” i „Grupy”.
W takim przypadku relacja między tabelami jest wiele do wielu, ponieważ wiele użytkowników może należeć do wielu grup, a wiele grup może zawierać wiele użytkowników.
CREATE TABLE Uzytkownicy (
ID-Uzytkownika INT PRIMARY KEY,
Imie VARCHAR(255),
Nazwisko VARCHAR(255)
);
CREATE TABLE Grupy (
ID Grupy INT PRIMARY KEY,
Nazwa Grupy VARCHAR(255)
);
CREATE TABLE Uzytkownicy-Grupy (
ID Użytkownika INT,
ID Grupy INT,
PRIMARY KEY (ID-Uzytkownika, ID Grupy),
FOREIGN KEY (ID-Uzytkownika) REFERENCES Uzytkownicy(ID-Uzytkownika),
FOREIGN KEY (ID-Grupy) REFERENCES Grupy(ID-Grupy)
);
INSERT INTO Uzytkownicy (ID-Uzytkownika, Imie, Nazwisko)
VALUES (1, 'Jan', 'Kowalski'), (2, 'Anna', 'Nowak'), (3, 'Piotr', 'Wiśniewski');
INSERT INTO Grupy (ID-Grupy, Nazwa-Grupy)
VALUES (1, 'Grupa 1'), (2, 'Grupa 2'), (3, 'Grupa 3');
INSERT INTO Uzytkownicy-Grupy (ID-Uzytkownika, ID Grupy)
VALUES (1, 1), (1, 2), (2, 2), (2, 3), (3, 1), (3, 3);
Aby wyświetlić wszystkich użytkowników z grupy o ID 2, można użyć następującej kwerendy:
SELECT Imie, Nazwisko FROM Uzytkownicy
JOIN Uzytkownicy-Grupy ON Uzytkownicy.ID Uzytkownika = Uzytkownicy-Grupy.ID-Uzytkownika
WHERE Uzytkownicy-Grupy.ID-Grupy = 2;
Ta kwerenda łączy tabele „Użytkownicy” i „Użytkownicy-Grupy” za pomocą operatora JOIN
i ogranicza wynik do tych rekordów, które spełniają warunek „Użytkownicy-Grupy.ID Grupy = 2”. W przykładzie danych podanym wcześniej, ta kwerenda zwróci dwa rekordy: „Jan Kowalski” i „Anna Nowak”.