Łączenie tabel w bazach danych
Załóżmy, że mamy tabelę z nazwami użytkowników i miastami, w których mieszkają:
| id | name | city |
|---|---|---|
| 1 | user1 | city1 |
| 2 | user2 | city1 |
| 3 | user3 | city2 |
| 4 | user4 | city1 |
| 5 | user5 | city3 |
| 6 | user6 | city2 |
Wadą tej tabeli jest to, że to samo miasto powtarza się kilka razy dla różnych użytkowników. Prowadzi to do pewnych problemów.
Po pierwsze, ciągłe powtarzanie prowadzi do tego, że baza danych zaczyna zajmować znacznie więcej miejsca.
Po drugie, dość niewygodne jest wykonywanie operacji na miastach. Na przykład, chcemy wyświetlić na ekranie listę wszystkich miast. Nie będzie to takie proste. Będziemy musieli pobrać wszystkich użytkowników wraz z ich miastami, następnie usunąć duplikaty z pobranych miast i dopiero wtedy otrzymamy tę listę.
A teraz wyobraźmy sobie, że w bazie jest 10000
użytkowników z 10
miast - dla tych 10
miast będziemy musieli pobrać całą tabelę
z ogromną liczbą wierszy - otrzymamy
bardzo wolna operację z bezsensowną
stratą zasobów.
Rozwiązanie problemu
Należy podzielić naszą tabelę na dwie: w jednej
będą przechowywane miasta, a w drugiej - użytkownicy.
Jednocześnie w tabeli z użytkownikami będzie kolumna
city_id, która będzie odwoływać się
do miasta użytkownika.
A więc, stwórzmy dwie tabele. Tabela z miastami:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Tabela z użytkownikami:
| id | name | city_id |
|---|---|---|
| 1 | user1 | 1 |
| 2 | user2 | 1 |
| 3 | user3 | 2 |
| 4 | user4 | 1 |
| 5 | user5 | 3 |
| 6 | user6 | 2 |
Załóżmy, że musisz przechowywać produkty (nazwa, cena, ilość) i kategorie tych produktów. Opisz strukturę przechowywania.
Załóżmy, że musisz przechowywać rzeki i morza, do których te rzeki uchodzą. Opisz strukturę przechowywania.
Załóżmy, że musisz przechowywać miasta i kraje, w których się znajdują. Opisz strukturę przechowywania.