Datarelaties in PHP

Stel dat we de taak hebben om vaders en zonen op te slaan. Stel dat elke vader slechts één zoon kan hebben, en een zoon op zijn beurt ook weer één zoon kan hebben.

We moeten bedenken hoe we de gegevens gaan opslaan. Het eerste idee dat in je op kan komen - is het maken van twee tabellen: parents voor de vaders en sons voor de zonen. Vervolgens verbinden we deze tabellen met een veld: son_id of parent_id.

Dit idee is echter niet erg goed - want dezelfde persoon kan tegelijkertijd zowel vader als zoon zijn - en dan moeten we hem in beide tabellen opslaan, wat onhandig is, meer ruimte in beslag neemt en gemakkelijk tot fouten leidt.

Een betere optie - is om de tabel met zichzelf te verbinden: we maken een tabel users, daarin slaan we alle gebruikers op en geven we elk een veld son_id, waarin de id van de zoon uit dezelfde tabel wordt opgeslagen:

users
id name son_id
1 user1 2
2 user2 3
3 user3 null

Query's

Laten we nu een query schrijven die een gebruiker samen met zijn zoon ophaalt.

Laten we eerst gewoon de gebruikers ophalen:

sqlSELECT
  *
FROM
  users

Laten we nu hun zonen joinen. We joinen de tabel met zichzelf, dus we moeten deze hernoemen:

sqlLEFT JOIN users as sons

Nu kunnen we de relatie tussen de hoofdtafel en de hernoemde tabel specificeren:

sqlLEFT JOIN users as sons ON sons.id=users.son_id

Laten we nu de velden specificeren:

sqlSELECT
  users.name as user_name, sons.name as son_name

Laten we alles samenvoegen en we krijgen de volgende query:

sqlSELECT
  users.name as user_name, sons.name as son_name
FROM
  users
LEFT JOIN users as sons ON sons.id=users.son_id

Praktische opdrachten

Задание 1

Stel we hebben categorieën. Elke categorie kan behoren tot een hoofdcategorie, die op haar beurt weer tot haar eigen hoofdcategorie behoort, en zo verder. Beschrijf de opslagstructuur.

Задание 2

Schrijf een query die een categorie samen met haar hoofdcategorie ophaalt.

Задание 3

Schrijf een query die een categorie samen met haar ouder en grootouder ophaalt.

Задание 4

Schrijf een query die een categorie samen met haar ouder, grootouder en overgrootouder ophaalt.