Voor een administratiesysteem waar ik momenteel aan werk zit ik met een vraagje. Misschien beschrijf ik het voortraject iets te uitgebreid, maar ik heb graag duidelijk wat ik doe en waarom.
Stel dat we uitgaan van twee tabellen 'personen' en 'functies'. Deze tabellen hebben de volgende relatie: Één persoon kan één of meer functies hebben en een functie kan door nul of meer personen uitgevoerd worden. Maw: een meer-op-meer relatie. Er is dus een tussentabel nodig om deze twee tabellen aan elkaar te koppelen. Laten we deze tabel: 'persoon_heeft_functie' noemen. Door in deze tabel de twee foreign keys op te nemen (een primary key van personen en een primary key van fucties) kunnen unieke relaties gelegd worden tussen personen en functies, een eigen primary key voor de tussentabel is hierbij niet nodig. Immers, de persoon 'Jantje' en de relatie met de functie 'directeur' kan maar één keer voorkomen.

Nu zit ik echter met het volgende. Ik wil graag een archief bijhouden zodat ik over een aantal jaren nog eens kan nakijken welke functies iemand gehad heeft of wie welke functies bekleed heeft. Met bovenstaande model zal dit niet lukken, want op het moment dat Jantje vertrekt als directeur zal de rij in de tussentabel 'persoon_heeft_functie' die deze relatie beschrijft moeten verdwijnen om te voorkomen dat Jantje onterecht als directeur aangemerkt zou kunnen worden na zijn aftreden.
Om toch de relatie te kunnen behouden voor future reference heb ik bedacht om de tussentabel uit te breiden met de velden 'startdatum' en 'einddatum'

Echter, nu zit ik met het probleem dat theoretisch gesproken iemand twee keer een bepaalde functie kan bekleden. Laten we stellen dat Jantje na een aantal jaar weer terug komt en wederom de functie directeur zou gaan bekleden dan zou wederom de relatie tussen persoon en functie gelegd worden. Op key niveau zou deze relatie exact hetzelfde zijn als de relatie van een aantal jaren eerder, waardoor de relatie niet meer uniek is!
Nu zou ik ervoor kunnen kiezen om een primary key te maken van startdatum. De foreign keys + de startdatum zouden een unieke combinatie vormen. Ophalen van de huidige functie bezetting zou vervolgens kunnen door een SELECT querie te doen met als WHERE clausule einddatum = null. Echter, dit werkt niet wanneer de startdatum of de einddatum van een functie in de toekomst ligt, maw: queries op deze tabel worden complex, omdat er altijd gecontroleerd moet worden (wanneer de huidige bezetting opgevraagd wordt) of de startdatum niet in de toekomst ligt en of de einddatum leeg is of dat de einddatum in de toekomst ligt.
Het lijkt mij, theoretisch gesproken, dat het van startdatum een primary key maken een prima oplossing is voor de archief functie. Echter, vraag ik mij af of het zomaar mag om een primary key toe te voegen aan een tussentabel? Daarnaast, moet een primary key opzich zelf niet altijd uniek zijn? In dat geval voldoet een datum element natuurlijk niet.
Alvast bedankt voor de hulp!
Stel dat we uitgaan van twee tabellen 'personen' en 'functies'. Deze tabellen hebben de volgende relatie: Één persoon kan één of meer functies hebben en een functie kan door nul of meer personen uitgevoerd worden. Maw: een meer-op-meer relatie. Er is dus een tussentabel nodig om deze twee tabellen aan elkaar te koppelen. Laten we deze tabel: 'persoon_heeft_functie' noemen. Door in deze tabel de twee foreign keys op te nemen (een primary key van personen en een primary key van fucties) kunnen unieke relaties gelegd worden tussen personen en functies, een eigen primary key voor de tussentabel is hierbij niet nodig. Immers, de persoon 'Jantje' en de relatie met de functie 'directeur' kan maar één keer voorkomen.

Nu zit ik echter met het volgende. Ik wil graag een archief bijhouden zodat ik over een aantal jaren nog eens kan nakijken welke functies iemand gehad heeft of wie welke functies bekleed heeft. Met bovenstaande model zal dit niet lukken, want op het moment dat Jantje vertrekt als directeur zal de rij in de tussentabel 'persoon_heeft_functie' die deze relatie beschrijft moeten verdwijnen om te voorkomen dat Jantje onterecht als directeur aangemerkt zou kunnen worden na zijn aftreden.
Om toch de relatie te kunnen behouden voor future reference heb ik bedacht om de tussentabel uit te breiden met de velden 'startdatum' en 'einddatum'

Echter, nu zit ik met het probleem dat theoretisch gesproken iemand twee keer een bepaalde functie kan bekleden. Laten we stellen dat Jantje na een aantal jaar weer terug komt en wederom de functie directeur zou gaan bekleden dan zou wederom de relatie tussen persoon en functie gelegd worden. Op key niveau zou deze relatie exact hetzelfde zijn als de relatie van een aantal jaren eerder, waardoor de relatie niet meer uniek is!
Nu zou ik ervoor kunnen kiezen om een primary key te maken van startdatum. De foreign keys + de startdatum zouden een unieke combinatie vormen. Ophalen van de huidige functie bezetting zou vervolgens kunnen door een SELECT querie te doen met als WHERE clausule einddatum = null. Echter, dit werkt niet wanneer de startdatum of de einddatum van een functie in de toekomst ligt, maw: queries op deze tabel worden complex, omdat er altijd gecontroleerd moet worden (wanneer de huidige bezetting opgevraagd wordt) of de startdatum niet in de toekomst ligt en of de einddatum leeg is of dat de einddatum in de toekomst ligt.
Het lijkt mij, theoretisch gesproken, dat het van startdatum een primary key maken een prima oplossing is voor de archief functie. Echter, vraag ik mij af of het zomaar mag om een primary key toe te voegen aan een tussentabel? Daarnaast, moet een primary key opzich zelf niet altijd uniek zijn? In dat geval voldoet een datum element natuurlijk niet.
Alvast bedankt voor de hulp!