ParentID

Status
Niet open voor verdere reacties.

15JanE

Gebruiker
Lid geworden
14 jan 2015
Berichten
17
ParentID.
Mijn mogelijke Locaties zijn steeds gelegen binnen een Afdeling. Er zijn N afdelingen. In mijn tblLocaties zet ik dan gewoon een veld AfdelingID en dat is dan ook het ParentID. Of moet ik een parentID op een andere speciale bepaalde manier inbrengen?

Dan heb ik ook nog Objecten
Mijn mogelijke Objecten zijn van een bepaald Type. Elk type is van een bepaalde Soort.
Dus bij Type kan ik de soort als een parentID toevoegen. En bij Object kan ik Type als parentID toevoegen.

Nu heb ik al drie ParentID's. Is er een gebruikelijke manier om deze te benoemen zodat het duidelijk is in een tabel dat het over een ParentID gaat en toch niet te verwarren met de andere ParentID's uit de andere tabellen.

Misschien een stomme vraag
 
Vragen zijn zelden stom, hooguit de antwoorden :). Wel heb ik het idee dat je een verkeerd begrip heb van 'parentID'. Dat is namelijk een verwijzing naar een ander record in dezelfde tabel. dus als je een tabel Locaties hebt met daarin als hoogste niveau Afdelingen, dan heeft zo'n record geen ParentID. Een locatie binnen een afdeling heeft dan wél een ParentID, want daarbij verwijs je naar het record van de afdeling. En dat is dus een ander ID nummer.
Kijk je naar je Objecten tabel, dan heb je daarin een veld TypeID dat verwijst naar een record in de tabel Soort. Daarbij heb je een één-op-veel relatie tussen Soort en Objecten. We noemen dit een verwijzingssleutel.
Soort fungeert dus als brontabel voor Type.
 
Inderdaad heb ik een verkeerd beeld van parentID.
Ik moet zeggen dat ik ook in jou voorbeeld database met duiklocaties niet goed kon volgen. Ik moet de verwijzing dus gewoon in dezelfde tabel terug zoeken bij een eerder of volgend record. Ik was daar aan te zoeken naar een bijhorende tabel om bv de duikstreken van Nederland te vinden (grevelingen, oosterschelde zeeland enz.) maar die staan dus gewoon mee in dezelfde tabel.

Ik bekijk dat bestand eens terug met andere ogen.
 
Waarom kies je voor een parentID verwijzing en niet voor een andere tabel met dan een verwijssleutel.
Je kan toch met beide manieren hetzelfde? bekomen.

In de duiklokaties tabel van de cursus staan de duikstekken bv. Lokkersnol ed in dezelfde lijst als de landen Nederland, Egypte enz Waarom geen tabel met landen en een tabel met duiklokaties. Er zijn drie niveaus nl Land, streek en duiklokatie.

Dus ja waarom zo en niet met drie aparte tabellen
 
Je kan toch met beide manieren hetzelfde? bekomen.
Ja en nee. Je ziet inderdaad vaak dat een db bouwer kiest voor aparte tabellen. En daar is in beginsel weinig mis mee. Zeker als je van tevoren weet hoe diep de lagen gaan worden.
Belangrijker is het verschil in gegevenstype tussen de tabellen. Een land is een andere entiteit als postcodereeks. Een postcodereeks heeft hele andere gegevens als een land, waar je wellicht een afkorting hebt en een landcode. Kortom: landen staan meestal in een aparte tabel, en straatnamen ook.

Bij een postcode database weet je meestal dat het eerste niveau een land is als je internationaal werkt, een provincie als je regionaal werkt, en een plaatsnaam als je lokaal werkt. Wat daaronder zit is dan meestal een straatnaam, en daaronder de postcodereeksen. Met dus steeds een verwijzingsveld naar het bovenliggende niveau. Dus in de tabel Plaatsen zet je een LandID, in Straatnaam zet je een PlaatsID en in Postcodes zet je een StraatID. Bij Postcodes houdt de scheiding op; dieper kun je niet gaan.

