Veel-op-veel-relaties
Er is sprake van een veel-op-veel-relatie wanneer meerdere records in een tabel zijn gekoppeld aan meerdere records in een andere tabel. Tussen klanten en product bestaat er bijvoorbeeld een veel-op-veel-relatie: klanten kunnen diverse producten kopen en producten kunnen door veel klanten worden gekocht.
Relationele databasesystemen staan doorgaans niet toe dat u een rechtstreekse veel-op-veel-relatie tussen twee tabellen implementeert. Laten we het bijhouden van facturen als voorbeeld gebruiken. Als er veel facturen met hetzelfde factuurnummer zouden zijn en een van uw klanten doet een navraag over dat factuurnummer, zou u niet weten welk nummer de klant bedoelt. Dit is een reden om een unieke waarde aan elke factuur toe te wijzen.
Om dit probleem te vermijden kunt u de veel-op-veel-relatie splitsen in twee één-op-veel-relaties door een derde tabel te gebruiken, wat we een samenvoegtabel noemen. Elke record in een samenvoegtabel bevat een vergelijkingsveld met de waarde van de primaire sleutels van de twee tabellen dat die samenvoegt. (In de samenvoegtabel zijn deze vergelijkingsvelden refererende sleutels.) Deze refererende-sleutelvelden worden ingevuld met gegevens naarmate records in de samenvoegtabel worden gemaakt op basis van de tabellen die worden samengevoegd.
Een typisch voorbeeld van een veel-op-veel-relatie is er een tussen studenten en cursussen. Een student kan zich inschrijven voor verschillende cursussen en een cursus kan door veel studenten worden gevolgd.
In het volgende voorbeeld gebruiken we de tabel ‘Studenten’ die een record voor elke student bevat en de tabel ‘Cursussen’ die een record voor elke cursus bevat. De samenvoegtabel ‘Inschrijvingen’ maakt twee één-op-veel-relaties: een tussen elk van de twee tabellen.
De primaire sleutel ‘Studentnummer’ identificeert op unieke wijze elke student in de tabel ‘Studenten’. De primaire sleutel ‘Cursus-ID’ identificeert op unieke wijze elke cursus in de tabel ‘Cursussen’. De tabel ‘Inschrijvingen’ bevat de refererende sleutels ‘Studentnummer’ en ‘Cursus-ID’.
Zo configureert u een samenvoegtabel voor een veel-op-veel-relatie:
- Maak met het bovenstaande voorbeeld een tabel met de naam ‘Inschrijvingen’. Dit zal de samenvoegtabel zijn.
- Maak in de tabel ‘Inschrijvingen’ de velden ‘Studentnummer’ en ‘Cursus-ID’.
Samenvoegtabellen bevatten doorgaans velden die mogelijk geen nut hebben in andere tabellen. U kunt velden aan de tabel ‘Inschrijvingen’ toevoegen, zoals het veld ‘Datum’ om bij te houden wanneer iemand een cursus is beginnen volgen en het veld ‘Kosten’ om bij te houden hoeveel een student heeft betaald om een cursus te volgen.
- Maak een relatie tussen de twee velden met de naam ‘Studentnummer’ in de tabellen. Maak dan een relatie tussen de twee velden met de naam ‘Cursus-ID’ in de tabellen.
In dit ontwerp geldt het volgende: als een student zich inschrijft voor drie cursussen, heeft die student één record in de tabel ‘Studenten’ en drie records in de tabel ‘Inschrijvingen’ (een record voor elke cursus waarvoor de student zich heeft ingeschreven).
Opmerkingen
- Samenvoegtabellen hebben toegang tot velden en gegevens in tabellen zonder een aparte relatie te hoeven maken. Als u bijvoorbeeld een lijst met alle cursussen waarvoor een student zich heeft ingeschreven wilt weergeven, maakt u een portaal in een lay-out op basis van de tabel ‘Studenten’. Ontwerp het portaal om gerelateerde records uit de tabel ‘Cursussen’ weer te geven. Voeg dan de gepaste velden uit ‘Cursussen’ toe aan het portaal. Wanneer u door records in de lay-out ‘Studenten’ bladert, ziet u in het portaal alle cursussen waarvoor een bepaalde student zich heeft ingeschreven.