relatie 2 kanten op
relatieid, gebruiker1, gebruiker2, relatiestatusid
gebruiker1 > de gebruiker die de relatie legt
gebruiker2 > de gebruiker waarmee de relatie wordt gelegd
Daarnaast heb ik een tabel gebruikers: gebruiker_id, naam; gebruiker_id heeft dus een koppeling met gebruiker1 en gebruiker2
De relatiestatus staan in een volgende tabel: relatiestatusid, relatiestatus
a) is dit een logische gedachte?
Dan wil ik graag per relatiestatus een overzicht van gebruikers maken, maar dit kan dus 2 kanten op, je kunt namelijk gebruiker1 en gebruiker2 zijn.
b) hoe kan ik met 1 query zowel mijn relaties als die anderen met mij hebben gelegd krijgen?
aanmaak tabellen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE IF NOT EXISTS `gebruikers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`naam` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ;
CREATE TABLE IF NOT EXISTS `relaties` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`gebruiker1` int(11) NOT NULL,
`gebruiker2` int(11) NOT NULL,
`relatie` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `relatietypes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`relatietype` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ;
`id` int(11) NOT NULL AUTO_INCREMENT,
`naam` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ;
CREATE TABLE IF NOT EXISTS `relaties` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`gebruiker1` int(11) NOT NULL,
`gebruiker2` int(11) NOT NULL,
`relatie` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `relatietypes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`relatietype` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ;
Opvraag query
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
*
FROM
gebruikers g1
left JOIN
relaties r
on g1.id=r.gebruiker1
left JOIN
relatietypes rt
on rt.id=r.relatie
LEFT JOIN
gebruikers g2
on g2.id=r.gebruiker2
*
FROM
gebruikers g1
left JOIN
relaties r
on g1.id=r.gebruiker1
left JOIN
relatietypes rt
on rt.id=r.relatie
LEFT JOIN
gebruikers g2
on g2.id=r.gebruiker2
Elke gebruiker kan 1 of meerdere linken hebben met 0 of meerdere gebruikers. Je moet zelf controleren of alles kan en mag.
Je kan ook een link/status hebben met jezelf :)
Jan
Gewijzigd op 30/05/2022 20:24:13 door Jan R
m:m-relatie. In die tabel heb je inderdaad een kolom per gebruiker, en als je wilt voorkomen dat een gebruiker een relatie met zichzelf heeft maak je een check constraint dat beide ID's niet gelijk mogen zijn aan elkaar.
Dan nog een kolom voor voor de status. Wat je niet moet doen is daar een enum-veld van maken. Het beste is inderdaad om daar een id met een FK naar een aparte statustabel van te maken, dan is het bestendig voor toekomstige wijzigingen.
Nu kun je van die drie kolommen een PK maken. Daar heb je genoeg aan. Je kunt er ook voor kiezen om een aparte ID kolom aan te maken. Die heeft geen praktisch nut, anders dat je in queries iets makkelijker naar de rij kan wijzen. Vergeet dan niet om nog steeds een unique constraint te maken voor de gebruikers en de status.
Wil je ook historie bijhouden, dan wordt een ID-kolom met een sequence al handiger. Je hebt daarbij nog een tijdstempel-kolom nodig met het moment van de statuswijziging. De unique constraint moet komen te vervallen.
Voor de prestaties is het aan te raden om op de kolommen van gebruikers en datum een index aan te maken, zodat de database queries voor het opvragen van de status extra snel kan uitvoeren.
Laatste tip: gebruik zinvolle naamgeving voor de kolommen. Geen gebruiker1 en gebruiker2, maar bijvoorbeeld id, gebruiker_van, gebruiker_naar, status en moment.
De opzet met een tussentabel is correct, hiermee maak je een Dan nog een kolom voor voor de status. Wat je niet moet doen is daar een enum-veld van maken. Het beste is inderdaad om daar een id met een FK naar een aparte statustabel van te maken, dan is het bestendig voor toekomstige wijzigingen.
Nu kun je van die drie kolommen een PK maken. Daar heb je genoeg aan. Je kunt er ook voor kiezen om een aparte ID kolom aan te maken. Die heeft geen praktisch nut, anders dat je in queries iets makkelijker naar de rij kan wijzen. Vergeet dan niet om nog steeds een unique constraint te maken voor de gebruikers en de status.
Wil je ook historie bijhouden, dan wordt een ID-kolom met een sequence al handiger. Je hebt daarbij nog een tijdstempel-kolom nodig met het moment van de statuswijziging. De unique constraint moet komen te vervallen.
Voor de prestaties is het aan te raden om op de kolommen van gebruikers en datum een index aan te maken, zodat de database queries voor het opvragen van de status extra snel kan uitvoeren.
Laatste tip: gebruik zinvolle naamgeving voor de kolommen. Geen gebruiker1 en gebruiker2, maar bijvoorbeeld id, gebruiker_van, gebruiker_naar, status en moment.