Kijken we naar de lokatietabel, dan is dat onderscheid een stuk kleiner. Bij het vastleggen van lokaties in dit voorbeeld gaat het eigenlijk alleen om het vastleggen van lokaties. Daarbij zit je in een soort van ui, die je steeds verder afpelt. Beter voorbeeld is wellicht het bekende Russische Matrushka popje. Daarbij haal je steeds kleinere identieke popjes uit de grotere pop. Zo is het ook met de lokaties. Je begint met de grootste lokatie, en de volgende lokatie is dus een kleiner gebied in de vorige lokatie. En de derde die je kiest is weer kleiner als de lokatie waar hij uit komt. In beginsel kun je die lokaties ook steeds verder specificeren; er hoeft geen eind aan te komen. Je kiest dus een land, daarna een provincie, daarna een plaats, daarna een lokatie, en desnoods kun je daar nog weer een aantal lokaties onder hangen. Er is geen fysieke belemmering, wat wél het geval is bij de constructie met vaste tabellen.

Ander voorbeeldje: als je een tabel hebt waarin een gebruiker een onderwerp moet kiezen, kun je dezelfde constructie gebruiken. Je kiest dan de eerste categorie, daarna de tweede, dan de derde optie, etc. Je kunt een oneindig aantal categorieën aan elkaar knopen, en dus steeds dieper in het poppetje duiken. Zou je daar losse tabellen voor gebruiken, dan zou je, als je 5 niveau's wilt hebben, daar 5 tabellen voor moeten maken. En dan zit je ook gelijk vast, want wil je een zesde categorielaag, dan heb je wéér een extra tabel nodig. Terwijl dat waarschijnlijk maar voor een paar categorieën nodig hoeft te zijn. Ook in dit voorbeeld staat in de tabel steeds hetzelfde type gegeven.

Laatste voorbeeld: een stamboomtabel. Hier doe je hetzelfde: je begint met de oudste persoon in te voeren, die op dat moment de stamvader/moeder is/zijn. De kinderen van de ouder(s) krijgen dan ParentID's naar die personen, en de kinderen daar weer van krijgen een verwijzing naar de kinderen van de eerste generatie. En zo verder. Vind je vervolgens de ouders van de 'stamoudsten', dan voer je die in zonder ParentID (want die heb je dan niet) en bij de eerste personen vul je dan achteraf alsnog het ParentID in. De stamboom heeft dan nieuwe stamoudsten gekregen. Dus: ook een oneindige boomconstructie.

Kortom: als je een flexibel systeem wilt hebben waarbij je niet beperkt wordt door het aantal lagen dat je kunt aanbrengen, kies je voor de constructie met één tabel met een ParentID. Elke nieuwe record hangt dan aan een ander record, behalve de eerste in de boom. Heb je een vaste diepte in je lagen, dan kun je overwegen om vaste tabellen te maken. Dit werkt zeker plezieriger als je érg veel data in je tabellen hebt. Een postcode tabel heeft heel wat records, en die wil je dus niet in dezelfde tabel hebben als de straatnamen en plaatsnamen, al zou dat technisch best wel kunnen.
 
Dank je, ik meen het te begrijpen.

Een vraag die er bij mij een beetje aan vast hangt denk ik.
Via een invoerformulier wil je in een nieuw record een locatie invullen. Je hebt meer dan 200 verschillende locaties. Je zou dit kunnen doen met een keuzelijst met invoervak, maar dit is dus een enorme lange lijst om uit te kiezen. (of zie ik dit al verkeerd)
Kan je eerst een invoervak hebben met landen waardoor je in de volgende invoerlijst een kleiner aantal keuzes hebt van provincies om dan in de volgende keuzelijst te kunnen kiezen uit de gemeentes van die provincie.

Natuurlijk kan dat maar hoe.

Is dit het gemakkelijkste te realiseren via het systeem van parentID of via drie verschillende tabellen.
 
Is dit het gemakkelijkste te realiseren via het systeem van parentID of via drie verschillende tabellen.
Dat hangt van de inrichting van je db af. Als je voor Landen een aparte tabel hebt, voor Provincies en voor Gemeentes dan zou ik die tabellen uiteraard gebruiken. Heb je één tabel met een veld ParentID om te verwijzen, dan blijf je daar natuurlijk op zitten. Voor de keuzelijsten (met invoervak) maakt dat eigenlijk helemaal niks uit.
In Hoofdstuk 8 van de Access cursus leg ik het eerste principe uit, in hoofdstuk 9 het tweede. Take your pick :).
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan