[ALG] Databases en relaties

Pagina: 1
Acties:

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-05 08:21
Het nut van relaties in databases is mij bekend.
Echter ik zit met een vraagje hierover, waar ik maar geen antwoord op kan krijgen.

Ik werk veel met vb.net en msde-sql als db.
En ik kwam laatst iets tegen wat ik toch niet helemaal begrijp.

Stel ik ontwikkel een tabel met b.v. orders.
Daarnaast een tabel met klantgegevens.

Dan kan ik een mooie relatie maken tussen de orders en klantgegevens.
(order.klantnummer = klantgegevens.klantnummer) o.i.d.

Ik wil graag mijn tabel met klantgegevens up-to date houden. Dus niet actieve klanten gaan eruit.

Stel ik wil nu de orders uitdraaien over b.v. het jaar 2000, dan staan er klantnummers tussen die op dit moment niet meer actief zijn.
En ik heb de gegevens van deze klanten al verwijdert.

Hoe gaat sql daar dan mee om ?

Is het dan niet beter om geen relatie aan te maken, maar een b.v. combobox met gegevens uit de klantgegevens tabel te halen, en die dan in de tabel orders weg te schrijven ?

The best thing about UDP jokes is that I don't care if you get them or not.


  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20:02
Als een klant ooit besteld heeft en de betreffende order staat nog in het systeem, dan is het niet verstandig die klant te verwijderen. Wellicht kan je iets met een extra veld 'active' doen waarin je de laatste actiedatum zet, en vervolgens alle klanten met een datum > 1 jaar of zo inactief noemen, en dus niet in klantoverzichten tonen.

  • Skaah
  • Registratie: Juni 2001
  • Niet online
Als een klant mist, terwijl er wel een verwijzing naar is, wordt de hele rij niet geretouneerd. Je kunt dat oplossen met een van de OUTER joins, welke weet ik uit mijn hoofd niet. Zie de P&W FAQ.

Verwijderd

Je legt juist de relaties om bovenstaand probleem te voorkomen... dus als je dan de klant-gegevens weggooid moet je ook de order-historie van die klant weggooien.

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-05 08:21
ok, tnx.
Dan had ik het dus wel goed begrepen.
Dan is het dus niet altijd verstandig om relaties aan te brengen lijkt me.

The best thing about UDP jokes is that I don't care if you get them or not.


  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20:02
Relaties zijn juist WEL verstandig. Wat doe je als je geen relaties aanlegt? Dan heb je een tabel klantgegevens, en een tabel orders waarin je voor elke order de klantgegevens kopieert. Buiten het feit dat dit ruimteverspilling is, is het ook onhandig als je klantgegevens wilt wijzigen of bijvoorbeeld alle orders van een klant bij elkaar zoeken.

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-05 08:21
sjroorda schreef op 15 februari 2004 @ 16:16:
Relaties zijn juist WEL verstandig. Wat doe je als je geen relaties aanlegt? Dan heb je een tabel klantgegevens, en een tabel orders waarin je voor elke order de klantgegevens kopieert. Buiten het feit dat dit ruimteverspilling is, is het ook onhandig als je klantgegevens wilt wijzigen of bijvoorbeeld alle orders van een klant bij elkaar zoeken.
Oke, zonder een flamewar te beginnen....
Ik hoop er wat wijzer van te worden om hier over te discusseren.

Stel ik heb t_orders met een klantid, en
t_klantgegevens met klantid.

Als t_orders geen relatie heeft. En ik wil de voornaam en achternaam hebben van een klant uit een bepaald order, dan kan ik:
code:
1
2
3
select voornaam,achternaam from t_klantgegevens where klantid = @t_order.klantid

@t_orders.klantid = stukje code om klantid te pakken uit t_orders.klantid

Als ik het bovenstaande doe, zie ik geen verschil in code/snelheid als met een relatie.

Of begrijp ik het nog niet ?

The best thing about UDP jokes is that I don't care if you get them or not.


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Skaah schreef op 15 februari 2004 @ 15:56:
Als een klant mist, terwijl er wel een verwijzing naar is, wordt de hele rij niet geretouneerd. Je kunt dat oplossen met een van de OUTER joins, welke weet ik uit mijn hoofd niet. Zie de P&W FAQ.
Als je een klant mist, terwijl je wel nog een order hebt voor die klant, dan is er iets mis met je databank.
De referentiele integriteit die door de relaties moet afgedwongen worden, zal dan nl. uitstaan of niet werken. Het is juist de bedoeling dat je een dergelijke situatie kunt voorkomen.
Remc0 schreef op 15 februari 2004 @ 16:26:
[...]

Oke, zonder een flamewar te beginnen....
Ik hoop er wat wijzer van te worden om hier over te discusseren.

Stel ik heb t_orders met een klantid, en
t_klantgegevens met klantid.

Als t_orders geen relatie heeft. En ik wil de voornaam en achternaam hebben van een klant uit een bepaald order, dan kan ik:
code:
1
2
3
select voornaam,achternaam from t_klantgegevens where klantid = @t_order.klantid

@t_orders.klantid = stukje code om klantid te pakken uit t_orders.klantid

Als ik het bovenstaande doe, zie ik geen verschil in code/snelheid als met een relatie.

Of begrijp ik het nog niet ?
Ik snap het niet. :?
Als je wel een relatie hebt liggen tussen die 2 tabellen, kan je die gegevens op net dezelfde manier terugkrijgen.
De bedoeling van een relatie tussen 2 tabellen, is dat je constraints (referential integrity) kunt afdwingen.

[ Voor 45% gewijzigd door whoami op 15-02-2004 16:33 ]

https://fgheysels.github.io/


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-05 08:21
whoami schreef op 15 februari 2004 @ 16:30:
[...]
[knip]
Ik snap het niet. :?
Als je wel een relatie hebt liggen tussen die 2 tabellen, kan je die gegevens op net dezelfde manier terugkrijgen.
De bedoeling van een relatie tussen 2 tabellen, is dat je constraints (referential integrity) kunt afdwingen.
Oh, oke.
Alleen vang ik het al af in vb door input te controleren/dwingen,
en door zelf queries op te bouwen en die zo samen te stellen dat er eigenlijk geen relatie nodig is.
Alleen is dat dus niet zo netjes.

The best thing about UDP jokes is that I don't care if you get them or not.


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Remc0 schreef op 15 februari 2004 @ 16:43:
[...]

Oh, oke.
Alleen vang ik het al af in vb door input te controleren/dwingen,
en door zelf queries op te bouwen en die zo samen te stellen dat er eigenlijk geen relatie nodig is.
Alleen is dat dus niet zo netjes.
Nee, dat is niet zo netjes. Je legt daarmee trouwens min of meer een deel van de structuur vast in je client-applicatie, en dat kan ook de bedoeling niet zijn.
Wat als je verschillende applicaties hebt (web-app, windows-app, ...) die dezelfde DB gebruiken? Dan ga je al die controles in je client code gaan opnemen? Nee, dat is de bedoeling niet.
Het is net de kracht van een RDBMS dat de databank zelf zorg draagt voor de integriteit van de gegevens.

https://fgheysels.github.io/


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-05 08:21
tnx, duidelijk..
Weer wat geleerd.

The best thing about UDP jokes is that I don't care if you get them or not.

Pagina: 1