Wanneer geen relatie leggen

  • Onderwerp starter Onderwerp starter EGeen
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

EGeen

Gebruiker
Lid geworden
21 mrt 2008
Berichten
84
Goedenavond,

Heb na enige pogingen het anders te doen toch maar weer opgepakt: Access. Heb de cursussen en een boek gelezen.

Mijn vraag: Wanneer is het niet verstandig een relatie te leggen tussen tabellen?

Als voorbeeld neem ik Noordenwind waarbij de tabel 'Detailgegevens Orders' de onderdelen 'Voorraad-id' en 'inkooporder-id' niet zijn gekoppeld aan de bijbehorende tabellen.

Met vriendelijke groeten,

Erwin Giezen
 
Relaties gebruik je om data-integriteit tussen tabellen af te dwingen. Dus tussen Orders en Orderdetails leg je een koppeling op basis van OrderID omdat je niet wilt dat er ordernummers in Orderdetails worden ingevuld die niet bestaan in Orders. Idem dito tussen klanten en Orders: je wilt geen orders invoeren voor klanten die niet bestaan. Kun je namelijk naar je geld fluiten. Als je de tabellen op die manier hebt gekoppeld, heb je een veilige database. Daarnaast kun je in een tabel gegevens uit andere tabellen laten invullen die niet gekoppeld zijn, maar waarvoor je toch die integriteit afdwingt. In dat geval dwing je de integriteit af op het gebruikte formulier, bijvoorbeeld doordat je Keuzelijsten met invoervak gebruikt om de gewenste gegevens te selecteren. Zo'n keuzelijst is dan gebaseerd op de niet-gekoppelde tabel, maar omdat je de tabel met bestaande records gebruikt om de gegevens in je tabel te zetten, heb je toch integriteit, want niet-bestaande gegevens zitten niet in de tabel.
Hopelijk helpt dit een beetje?
 
Klinkt erg logisch. Probeer alles goed door te hebben, en dus ook de uitzonderingen.

Iemand zei ergens dat er pas een relatie mag worden aangemaakt als de waarde hiervan in beide tabellen altijd wordt ingevuld. Bijvoorbeeld geen relatie aanmaken tussen de Klant-ID van tabel 'Klantgegevens' en de Klant-ID in de tabel 'Orderdetails' als er ook orders worden ingevoerd zonder een bepaalde klant-ID. (een-op-veel-relatie: één de klantgegevens, veel de orderdetails).

Mijn inziens moet er dan nog steeds een relatie worden aangemaakt in het venster 'relaties' toch?
 
Heb je (bijna) goed; in je voorbeeldje leg je een relatie tussen Klantgegevens en Orders niet met Orderdetails. Een order leg je vast met één klant. Orderdetails bevat de te leveren producten. Je kunt de Join tussen tabellen wel degelijk aanpassen, maar de Referentiële integriteit blijft desondanks bestaan. Wat je kennis bedoelde is de situatie dat je een order wilt opnemen van een niet-bestaande klant. Als je orders opneemt van een nieuwe klant, dan heb je de klantgegevens nog niet. Een beetje slimme zakenman verkoopt niks aan een klant die-ie niet kent. Want je wilt wel enige garantie dat je betaald gaat worden. Dus het zal nooit voorkomen dat je een order opneemt maar de klant zich vervolgens niet laat opnemen in je klantenbestand. Je kunt dan twee dingen doen: eerst de klant registreren, en daarna de order opnemen, of eerst de order opnemen en daarna de klantgegevens. Het hangt een beetje van de cultuur af welke variant je wilt gebruiken. Maar in beide varianten zul je de klant echt wel willen vastleggen.
De eerste situatie houdt in dat je eerst het Klantenformulier opent, en de klantgegevens invult. Daarna maak je een order aan met de nieuwe klantgegevens. De tweede variant vult een order in, zonder dat je een klant hebt ingevuld. Ook dat kan dus. Je kunt er voor kiezen om dat te faciliteren door het Jointype van de relatie te veranderen zodat je orders mag invullen waarbij het KlantID leeg is. Maar hoe dan ook: de gegevens moeten een keer komen. En op dat moment moet je het KlantID alsnog invullen in de Order tabel.

Conclusie: je legt altijd een relatie tussen tabellen die aan elkaar gerelateerd zijn, zoals Orders en Klanten. Afhankelijk van de bedrijfscultuur leg je dan eerst de klantgegevens vast en dan de order, of je begint gelijk met het invoeren van de order en eindigt dan met het vastleggen van de klantgegevens. De hybride methode is er ook: begin met het opnemen van de order in Orders, gebruik de gebeurtenis <BijNietInLijst> op de keuzelijst cboKlanten om snel de basisgegevens van de klant in te vullen, en ga dan verder met de order, en voltooi de bestelling met het verder invullen van de klantgegevens. En al die opties dus met een en dezelfde relatie (Eén-op-veel) tussen Klanten en Orders :).
 
Gelukkig, dan heb ik het tot nu toe nog door hoe het werkt met relaties. Mijn voorbeeld heb ik inderdaad iets te snel getyped. Dat er nog een tabel bestaat met klantgegevens. Het ging mij puur om of het voor kan komen dat er niets wordt ingevuld terwijl er wel een relatie is. Het verwerken ervan in een groter geheel en het verwerken van alle normalisatieregels uit de cursus is nog een lastige.

Bedankt, :d
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan