Data Relations i PHP
Lad os antage, at vi står overfor opgaven med at gemme fædre og sønner. Lad hver far kun have én søn, og sønnen kan til gengæld også have én søn.
Vi skal finde på, hvordan vi vil gemme dataene.
Den første idé, der måske dukker op,
er at oprette to tabeller: parents til
fædre og sons til sønner. Derefter forbinde
disse tabeller med et eller andet felt: son_id
eller parent_id.
Dette er dog ikke en særlig god idé - for samme person kan samtidig være både far og søn - og vi bliver nødt til at gemme ham i begge tabeller, hvilket er upraktisk, optager mere plads og leder let til fejl.
En bedre mulighed er at forbinde tabellen med sig
selv: lad os oprette en tabel users, hvor
vi gemmer alle brugere, og give hver en
et felt son_id, hvor vi gemmer
id på sønnen fra den samme tabel:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Forespørgsler
Lad os nu skrive en forespørgsel, der henter brugeren sammen med hans søn.
Lad os først bare hente brugerne:
SELECT
*
FROM
users
Lad os nu join'e sønnerne til brugerne. Da vi joiner tabellen med sig selv, er vi nødt til at omdøbe den:
LEFT JOIN users as sons
Nu kan vi angive relationen mellem hovedtabellen og den omdøbte tabel:
LEFT JOIN users as sons ON sons.id=users.son_id
Lad os nu angive felterne:
SELECT
users.name as user_name, sons.name as son_name
Lad os samle alt og få følgende forespørgsel:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Praktiske opgaver
Antag, at vi har kategorier. Hver kategori kan tilhøre en overordnet kategori, som til gengæld kan tilhøre sin egen overordnede kategori, og så videre. Beskriv lagringsstrukturen.
Skriv en forespørgsel, der henter en kategori sammen med dens overordnede kategori.
Skriv en forespørgsel, der henter en kategori sammen med dens forælder og bedsteforælder.
Skriv en forespørgsel, der henter en kategori sammen med dens forælder, bedsteforælder og oldeforælder.