Hallo

Welkom, Gast. Alsjeblieft inloggen of registreren.

Recent

221 gasten, 0 leden

Welkom, Gast. Alsjeblieft inloggen of registreren.

28 maart 2024, 09:56:41

Login met gebruikersnaam, wachtwoord en sessielengte

Nieuws

Welkom op het vernieuwde NL Computer Forum!

Auteur Topic: n:m relaties  (gelezen 10034 keer)

0 leden en 1 gast bekijken dit topic.

Offline NLCOMP

  • Forumheld
  • *****
  • Berichten: 14.666
    • NL Computer Forum
n:m relaties
« Gepost op: 14 november 2009, 20:14:03 »
Bericht 1 van 5

NL Computer Forum ~ Computerprogramma' s
Van:PimmetjeDatum:11-10-2004
Aan:AllenMsgID:1416.1
Onderwerp:n:m relatiesForum:ws-nlcomputer
Hallo allemaal,

Ik ben op het ogenblijk bezig met mambo, een open source CMS. Hiermee wil ik een website opzetten voor foto-boeken. Mambo kent het fenomeen van bezoekers (users moemen ze dat). Nu wil ik mambo iets toevoegen, wat web-pages gaat heten en vervolgens die webpages koppelen aan gebruikers en omgekeerd. Uit de goeie ouwe tijd kan ik mij herinneren, dat ik dan praat over n:m-relaties. Dat was in netwerk-databases niet zo'n moeilijk probleem, maar hoe los ik dat nou op in moderne SQL-tijden? Bedenk, dat ik nog nooit wat met SQL gedaan heb, dus as-ut-ff-ken, op een simpele manier graag<g>.
De user-tabel is al aanwezig, nu dus nog iets voor de web-pages en eventueel de relatie tussen die twee.
Of wordt dat anders opgelost?

Groetjes

Pim



Bericht 2 van 5

NL Computer Forum ~ Computerprogramma' s
Van:Hugo KornelisDatum:12-10-2004
Aan:PimmetjeMsgID:1416.2
Onderwerp:n:m relatiesForum:ws-nlcomputer
Hoi Pim,

In SQL gebruik je een extra tabel voor het vastleggen van een n:m relatie.

Als voorbeeld geef ik de DDL voor de tabellen Werknemers, Projecten en Werkverdeling (die de n:m-relatie tussen Werknemers en Projecten vastlegt). De exacte syntax van de DDL verschilt overigens per database!

CREATE TABLE Werknemers
(WnNr integer NOT NULL,
WnNaam character varying (40) NOT NULL,
.... [andere kolommen],
PRIMARY KEY (WnNr)
)

CREATE TABLE Projecten
(ProjCode character (10) NOT NULL,
ProjNaam character varying (50) NOT NULL,
.... [andere kolommen]
PRIMARY KEY (ProjCode)
)

CREATE TABLE Werkverdeling
(ProjCode character (10) NOT NULL,
WnNr integer NOT NULL,
PRIMARY KEY (ProjCode, WnNr),
FOREIGN KEY (ProjCode) REFERENCES Projecten (ProjCode)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
FOREIGN KEY (WnNr) REFERENCES Werknemers (WnNr)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)

Ik hoop dat je hier iets aan hebt!

Groetjes, Hugo


Bericht 3 van 5

NL Computer Forum ~ Computerprogramma' s
Van:PimmetjeDatum:12-10-2004
Aan:Hugo KornelisMsgID:1416.3
Onderwerp:n:m relatiesForum:ws-nlcomputer
Hi Hugo,

Bedankt voor je uitleg. Ik heb het zo in vroeger tijden (niet sql) ook opgelost. Wil je me de betekenis van:
on delete en on update uitleggen?

Groetjes

Pim



Bericht 4 van 5

NL Computer Forum ~ Computerprogramma' s
Van:Hugo KornelisDatum:12-10-2004
Aan:PimmetjeMsgID:1416.4
Onderwerp:n:m relatiesForum:ws-nlcomputer
Hoi Pim,

> Wil je me de betekenis van: on delete en on update uitleggen?

Hiermee wordt aangegeven wat het RDBMS moet doen als door een wijziging van de tabel waarnaar verwezen wordt een overtreding van de foreign key optreedt.

Stel dat je de projectcode van een project wijzigt. Geen enkel probleem als dat project niet voorkomt in de tabel Werkverdeling. Maar als dat wel het geval is, dan bepaalt de ON UPDATE actie die bij de betreffende foreign key gedefinieerd is wat er moet gebeuren. De ISO/ANSI standaard voor SQL kent de volgende mogelijkheden:

* ON UPDATE NO ACTION (ook ON UPDATE RESTRICTED genoemd) - de wijziging wordt niet toegelaten. Er volgt een foutboodschap die aangeeft dat de foreign key relatie tussen Werkverdeling en Projecten wordt overtreden.

* ON UPDATE NULLIFY - bij elke rij in Werkverdeling die naar het betreffende project verwijst wordt de ProjCode op NULL gezet. Uiteraard kan dit alleen als NULLs zijn toegestaan in die kolom; in mijn voorbeeld is dat niet toegestaan, omdat ProjCode in Werkverdeling deel is van de primaire sleutel.

* ON UPDATE CASCADE - bij elke rij in Werkverdeling die naar het betreffende project verwijst wordt de ProjCode eveneens gewijzigd. De verwijzing blijft dus intact, ondanks de gewijzigde primaire sleutelwaarde.

Voor de ON DELETE geldt in wezen hetzelfde, maar nu dus voor verwijderingen: wat de database doet als je probeert een project te verwijderen die nog voorkomt in Werkverdeling wordt bepaald door de ON DELETE optie:

* ON DELETE NO ACTION (of RESTRICTED) - de verwijdering wordt niet toegestaan en er volgt een foutmelding.

* ON DELETE NULLIFY - verwijzingen naar het verwijderde project Werkverdeling worden op NULL gezet.

* ON DELETE CASCADE - elke rij in Werkverdeling die naar het verwijderde project verwijst wordt verwijderd. Let op!! Deze kan hl vervelende effecten hebben als je er niet mee oppast!!

Groetjes, Hugo


Bericht 5 van 5

NL Computer Forum ~ Computerprogramma' s
Van:PimmetjeDatum:12-10-2004
Aan:Hugo KornelisMsgID:1416.5
Onderwerp:n:m relatiesForum:ws-nlcomputer
Hi Hugo,

En alweer bedankt voor de uitleg. Misschien dat ik nog weer verder vragen heb. Maar die komen wel, als ik echt besluit om het probleem, wat ik heb, te gaan uitwerken in een mambo-component. Voorlopig ben ik nu nog eerst bezig dat hele spul te doorgronden en dat is al moeilijk genoeg voor mij<g>.

Groetjes

Pim