Normaliseren eenvoudige DB

Pagina: 1
Acties:
  • 650 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • ProCal
  • Registratie: Juni 2001
  • Laatst online: 31-08-2023
Ik ben bezig met het maken van een (volgens mij) zéér eenvoudige database, allereerst wil ik uiteraard gaan normaliseren (als dat al nodig is)

Ik heb dat ooit wel op school gehad, maar het meeste is al weer verdwenen zal ik maar zeggen.

Wat ik nu heb:

De database heet bedrijf (het is voor een bedrijfje wat ik zelf wil gaan beginnen) en onderstaande is, wat ik wil gaan doen

[Database bedrijf]

Tabel 1: [KLANT]

Klantnummer
Klantnaam
Klantadres
Klanthuisnr
Klantpostcode
Klantwoonplaats
Klanttelefoon
Klanttelefoonmob
Klantbanknr

==============================

Tabel 2: [ARTIKELEN]

Artikelnummer
Artikelomschrijving
Artikelprijs

==============================

Dit is eigenlijk alles. Ik ben al een tijdje bezig geweest maar ik kom er niet uit. Er zijn ook geen dubbele gegevens in de tabellen.

Kan iemand mij verder helpen of vertellen of ik hier überhaupt wel moet normaliseren?

Acties:
  • 0 Henk 'm!

Anoniem: 118110

is goed toch, maar moet er geen tabel bij met bestelling

Acties:
  • 0 Henk 'm!

  • Stoffel
  • Registratie: Mei 2001
  • Laatst online: 13:02

Stoffel

Engineering the impossible

Wat wil je er nog aan normaliseren dan?

Acties:
  • 0 Henk 'm!

Anoniem: 115240

Als de bedoeling is om gewoon wat info over de klanten en de producten bij te houden, dan heb je het goed. Maar is het om orders e.d. erin te verwerken dan mis je nog wel een paar dingen

bij artikel misschien nog
-aantalinstock
-leverbaarvanaf

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Is het ooit "niet-genormaliseerd" geweest?

Acties:
  • 0 Henk 'm!

  • ProCal
  • Registratie: Juni 2001
  • Laatst online: 31-08-2023
Menno schreefis goed toch, maar moet er geen tabel bij met bestelling
Is inderdaad een goeie tip. Als klanten iets willen bestellen dat ik dat daar ik kan zetten... Dan zal ik ook een tabel moeten maken met een voorraad enzo...
_-SToFFeL-_ schreef op vrijdag 14 januari 2005 @ 23:59:
Wat wil je er nog aan normaliseren dan?
Dat wist ik dus niet meer... Of dat eventueel nog kon (moest) :D

Acties:
  • 0 Henk 'm!

Anoniem: 28333

offtopic:
wil je geen email adres opslaan?

Acties:
  • 0 Henk 'm!

  • Palomar
  • Registratie: Februari 2000
  • Niet online
Idd, qua normaliseren valt er niet veel meer te doen. Maar je hebt nog geen relaties aangegeven. Ga je dat nog doen of is dit het al? Ik zou nog een tabel aanmaken met 'bestellingen' en daarin klantnummer en artikelnummer en aantal_artikelen.
Nu kan 1 klant maar 1 artikel bestellen (eigenlijk kan dat nog niet eens) en ik neem aan dat ze ook wel es meerdere artikelen tegelijk willen bestellen.

Maar dan is het ook wel handig als je aangeeft wat het doel wordt van de database. Dan kunnen we wat gerichtere tips geven :)

[ Voor 22% gewijzigd door Palomar op 15-01-2005 00:10 ]


Acties:
  • 0 Henk 'm!

  • ProCal
  • Registratie: Juni 2001
  • Laatst online: 31-08-2023
Anoniem: 28333 schreef op zaterdag 15 januari 2005 @ 00:06:
offtopic:
wil je geen email adres opslaan?
Uiteraard!

Nice, bedankt voor al jullie tips. Ik heb binnen 10 minuten weer een zooitje ervaring opgedaan :P

wat ik nu bedacht heb (mede dankzij jullie uiteraard _/-\o_ :


[Database bedrijf]

Tabel 1: [KLANT]

Klantnummer
Klantnaam
Klantadres
Klanthuisnr
Klantpostcode
Klantwoonplaats
Klanttelefoon
Klanttelefoonmob
Klantemail
Klantbanknr

==============================

Tabel 2: [LEVERING]

Artikelnummer
Artikelomschrijving
Artikelprijs

==============================

Tabel 3: [BESTELLINGEN]

Artikelnummer
Artikelnummerleverancier
Artikelprijs
Aantal

==============================

Tabel 4: [VOORRAAD]

Artikelnummer
Artikelomschrijving
Artikelprijs
Aantal

==============================

Tabel 5: [LEVERANCIERS]

Leveranciersnummer
Leveranciernaam
Leverancieradres
Leverancierhuisnr
Leverancierpostcode
Leverancierwoonplaats
Leveranciertelefoon
Leverancieremail
Leverancierurl
Leverancierbanknr

Acties:
  • 0 Henk 'm!

Anoniem: 115240

ProCal schreef op zaterdag 15 januari 2005 @ 00:02:

Is inderdaad een goeie tip. Als klanten iets willen bestellen dat ik dat daar ik kan zetten... Dan zal ik ook een tabel moeten maken met een voorraad enzo...
Misschien is het verstandig om eens goed na te denken over wat je wilt, en het dan ook eens te zeggen. Dan kunnen we je veel beter helpen

/edit

Voila nu komen we ergens. Was een beetje te snel van mezelf

[ Voor 8% gewijzigd door Anoniem: 115240 op 15-01-2005 00:13 ]


Acties:
  • 0 Henk 'm!

Anoniem: 90394

als je maar 2 tabellen hebt, kan je wel normaliseren, maar wat zou het?

normaliseren is vooral bedoeld om complexe databases logisch goed inelkaar te kunnen zetten
zodat er geen rare dingen gebeuren bij invoeren/verwijderen/updaten en dat je geen data gaat dupliceren, (waarna je dan weer kans hebt dat data verschillen optreden die niet zouden mogen)

pas bij een tabelletje of vijf a tien wordt het de moeite om normalisering regeltjes toe te gaan passen.

dat krijg je als je niet op refresh drukt, voordat je replyed 8)7

[ Voor 8% gewijzigd door Anoniem: 90394 op 15-01-2005 00:14 ]


Acties:
  • 0 Henk 'm!

  • ProCal
  • Registratie: Juni 2001
  • Laatst online: 31-08-2023
Palomar schreef op zaterdag 15 januari 2005 @ 00:08:
Idd, qua normaliseren valt er niet veel meer te doen. Maar je hebt nog geen relaties aangegeven. Ga je dat nog doen of is dit het al? Ik zou nog een tabel aanmaken met 'bestellingen' en daarin klantnummer en artikelnummer en aantal_artikelen.
Nu kan 1 klant maar 1 artikel bestellen (eigenlijk kan dat nog niet eens) en ik neem aan dat ze ook wel es meerdere artikelen tegelijk willen bestellen.

Maar dan is het ook wel handig als je aangeeft wat het doel wordt van de database. Dan kunnen we wat gerichtere tips geven :)
Aha.. dat zou dan in tabel 2 moeten komen (er komt dan een klantnummer bij).
En inderdaad, normaliseren vond ik al een hel maar bij relaties leggen (1 op veel enzo is dat toch?) raak ik helemaal het spoor bijster.

Het doel van de database:

Ik wil (met een vriend) een bedrijf beginnen, waar we bij klanten langsgaan om bepaalde dingen te repareren. Het kan zo zijn dat de klant van te voren iets bestelt omdat hij zelf al geconstateerd heeft dat het betreffende artikel stuk is, het kan ook zijn dat ik bij de klant constateer dat het artikel defect is. Daar komt de bestelling en leverancier kijken.. Dat is min of meer wat ik ermee wil gaan doen.

En dan uiteindelijk via MySQL+PHP+nog meer, dit in een website maken met formuliertjes etc. Maar dat is van later zorg.

Acties:
  • 0 Henk 'm!

  • Palomar
  • Registratie: Februari 2000
  • Niet online
Je moet ook niet onnodig dingen dubbel in de database zetten. Je hebt nu bijv. artikelprijs al 3 (!!) keer erin staan. Nu moet je hetzelfde gegeven driedubbel gaan bijhouden.

[ Voor 5% gewijzigd door Palomar op 15-01-2005 00:18 ]


Acties:
  • 0 Henk 'm!

  • ProCal
  • Registratie: Juni 2001
  • Laatst online: 31-08-2023
Palomar schreef op zaterdag 15 januari 2005 @ 00:14:
Je moet ook niet onnodig dingen dubbel in de database zetten. Je hebt nu bijv. artikelprijs al 2 keer erin staan. Nu moet je hetzelfde gegeven dubbel gaan bijhouden.
Ja, maar: artikelprijs is in tabel 2 en 4 hetzelfde (de verkoopprijs) echter, in tabel 3 komt de winkelprijs te staan (prijs van leverancier dus). Hoe ga ik dat nou weer oplossen. En dan ook nog het verhaal van de relaties leggen :/

En in tabel 2 kán ook klantnummer komen, omdat klant 1 iets bestelt, maar wat wordt dán de primaire sleutel. Of maak ik er dan 2?

Damn.. toch moeilijker dan het lijkt (voor mij dan...)

Acties:
  • 0 Henk 'm!

Anoniem: 90394

Palomar schreef op zaterdag 15 januari 2005 @ 00:14:
Je moet ook niet onnodig dingen dubbel in de database zetten. Je hebt nu bijv. artikelprijs al 2 keer erin staan. Nu moet je hetzelfde gegeven dubbel gaan bijhouden.
dat kan wel handig zijn als je dingen hebt ingekocht voor een bepaalde prijs, die ineens goedkoop/duur kunnen worden (dimmetjes b.v.), waarna de prijzen op al betaalde bestellingen /facturen ineens veranderen als je de artikelprijs maar op 1 lokatie in de DB bijhoudt

dat zal de boekhouder leuk vinden.

Acties:
  • 0 Henk 'm!

  • Stoffel
  • Registratie: Mei 2001
  • Laatst online: 13:02

Stoffel

Engineering the impossible

ProCal schreef op zaterdag 15 januari 2005 @ 00:18:
[...]


Ja, maar: artikelprijs is in tabel 2 en 4 hetzelfde (de verkoopprijs) echter, in tabel 3 komt de winkelprijs te staan (prijs van leverancier dus). Hoe ga ik dat nou weer oplossen. En dan ook nog het verhaal van de relaties leggen :/

En in tabel 2 kán ook klantnummer komen, omdat klant 1 iets bestelt, maar wat wordt dán de primaire sleutel. Of maak ik er dan 2?

Damn.. toch moeilijker dan het lijkt (voor mij dan...)
Je kan geen 2 primairy keys maken, wel een samengestelde, een alternate of een referentiële sleutel :)

Acties:
  • 0 Henk 'm!

  • ProCal
  • Registratie: Juni 2001
  • Laatst online: 31-08-2023
_-SToFFeL-_ schreef op zaterdag 15 januari 2005 @ 00:19:
[...]


Je kan geen 2 primairy keys maken, wel een samengestelde, een alternate of een referentiële sleutel :)
Haha... en het wordt??? *tromgeroffel*

Nee, ff zonder gekkigheid... 1 waarde in die tabel bepaalt of het uniek is of niet. Klopt toch? Ik zat dus te denken aan artikelnummer... Wat dan, als er óók een klantnummer bij komt, waarbij ik ook nog eens een relatie moet leggen IMO naar tabel 1....

Én, zie ik nu, als een klant iets geleverd krijgt, komt er dus een klantnummer bij in tabel 2 (levering) maar: ik zie nu ook: als een klant nu iets bestelt? (tabel 3) dan moet daar ook een klantnummer bij komen te staan...

[ Voor 18% gewijzigd door ProCal op 15-01-2005 00:24 ]


Acties:
  • 0 Henk 'm!

Anoniem: 115240

Verder zie ik in de tabel bestelling een enkele sleutel "artikelnummer". Daar zou ik een samengestelde sleutel voor nemen met "artikelnummer" en "klantnummer".

En aan je verhaal te horen draait het eigenlijk allemaal op repareringen. Dan zou ik zoiets nemen

tblKlanten
->klantnummer

tblReparering
->repareringsnummer
->klantnummer

tblBenodigdheden
->repareringsnummer
->artikelnummer

tblArtikelen
->Artikelnummer

//en als klanten ook gewoon iets kunnen kopen

tblOrder
->orderid
-klantid
leverdatum

tblOrderLijn
->orderid
->artikelnummer
-aantal
-prijs


Zo even vlug uit mijn hoofd

/edit
Ben het stukje van leveranciers nog vergeten.

dan nog een tabel leveranciers met in tabel artikelen een refererende sleutel naar deze tabel. Als ik ervan uit ga dat 1 product door een bepaalde leverancier geleverd word. Anders moet je er nog een tabel tussen die relatie zetten. En misschien dan nog een tabel bestellingen om te zien wat je besteld hebt

[ Voor 34% gewijzigd door Anoniem: 115240 op 15-01-2005 00:28 ]


Acties:
  • 0 Henk 'm!

  • ProCal
  • Registratie: Juni 2001
  • Laatst online: 31-08-2023
Anoniem: 115240 schreef op zaterdag 15 januari 2005 @ 00:23:
Verder zie ik in de tabel bestelling een enkele sleutel "artikelnummer". Daar zou ik een samengestelde sleutel voor nemen met "artikelnummer" en "klantnummer".
...
Die samengestelde sleutel, zal ik dan ook in tabel 2 (levering) moeten gebruiken. Begrijp ik het dan goed?

Acties:
  • 0 Henk 'm!

Anoniem: 51899

Artikelnummer
Klantnummer

Zul je ergens aan elkaar moeten relateren. aangezien 1 klant meerdere artikelen kan hebben/bestellen

Acties:
  • 0 Henk 'm!

  • Palomar
  • Registratie: Februari 2000
  • Niet online
ProCal schreef op zaterdag 15 januari 2005 @ 00:18:
[...]

Ja, maar: artikelprijs is in tabel 2 en 4 hetzelfde (de verkoopprijs) echter, in tabel 3 komt de winkelprijs te staan (prijs van leverancier dus).
dan kun je de naamgeving beter anders doen. Bijv. inkoopprijs en verkoopprijs. Is voor jezelf en anderen duidelijker ;)

Zo even snel uit mn hoofd zou ik het ong. zo doen:

KLANTEN
klantnummer
klantnaam
etc.

BESTELLINGEN_KLANTEN
bestellingnummer_klant
klantnummer
artikelnummer

BESTELLINGEN_LEVERANCIERS
bestellingnummer_leverancier
leveranciernummer
artikelnummer
inkoopprijs

ARTIKELEN
artikelnummer
artikel_naam
voorraad_aantal
verkoopprijs
etc.

LEVERANCIERS
leveranciernummer
leverancier_naam
etc.

Zullen ongetwifjeld nog dingen niet kloppen, maar iig om even de relaties wat duidelijk te maken.

Voer anders alles maar es in in Access. Dan ga je naar 'relaties' en kun je mooi slepen etc. zodat het visueel duidelijk wordt.

[ Voor 6% gewijzigd door Palomar op 15-01-2005 00:32 ]


Acties:
  • 0 Henk 'm!

Anoniem: 115240

ProCal schreef op zaterdag 15 januari 2005 @ 00:25:
[...]


Die samengestelde sleutel, zal ik dan ook in tabel 2 (levering) moeten gebruiken. Begrijp ik het dan goed?
Zo is dat. Maar waar is trouwens je table artikelen gebleven.

Maar in een order staan ook gegevens dubbel. Bijvoorbeeld de leverdatum. Daarom nog een tabel orderlijn. Check mijn vorige posts

Acties:
  • 0 Henk 'm!

  • ProCal
  • Registratie: Juni 2001
  • Laatst online: 31-08-2023
Anoniem: 51899 schreef op zaterdag 15 januari 2005 @ 00:26:
Artikelnummer
Klantnummer

Zul je ergens aan elkaar moeten relateren. aangezien 1 klant meerdere artikelen kan hebben/bestellen
Precies.. dat vermoedde ik ook al. Maar hoe doe ik dat dan? door middel van een gemeenschappelijk..... iets... ?
Palomar schreef:
dan kun je de naamgeving beter anders doen. Bijv. inkoopprijs en verkoopprijs. Is voor jezelf en anderen duidelijker

Zo even snel uit mn hoofd zou ik het ong. zo doen:

[...]

Voer anders alles maar es in in Access. Dan ga je naar 'relaties' en kun je mooi slepen etc. zodat het visueel duidelijk wordt.
Goeie tip. Die naamgeving ga ik ff veranderen (handig dat het allemaal nog op papier staat en nog geen database is :))
Yellow_snow schreef:
Zo is dat. Maar waar is trouwens je table artikelen gebleven.

Maar in een order staan ook gegevens dubbel. Bijvoorbeeld de leverdatum. Daarom nog een tabel orderlijn. Check mijn vorige posts
Tabel artikelen is nu tabel levering geworden om verwarring te voorkomen. Het gaat daar namelijk om de spullen die ik bij de klant aflever.

En ik zal je vorige posts even doorlezen nog. (keer of 11 denk ik hehe)

edit: naja... k kom dr nu niet echt meer uit geloof ik... maar goed.. kben moe ook dus ik ga morgen weer lekker verder. iedereen in ieder geval bedankt voor alle hulp!

[ Voor 7% gewijzigd door ProCal op 15-01-2005 00:52 ]


Acties:
  • 0 Henk 'm!

Anoniem: 115240

Afbeeldingslocatie: http://users.pandora.be/bosend/tweakers/DataBase_small.gif
clickbaar

Voila, zo zou ik het oplossen met wat ik nu weet. Er kan nog vanalles veranderen


Nu ga ik ook slapen :Z

[ Voor 5% gewijzigd door Anoniem: 115240 op 15-01-2005 01:37 ]


Acties:
  • 0 Henk 'm!

  • ProCal
  • Registratie: Juni 2001
  • Laatst online: 31-08-2023
Anoniem: 115240 schreef op zaterdag 15 januari 2005 @ 01:35:
[afbeelding]
clickbaar

Voila, zo zou ik het oplossen met wat ik nu weet. Er kan nog vanalles veranderen


Nu ga ik ook slapen :Z
Hmm... Dat ziet er veelbelovend uit. Ik heb het op deze manier echter nog nooit gezien maar ik moet hier vast iets mee kunnen als ik het ff goed bekijk. K ben nu aan het werk dus dat zal wel weer vanmiddag worden.

Bedankt voor je moeite iig!

Acties:
  • 0 Henk 'm!

Anoniem: 115240

Heb er nog eens over geslapen en nog een fout ontdekt. Die optionele relatie tussen tblReparering en tblOrderLijn moet liggen tussen tblReparering en tblOrder. En die foreign key mee overnemen uiteraard.

Acties:
  • 0 Henk 'm!

  • Boss
  • Registratie: September 1999
  • Laatst online: 16:31

Boss

+1 Overgewaardeerd

En wat ik wel vaker zie en niet logisch is:
Waarom sla je straat en huisnummer apart op? Ben je van plan iets te gaan doen met die info?
Realiseer je dan dat een officieel huisadres bestaat uit een:
- Straat (Tweakstraat)
- Nummer (42)
- Toevoeging (a. boven, tegenover (voor woonboten, die liggen 'tegenover' een bestaand adres))

Anders is het los opslaan van alleen een nummer echt overbodig, en lastig bij invoeren.
Of compleet (3 velden) of gewoon 1 veld.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 17:24

MBV

nummer+ toevoeging kan in 1 veld. Kan makkelijk zijn met invoeren juist, als je de database van nederlandse postcodes hebt: postcode intikken, en klik: daar staat de straatnaam. Daarnaast kan het handig zijn voor de layout.

Maar je hebt gelijk, vaak is het wat overdreven. Het is wel makkelijker om het nu erbij te doen, dan er later achter te komen dat je het toch apart wilt hebben.

Acties:
  • 0 Henk 'm!

  • Boss
  • Registratie: September 1999
  • Laatst online: 16:31

Boss

+1 Overgewaardeerd

MBV schreef op zaterdag 15 januari 2005 @ 11:51:
nummer+ toevoeging kan in 1 veld. Kan makkelijk zijn met invoeren juist, als je de database van nederlandse postcodes hebt: postcode intikken, en klik: daar staat de straatnaam. Daarnaast kan het handig zijn voor de layout.

Maar je hebt gelijk, vaak is het wat overdreven. Het is wel makkelijker om het nu erbij te doen, dan er later achter te komen dat je het toch apart wilt hebben.
Het nu half doen (nummer + toevoeging in 1 veld) is net zo lastig als het helemaal niet doen. Want dan moet je sowieso die gegevens uit elkaar gaan trekken. Als ik deze database zo inschat zou ik het lekker in 1 veld doen.

Van de 10-tallen databases die ik gezien heb zijn er ook maar een paar waar het nodig was om 3 velden te gebruiken. Zoveel mensen/bedrijven hebben die postcode tabel tenslotte niet, kost immers ook rond de 1000 euro om te gebruiken..

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Acties:
  • 0 Henk 'm!

  • Palomar
  • Registratie: Februari 2000
  • Niet online
Hij kan sowieso beter eerst even een globale opzet maken met de belangrijkste sleutels (primaire sleutels en relaties). Als je dat allemaal op een rijtje hebt kun je je wel bezig gaan houden met afvragen of je het huisnummer in een apart veld zet etc...

Acties:
  • 0 Henk 'm!

  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10

jvaneijk

Dr.Oak

Boss schreef op zaterdag 15 januari 2005 @ 11:59:
[...]


Het nu half doen (nummer + toevoeging in 1 veld) is net zo lastig als het helemaal niet doen. Want dan moet je sowieso die gegevens uit elkaar gaan trekken. Als ik deze database zo inschat zou ik het lekker in 1 veld doen.

Van de 10-tallen databases die ik gezien heb zijn er ook maar een paar waar het nodig was om 3 velden te gebruiken. Zoveel mensen/bedrijven hebben die postcode tabel tenslotte niet, kost immers ook rond de 1000 euro om te gebruiken..
Toch lijkt mij 1 veld niet makkelijk..

Stel: Je hebt meerdere klanten in 1 straat en je wilt klanten op gaan zoeken per straatnaam en dan eventueel een nummer.
Als je alles in 1 veld op slaat is het maar de vraag of je het altijd hetzelfde opslaat.

Misschien heb je hier wat aan.
Normaliseren tutorial


Nog wat tips.
Probeer zo min mogelijk met Autonummering te werken enzo dat maakt de database alleen maar redundantie optreden.

en zoek eens met google naar:
-- Redundantie
-- 1e Normaalvorm
-- 2e NV
-- Boyce-Cott NormaalVorm

Denk dat je dan wel wat verder komt met normaliseren.

[ Voor 14% gewijzigd door jvaneijk op 15-01-2005 15:23 ]

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • hessel
  • Registratie: Januari 2000
  • Laatst online: 05-11-2024
ff een vraagje ... kan een klant ook leverancier zijn of anders om...
want dan zou ik klanten en leveranciers kombineren in een database

Grutte Pier fansels


Acties:
  • 0 Henk 'm!

Anoniem: 115240

hessel schreef op zaterdag 15 januari 2005 @ 16:28:
ff een vraagje ... kan een klant ook leverancier zijn of anders om...
want dan zou ik klanten en leveranciers kombineren in een database
Dat zou je kunnen maar daar moet je mee oppassen!

van leveranciers heb je nog wel wat meer info nodig dan over klanten. Bijvoorbeeld het btw-nummer of zijn ondernemingsnummer enzovoort. Dat heb je bij je klanten niet.

En daarbij nog, hoeveel van je klanten gaan ook nog eens je leverancier zijn? Bitter weinig lijkt me.

Ik zou het iig niet doen

Acties:
  • 0 Henk 'm!

  • Palomar
  • Registratie: Februari 2000
  • Niet online
nee idd, en als een klant leverancier is (als ie een onderdeel zelf heeft gekocht neem ik aan dat je hiermee bedoelt?) dan heb jij daar verder niks mee te maken qua administratie. Gewoon gescheiden houden dus.

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

8)7
ik krijg telkens de kriebels als iemand zomaar ff een ID veldje erbij kwakt, dit op autonummering knalt en er gelijk een primaire sleutel van maakt.

sorry voor caps maar:
GEBRUIK ALS PRIMARY KEY ALTIJD EEN (SAMENGESTELDE) SLEUTEL DIE UNIEK IS.
en het LIEFST: waar mogelijk iets wat vatbaar is in de reele wereld. klantID is niet vatbaar. de klant komt er nooit mee in aanraking en zowel Jan met de Pet als met de Pet Jan zijn dan 2 verschillende personen. Zet dan een gecombineerde sleutel op voor/familienaam (en evt nog een veld ). de kans dat er 2 met de Pet Jan's voorbijlopen is redelijk klein, en als je er dan nog een goed veld bijplakt ben je al VEEL beter bezig.
Wat bvb wel kan is factuurNR als primary key: dit komt nl wel op de factuur en is een gestructureerd veld wat in realiteit gebruikt wordt: 2005011635 heeft een vatbare betekenis zowel voor jou als de boekhouding als voor je DB.
ID is altijd het best gebruikt als verwijssleutel.

jij wou normaliseren? dit is een deel van het normaliseren. ik kan niet geloven dat je dit op school gehad hebt, als je zo'n simpele fout maakt als met ID veldjes :'( |:(

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
HIGHGuY schreef op zondag 16 januari 2005 @ 12:40:
8)7
ik krijg telkens de kriebels als iemand zomaar ff een ID veldje erbij kwakt, dit op autonummering knalt en er gelijk een primaire sleutel van maakt.

sorry voor caps maar:
GEBRUIK ALS PRIMARY KEY ALTIJD EEN (SAMENGESTELDE) SLEUTEL DIE UNIEK IS.
en het LIEFST: waar mogelijk iets wat vatbaar is in de reele wereld. klantID is niet vatbaar. de klant komt er nooit mee in aanraking en zowel Jan met de Pet als met de Pet Jan zijn dan 2 verschillende personen. Zet dan een gecombineerde sleutel op voor/familienaam (en evt nog een veld ). de kans dat er 2 met de Pet Jan's voorbijlopen is redelijk klein, en als je er dan nog een goed veld bijplakt ben je al VEEL beter bezig.
Wat bvb wel kan is factuurNR als primary key: dit komt nl wel op de factuur en is een gestructureerd veld wat in realiteit gebruikt wordt: 2005011635 heeft een vatbare betekenis zowel voor jou als de boekhouding als voor je DB.
ID is altijd het best gebruikt als verwijssleutel.

jij wou normaliseren? dit is een deel van het normaliseren. ik kan niet geloven dat je dit op school gehad hebt, als je zo'n simpele fout maakt als met ID veldjes :'( |:(
Bij het gebruik van ID's worden je tabellen veel kleiner. Als je een klant in een andere tabel gebruikt en je heb een ID als sleutel voor een klant, dan komt in die tabel maar 1 getal te staan. Als je daarentegen een paar strings als sleutel heb voor een klant, dan komt er veel meer informatie in die andere tabel te staan.
Bovendien gaat het zoeken daardoor ook veel sneller.

Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 15:15

Johnny

ondergewaardeerde internetguru

@HIGHGuY jij praat echt bullshit, naast wat Daos al zegt over performance mag je facturen tegenwoordig niet meer nummeren zoals je dat zelf wel leuk lijkt:
Hoe moeten facturen genummerd worden?
Op dit moment bestaat alleen de wettelijke verplichting om elke factuur een nummer te geven. Deze eis wordt aangevuld met de verplichting om facturen te nummeren volgens een oplopende reeks.

Aangezien er geen gaten in de reeks mogen zitten, moeten facturen dus altijd uitgereikt worden. Eventuele correcties moeten met aparte facturen gerealiseerd worden. Bijvoorbeeld een credit-factuur om het hele bedrag op nul te stellen, plus een nieuwe factuur met het juiste bedrag.
Bron: http://www.webbink.nl/pag...lastingnieuws-dec2003.htm

Let op; dit stuk komt uit 2003, en deze regels zijn inmiddels al weer meer dan een jaar geleden ingevoerd.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Daos schreef op zondag 16 januari 2005 @ 13:32:
[...]
Bij het gebruik van ID's worden je tabellen veel kleiner. Als je een klant in een andere tabel gebruikt en je heb een ID als sleutel voor een klant, dan komt in die tabel maar 1 getal te staan. Als je daarentegen een paar strings als sleutel heb voor een klant, dan komt er veel meer informatie in die andere tabel te staan.
Bovendien gaat het zoeken daardoor ook veel sneller.
lees eens wat'k zeg:
HIGHGuY schreef op zondag 16 januari 2005 @ 12:40:
ID is altijd het best gebruikt als verwijssleutel.
en daarmee bedoel ik dat het OK is om ID veldjes te gebruiken om vanuit ANDERE tabellen naar te verwijzen... als candidate-key natuurlijk...
ik praat geen bullshit, ik praat enkel concreet voorbeeld, of het nu juist is of niet: I don't care... en daarbij jij bent wsch NL, ik ben Belg. en afaik staat op facturen die m'n broer bvb afdrukt nog altijd een factuurnummer.

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Boss
  • Registratie: September 1999
  • Laatst online: 16:31

Boss

+1 Overgewaardeerd

HIGHGuY schreef op zondag 16 januari 2005 @ 18:28:
[...]
ik praat geen bullshit, ik praat enkel concreet voorbeeld, of het nu juist is of niet: I don't care... en daarbij jij bent wsch NL, ik ben Belg. en afaik staat op facturen die m'n broer bvb afdrukt nog altijd een factuurnummer.
En weet jouw broer dan bij het aanmaken van een record in zijn tabel (en dus bij het genereren van de primary key) ook meteen wat het bijbehorende factuurnummer wordt?

Afhankelijk van de opbouw van je database zal je dat namelijk meestal niet weten. Van een factuur worden vaak eerst andere gegevens opgeslagen (orderbon, werkbriefjes, net wat je in je DB hebt staan).

En dat je factuurnummers doorlopend moet nummeren is opzich niet nieuw. Wel dat de nummers doorlpoend moeten zijn (dus niet bijv alleen even nummers zodat je later nog iets tussen kan stoppen).

Ook bij klanten-tabellen in een autonummer veld ideaal als primary key, geen van de redenen die jij hebt om het niet te doen komen bij mij logisch over.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Acties:
  • 0 Henk 'm!

  • ProCal
  • Registratie: Juni 2001
  • Laatst online: 31-08-2023
HIGHGuY schreef op zondag 16 januari 2005 @ 12:40:

jij wou normaliseren? dit is een deel van het normaliseren. ik kan niet geloven dat je dit op school gehad hebt, als je zo'n simpele fout maakt als met ID veldjes :'( |:(
Je kan ook ff normaal reageren, knecht. Ben je loops ofzo? Kijk nog even goed op pagina 1 en 2. Daar zijn mensen, die zijn op een normale manier behulpzaam. Dat jij niet gelooft dat ik deze zooi op school heb gehad kan me niet verrotten. Ik vraag niet voor niets hulp. En daarbij: Ik zei in mn eerste post nog dat een hoop alweer is weggevallen.

Wellicht haal ik me met deze reactie de woede van een aantal mensen en die van jou op de hals, dat kan me echter niet zo veel schelen. Van jou hoef ik geen hulp als je op deze manier reageert.

:X

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

misschien had jij een slechte dag wanneer je't las, maar ik was eerder 'verontwaardigd' dan 'boos' of zo...

en @Boss:
factuurnummer was slechts een voorbeeld om aan te tonen dat een numeriek veld zeker als primary key kan gebruikt worden als het een daadwerkelijke betekenis heeft. maar als je daarover valt, kan'k er zeker nog enkele geven:
- chassisnummer van auto's
- studentenkaart-nummers
- identiteitskaart-nummers
enz...

en ik heb reeds een argument gegeven, en ik geef het nogmaals:
wanneer je jouw database na 1 jaar eens 'echt' gaat normaliseren, of laten we het voorbeeld geven van migratie naar een ander systeem (nieuwe software/DBMS etc), dan kom jij zwaar in de problemen:
dan krijg je dingen als:
code:
1
2
3
4
ID     Naam            Straat              telefoon
123    Jan met de Pet  Petstraat 15        +3112345781
321    met de Pet, Jan JanStraat 11        +3287654321
541    met de Pet Jan  Petstraat 11        +3287654321


en dan wil ik jou eens horen vloeken.
ik maak het zelf mee dat door luiheid bij het opstellen van de DB van de oorspronkelijke programmeurs er nu problemen zijn met het migreren naar een genormaliseerde DB.
Steek dan aub meer tijd in het goed uitwerken van een genormaliseerde DB, en kwak niet zomaar even een autonummering als primary key bij de DB. (dit is een pleidooi, en geen verwijt)

splits dus naam in familienaam en voornaam, neem die 2 samen als primary key (evt met nog een veld om zeker te zijn van uniciteit) en gebruik je autonummering vanuit andere tabellen als verwijssleutel.

op die manier heb je een echt genormaliseerd stuk.

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

Anoniem: 127584

Anoniem: 115240 schreef op zaterdag 15 januari 2005 @ 17:01:
Dat zou je kunnen maar daar moet je mee oppassen!

van leveranciers heb je nog wel wat meer info nodig dan over klanten. Bijvoorbeeld het btw-nummer of zijn ondernemingsnummer enzovoort. Dat heb je bij je klanten niet.
Tegenwoordig heb je van klanten ook het BTW nummer nodig. (Dient op de faktuur te staan)
Maar daarnaast, kun je kiezen om de adressen in een gecentraliseerde database te bewaren en de overige gegevens apart. Zeker als je meerdere locaties en contactpersonen wilt ondersteunen is dat wel zo handig.
Dus een leverancierstabel die enkel de adresgegevens van die leverancier bij houdt is ook niet alles en die gegevens zou ik eigenlijk juist wel samenvoegen.

Maar dit is natuurlijk diep triest.
HIGHGuY schreef op zondag 16 januari 2005 @ 12:40:
8)7
sorry voor caps maar:
GEBRUIK ALS PRIMARY KEY ALTIJD EEN (SAMENGESTELDE) SLEUTEL DIE UNIEK IS.
en het LIEFST: waar mogelijk iets wat vatbaar is in de reele wereld.
Dit gaat lijnrecht in wat ik als goed gebruik database ontwerp beschouw. (En nog sterker, als iemand bij mij zoiets ontwerpt, is dat zijn eerste en laatste dag als database ontwerper) Wat mij betreft zijn er een paar basisregels:
- Probeer samengestelde sleutels te vermijden
- MAAR VOORAL: Probeer de key onafhankelijk te maken van de data die daadwerkelijk in de tabel staat.

De redenen lijken mij duidelijk.Samengestelde keys zijn vaak lastig en als ik bv iemands naam "Jan Met De Pet" als key gebruik en die persoon verandert zijn naam in Jan Met De Pet BV heb ik een groot probleem. Dan mag ik ook alle child records gaan updaten.

En dan nog beweren dat zoiets onderdeel is van normaliseren :(

Dan komt HighGuy ook nog met dit voorbeeld aan.

code:
1
2
3
4
ID     Naam            Straat              telefoon
123    Jan met de Pet  Petstraat 15        +3112345781
321    met de Pet, Jan JanStraat 11        +3287654321
541    met de Pet Jan  Petstraat 11        +3287654321


Jan met de Pet, met de Pet, Jan en met de Pet Jan zijn alle drie ook uniek als de naam als key gebruikt wordt! Normaliseren lost foutieve invoor nooit en te nimmer op. Dan ga ik er nog even niet van uit dat vader en zoon Van de Pet bij elkaar in de straat wonen.

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Anoniem: 127584 schreef op dinsdag 18 januari 2005 @ 00:55:
Maar dit is natuurlijk diep triest.
[...]
Dit gaat lijnrecht in wat ik als goed gebruik database ontwerp beschouw. (En nog sterker, als iemand bij mij zoiets ontwerpt, is dat zijn eerste en laatste dag als database ontwerper) Wat mij betreft zijn er een paar basisregels:
- Probeer samengestelde sleutels te vermijden
- MAAR VOORAL: Probeer de key onafhankelijk te maken van de data die daadwerkelijk in de tabel staat.

De redenen lijken mij duidelijk.Samengestelde keys zijn vaak lastig en als ik bv iemands naam "Jan Met De Pet" als key gebruik en die persoon verandert zijn naam in Jan Met De Pet BV heb ik een groot probleem. Dan mag ik ook alle child records gaan updaten.

En dan nog beweren dat zoiets onderdeel is van normaliseren :(
je snapt m'n bedoeling niet...
samengestelde keys zijn helemaal niet lastig. en ik zeg er ook nog bij dat je een andere candidate key (ID veldje met autonummering) moet gebruiken om vanuit andere tabllen te verwijzen.

bvb:
code:
1
2
ID   voornaam     familienaam              straat        nummer        telefoonnummer
123  Jan          met de Pet               PetStraat     15           +3112345781

met als primary key: voornaam + familienaam
(ik zei hiervoor ook al: eventueel met nog een extra veld om de kans op dubbels te vermijden bvb nog telefoonnummer, of wanneer de toepassing het toelaat: geboortedatum of iets dergelijks)

en dan vanuit tabel aankopen bvb:
code:
1
2
ID          klantID           ArtikelID        hoeveelheid    Datum
101         123               512              5              18/1/2005


ID binnen tabel klanten is in dit geval een candidate key, maar geen primary key.
en aan wie nog wil vitten: dit is ook slecht ontwerp wat'k net gaf want dit zou willen beteken dat 1 klant slechts 1 artikel tegelijk zou kunnen kopen. maar dat even terzijde.
- MAAR VOORAL: Probeer de key onafhankelijk te maken van de data die daadwerkelijk in de tabel staat.
wat wil je hiermee zeggen??
zoals ik het begrijp doel jij erop om
code:
1
ID  chassisnummer    Merk  Model  Kleur    Nummerplaat

om hierin ID als primary key te zetten?
terwijl zowel chassisnummer en Nummerplaat een goed alternatief zouden zijn, aangezien die een werkelijke betekenis hebben (in real life) en ze beiden uniek zijn??
Dan komt HighGuy ook nog met dit voorbeeld aan.

code:
1
2
3
4
ID     Naam            Straat              telefoon
123    Jan met de Pet  Petstraat 15        +3112345781
321    met de Pet, Jan JanStraat 11        +3287654321
541    met de Pet Jan  Petstraat 11        +3287654321


Jan met de Pet, met de Pet, Jan en met de Pet Jan zijn alle drie ook uniek als de naam als key gebruikt wordt! Normaliseren lost foutieve invoor nooit en te nimmer op. Dan ga ik er nog even niet van uit dat vader en zoon Van de Pet bij elkaar in de straat wonen.
net wel.

door naam te splitsen in familienaam en naam
door straat te splitsen in straat en nummer
krijg je geen 'samengestelde' veldjes meer. die dingen handelen uit de tijd van de lekkere horizontaal-ontwerp-DBF's...
dan krijg je dingen als:
code:
1
2
3
id   nr  naam                straat                     gemeente                       telefoon                dummy1                               dummy2
15   16  Jan Met de Pet      Petstraat 15 bus a         1000 brussel (marollen)      +32123456, +3248471245 neit te bereiken op zondag     15/1/1974
120  140 met de Pet, Jan     JanStraat 11               8000 Brugge                  +3248471245 +32154871 niet te bereiken op zaterdag    15/1/1974

probeer dit maar eens te normaliseren.
wanneer je ontwerp zoals dit doet:
code:
1
id  voornaam familienaam straat nummer woonplaatsID  telefoon  GSM   geboortedatum opmerkingen

eventueel kun je telefoonnummers nog in een aparte tabel stoppen (ttelefoonnummer als primary, ID als candidate key) en dan met een koppeltabel de link leggen tussen persoon 15 en telefoonnummers 17/18
wanneer je hierin de 2de maal Jan(voornaam) met de Pet (familienaam) wil invoeren krijg je meteen de melding dat een persoon met die naam al bestaat (als je software daarin op een correcte manier voorziet) en dan kun je die persoon z'n gegevens aanpassen.

[ Voor 40% gewijzigd door H!GHGuY op 18-01-2005 11:42 ]

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:15

Creepy

Tactical Espionage Splatterer

Maar kan het voorkomen dat een chassisnummer veranderd? (gestolen auto's e.d. ;) ). Kan het voorkomen dat een nummerplaat verandert? (ja, met import/export) Zo ja, dan moet je ook al je FK's in de andere tabellen gaan aanpassen zodra deze veranderen.

Iets wat met dat extra ID als PK nooit nodig zou zijn. Die ID bestaat er alleen voor om zo relaties met andere tabellen te kunnen gebruiken. Vandaar de tip: Hou je ID betekenisloos!

[ Voor 19% gewijzigd door Creepy op 18-01-2005 11:33 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Creepy schreef op dinsdag 18 januari 2005 @ 11:31:
Maar kan het voorkomen dat een chassisnummer veranderd? (gestolen auto's e.d. ;) ). Kan het voorkomen dat een nummerplaat verandert? (ja, met import/export) Zo ja, dan moet je ook al je FK's in de andere tabellen gaan aanpassen zodra deze veranderen.

Iets wat met dat extra ID als PK nooit nodig zou zijn. Die ID bestaat er alleen voor om zo relaties met andere tabellen te kunnen gebruiken. Vandaar de tip: Hou je ID betekenisloos!
ok, maar de dingen die je aanhaalt zijn natuurlijk 'extreme' gevallen...
een chassisnummer zou de beste keuze zijn in dit geval, aangezien bvb niet elke auto een nummerplaat heeft etc. maar wel een chassisnummer.
en als er met het chassisnummer gefoefeld is zullen ze die auto uit roulatie halen, maw ze gaan dit bij de diensten die instaan voor het bijhouden van chassisnummers niet in hun DB gaan aanpassen dat chassisnummer XYZ nu bij auto ABC hoort...

wanneer je nu echter ID als PK neemt, dan kun je 30 auto's met chassisnummer XYZ invoeren, en geen mens die er ooit om maalt: dus nogmaals:
ID enkel als candidate key om naar te verwijzen vanuit andere tabellen (verwijssleutel) en chassisnummer als PK

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 13:24
wanneer je nu echter ID als PK neemt, dan kun je 30 auto's met chassisnummer XYZ invoeren, en geen mens die er ooit om maalt
Dan gooi je er maar een unique index overheen. Dat gaat al over de technische implementatie en is niet echt relevant voor het punt wat je maakt.

Stel: Er wordt een tikfout gemaakt in het chassisnummer. De medewerker voegt dit toe aan de db en wil het later corrigeren. In jouw geval moet ik dan alle relaties op gaan zoeken met betrekking tot dat chassisnummer om vervolgens al deze records te gaan updaten? Als ik gewoon een apart ID zou gebruiken is dat probleem niet meer aanwezig.

Mocht je bang zijn dat er bijvoorbeeld op een afgedruk op papier het foute nummer gebruikt is door de fout van de medewerker zou je de tabel zelfs historisch op kunnen zetten.

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

djluc schreef op dinsdag 18 januari 2005 @ 14:38:
[...]
Dan gooi je er maar een unique index overheen. Dat gaat al over de technische implementatie en is niet echt relevant voor het punt wat je maakt.

Stel: Er wordt een tikfout gemaakt in het chassisnummer. De medewerker voegt dit toe aan de db en wil het later corrigeren. In jouw geval moet ik dan alle relaties op gaan zoeken met betrekking tot dat chassisnummer om vervolgens al deze records te gaan updaten? Als ik gewoon een apart ID zou gebruiken is dat probleem niet meer aanwezig.

Mocht je bang zijn dat er bijvoorbeeld op een afgedruk op papier het foute nummer gebruikt is door de fout van de medewerker zou je de tabel zelfs historisch op kunnen zetten.
nee, je snapt het nog altijd niet.
er wordt nog altijd gerefereerd naar het ID veldje, wat ik maar blijf herhalen.
je hoeft dan maar op 1 plaats het chassisnummer te vervangen namelijk in de tabel waar ze staat. Je kunt altijd een PK veranderen zolang ze geen dubbel vormt. en vanuit andere tabellen refereer je nog altijd met autoID (-> ID uit tabel). alleen is dit een candidate key en geen PK. de PK is nl het chassisnummer.

en een unique index eroverheen gooien is al helemaal geen oplossing... het kan je probleem voorkomen, maar het is niet 'de juiste manier van werken'.
want dan maak jij ID PK, en chassisnummer candidate key.
je vergeet dat data = gegevens + BETEKENIS
en net die betekenis geef je eraan door o.a. je PK juist te kiezen.

[ Voor 14% gewijzigd door H!GHGuY op 18-01-2005 16:29 ]

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 13:24
Je bedoeld eigenlijk dus te zeggen dat je het id veldje niet meer primary key wilt noemen maar candidate key? Is dat alles?

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

djluc schreef op dinsdag 18 januari 2005 @ 16:29:
Je bedoeld eigenlijk dus te zeggen dat je het id veldje niet meer primary key wilt noemen maar candidate key? Is dat alles?
_/-\o_ :o

inderdaad ja...
niet zomaar een ID veldje met autonummering erbij gooien en dit op PK zetten, maar een goeie PK kiezen en ID gebruiken als candidate key om te refereren vanuit andere tabellen. bespaart je veel problemen EN het is zorgen voor een genormaliseerde DB met betekenis

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

Anoniem: 25556

Nofi hoor, maar sinds wanneer moet de PK een betekenis hebben? Dat kan ik nergens in mijn boeken over normaliseren terugvinden?

In 'koppetabellen' (tabellen ontstaan door n:m relaties) is geen ID veld nodig, maar in alle andere tabellen is het domweg het verstandigst om een van de data onafhankelijk (autogenummerd) ID veld te gebruiken, en die ook als PK te zetten, temeer daar je 'm in andere tabellen als FK zult gebruiken. Niets in alle regels van normalisatie zegt dat dit niet mag, of onverstandig is.

Verder zie ik hierboven ergens gezegd worden dat autonummering redundantie in de hand werkt, die mag mij uitgelegd worden, want dat verband zie ik echt niet.

Als laatste.. een mierenneukpuntje, maar waarom zou je de tabelnaam nog weer laten terugkomen in alle veldnamen?

Acties:
  • 0 Henk 'm!

Anoniem: 127584

Langzaam begint het wat duidelijker te worden. Zelfs Highway wil dus wel graag een ID veld erbij gooien om te koppelen, maar dat veld niet als PK gebruiken. Hij vindt dat de PK een betekenis moet hebben.

Dat zo'n ontwerp uiteindelijk niet veel anders is dan een PK op het autoinc veld en een business rule op de combi van Voornaam, Achternaam of Chassisnummer of Kenteken lijkt nog niet helemaal doorgedrongen te zijn. Persoonlijk vind ik dat je Business rules (Uniekheid van het kenteken) moet controleren je door unique constraints of indexen aan te maken en dus niet via de PK. Business rules kunnen namelijk in de loop der tijd veranderen. Iets wat in een bepaalde situatie uniek is hoeft dat later niet meer te zijn.

Ook blijf ik zijn voorbeeld met namen niet snappen. De tabel
code:
1
2
3
4
ID    Voornaam  Achternaam  Adres              Tel
1     Jan            Klaasen        Klaasenlaan 1  +311234567890
2     Jan            Klaasen        Klaasenlaan 1  +311234567890
3     Jan            Klaasen        Pietenlaan 2   +311234567891

hoeft namelijk geen fouten te bevatten. Het kan toevallig zo zijn dat de familie klaasen nogal honkvast is en niet echt creatief met de naamgeving. Highway noemt dat "extreme gevallen" maar mijn ervaring is dat in een grote database er altijd een paar "extreme gevallen" zullen zijn. Een PK met Voornaam, Achernaam, Tel hoeft dus geen uniek record op te leveren terwijl je dat op het eerste gezicht wel zou verwachten. Een goed database ontwerp is daar op voorbereid. Een slecht ontwerp niet.

Maar goed het enige voordeel van zijn manier van werken kan zijn dat bepaalde databases de tabel standaard in de volgorde van de PK opslaan zodat het zoeken op de PK sneller is dan op een secundaire key. De meeste goede databases laten je echter kiezen welke key je daarvoor wilt gebruiken. Vaak wil je daar dus de key voor gebruiken die koppelt naar child tabellen. Die link zul je waarschijnlijk het meest gebruiken en daar haal je dus de meeste performance winst.
Dit is echter eigenlijk helemaal niet relevant in deze discussie want het aanpassen van het ontwerp aan de gebruikte database valt bij mij onder optimalisatie niet onder normaliseren. Als PK wil ik dus iets zien wat op basis van het DB design uniek moet zijn. Niet iets dat enkel bij correcte invoer uniek is en waarvan de uniekheid door een externe partij bepaald wordt.

Acties:
  • 0 Henk 'm!

Anoniem: 25556

Bijkomend feit is ook nog eens dat je performance er behoorlijk onder kan lijden. Voorbeeld, je wilt een join doen over twee grote tabellen. Indien je netjes gebruik gemaakt hebt van unieke ID's, kan je database dat doen over een index die bestaat uit louter één (ID) veld. Dat een index opgebouwd uit één veld compacter is dan een index opgebouwd uit meerdere velden, waartussen ook nog eens varchar velden, behoeft geen uitleg.

Ik begrijp echt niet waarom hij zo vel uit de hoek komt tegen iets wat domweg BETER is dan hetgeen hij voorstelt.

Verder wil ik wel eens een voorbeeld van de 'problemen' die een ID veld kan brengen, al dan niet auto-genummerd.

constraints is the way to go, niet complexe PK's opbouwen omdat je het idiote idee hebt dat je PK iets moet betekenen voor een einduser.

[ Voor 20% gewijzigd door Anoniem: 25556 op 19-01-2005 05:51 ]


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Anoniem: 25556 schreef op dinsdag 18 januari 2005 @ 16:40:
Nofi hoor, maar sinds wanneer moet de PK een betekenis hebben? Dat kan ik nergens in mijn boeken over normaliseren terugvinden?

In 'koppetabellen' (tabellen ontstaan door n:m relaties) is geen ID veld nodig, maar in alle andere tabellen is het domweg het verstandigst om een van de data onafhankelijk (autogenummerd) ID veld te gebruiken, en die ook als PK te zetten, temeer daar je 'm in andere tabellen als FK zult gebruiken. Niets in alle regels van normalisatie zegt dat dit niet mag, of onverstandig is.

Verder zie ik hierboven ergens gezegd worden dat autonummering redundantie in de hand werkt, die mag mij uitgelegd worden, want dat verband zie ik echt niet.

Als laatste.. een mierenneukpuntje, maar waarom zou je de tabelnaam nog weer laten terugkomen in alle veldnamen?
het MOET geen betekenis hebben, maar wanneer het KAN is het mooi meegenomen en aangeraden om dit te doen.

dat je een ID nodig hebt in koppeltabellen zeg ik niet.
zomaar een ID als PK 'OMDAT JE HEM VANUIT ANDERE TABELLEN ALS FK WIL GEBRUIKEN' is volgens mij nog altijd ronduit idioot. ID is en blijft een candidate key en kan daardoor evengoed, zelfs zonder dat ie PK is voor dat doel gebruikt worden.

ik laat helemaal niet de tabelnaam in veldnamen terug komen. enkel bij een foreign key kan dit handig zijn: klantID is foreign key in tabel aankopen bvb.

ik typ even rechtstreeks over uit m'n cursus:
- superkey: een verzameling van 1 of meer attributen die uniek is voor elke rij
- candidate key: een minimale/irreducible superkey
- primary key: de kandidaatsleutel gekozen om rijen uniek te identificeren. hoewel er meerdere candidta sleutels kunnen zijn is er maar 1 de primaire.
- verwijssleutel: verzameling van 1 of meer attributen verwijzend naar een kandidaatsleutel van een tabel. is zelf GEEN sleutel maar verwijst naar een sleutel

Keuze van primaire sleutels:
- kies een sleutel die een werkelijke betekenis heeft (dit zal als een vloek klinken bij nogal wat DBA's)
- voer dus niet zomaar een nummering in om een primaire sleutel te hebben (tenzij deze nummering ook in de werkelijkheid wordt doorgedrukt)
- je kunt altijd een sleutel vooropstellen, desnoods alle attributen samen.
- een artificiele sleutel vermijd het gebruik van samengestelde verwijssleutels en maakt sleutellengte data-anofhankelijk
- een artificiele sleutel alleen lost het uniciteitsprobleem niet op maar verlegt het (een artificiele kandidaatsleutel kan echter nuttig zijn)
- het legendarische veld ID en types zoals autonummering zijn nuttig maar gevaarlijk voor de onwetende
- neem de meest waarschijnlijke sleutel

1ste normaalvorm (slechts gedeeltelijk)
- attributen zijn atomair
2de normaalvorm (slechts gedeeltelijk)
- een relatie staat in 2NF als 1NF voldaan is en niet-sleutel attributen volledige afhankelijk zijn van de primaire sleutel. of maw elk niet-sleutel attribuut is Volledige FA van een kandidaatsleutel)
- Het is duidelijk dat 2NF automatisch voldaan is wanneer de primaire sleutel enkelvoudig is (singleton). helaas is dit vaak een verdediging van de mensen die artificiele primaire sleutels maken. noem het eerder een slecht excuus. of nog, meestal/vaak zijn primaire sleutels niet enkelvoudig.

--- tot daar de theorie.
Jij wou normaliseren. volgens mijn cursus staat jouw DB nog niet eens in de eerste normaalvorm. Daarvoor moet je zoals ik zei het veld "naam" splitsen in "voornaam" en "familienaam".
om in 2de normaalvorm te geraken, zet je ID als candidate key op autonummering en kies je een goeie primary key.
Anoniem: 127584 schreef op woensdag 19 januari 2005 @ 00:39:
Langzaam begint het wat duidelijker te worden. Zelfs Highway wil dus wel graag een ID veld erbij gooien om te koppelen, maar dat veld niet als PK gebruiken. Hij vindt dat de PK een betekenis moet hebben.

Dat zo'n ontwerp uiteindelijk niet veel anders is dan een PK op het autoinc veld en een business rule op de combi van Voornaam, Achternaam of Chassisnummer of Kenteken lijkt nog niet helemaal doorgedrongen te zijn. Persoonlijk vind ik dat je Business rules (Uniekheid van het kenteken) moet controleren je door unique constraints of indexen aan te maken en dus niet via de PK. Business rules kunnen namelijk in de loop der tijd veranderen. Iets wat in een bepaalde situatie uniek is hoeft dat later niet meer te zijn.

Ook blijf ik zijn voorbeeld met namen niet snappen. De tabel
code:
1
2
3
4
ID    Voornaam  Achternaam  Adres              Tel
1     Jan            Klaasen        Klaasenlaan 1  +311234567890
2     Jan            Klaasen        Klaasenlaan 1  +311234567890
3     Jan            Klaasen        Pietenlaan 2   +311234567891

hoeft namelijk geen fouten te bevatten. Het kan toevallig zo zijn dat de familie klaasen nogal honkvast is en niet echt creatief met de naamgeving. Highway noemt dat "extreme gevallen" maar mijn ervaring is dat in een grote database er altijd een paar "extreme gevallen" zullen zijn. Een PK met Voornaam, Achernaam, Tel hoeft dus geen uniek record op te leveren terwijl je dat op het eerste gezicht wel zou verwachten. Een goed database ontwerp is daar op voorbereid. Een slecht ontwerp niet.

Maar goed het enige voordeel van zijn manier van werken kan zijn dat bepaalde databases de tabel standaard in de volgorde van de PK opslaan zodat het zoeken op de PK sneller is dan op een secundaire key. De meeste goede databases laten je echter kiezen welke key je daarvoor wilt gebruiken. Vaak wil je daar dus de key voor gebruiken die koppelt naar child tabellen. Die link zul je waarschijnlijk het meest gebruiken en daar haal je dus de meeste performance winst.
Dit is echter eigenlijk helemaal niet relevant in deze discussie want het aanpassen van het ontwerp aan de gebruikte database valt bij mij onder optimalisatie niet onder normaliseren. Als PK wil ik dus iets zien wat op basis van het DB design uniek moet zijn. Niet iets dat enkel bij correcte invoer uniek is en waarvan de uniekheid door een externe partij bepaald wordt.
check aub nog eens mijn nick...

er is wel een wezenlijk verschil.
business rules kunnnen idd veranderen, maar als je die business rule kan veranderen, kun je evengoed je PK veranderen. Want als je met problemen komt te zitten in je data door de gewijzigde business rule, dan heb je die toch in beide gevallen. Het is niet zo dat een PK door de tijd constant is. Morgen kan idd mijn PK anders zijn.
wat jij geeft is een uitvlucht en pure luiheid.
daarenboven heb jij minstens 1 constraint/rule meer als ik wat (in beperkte mate) de performantie niet ten goede komt.

dat de data in de tabel die jij geeft niet per se fout moet zijn is juist, maar het geval wat ik gaf was bedoeld om aan te tonen dat bij slecht ontwerp 1 persoon meerdere malen in dezelfde database kan zitten, terwijl dit helemaal niet zou mogen. Daarom is normalisatie nodig.
En die extreme gevallen: als de kans 1/100000 is dat je zo'n extreem geval tegenkomt, dan is het de vraag of het echt nodig is om er rekening mee te houden. In sommige situaties is het nodig, en kun je dit oplossen door de PK uit te breiden.

ik praat over PK's, niet over indexen. In gelijk welk ontwerp kun je toch indexen toevoegen 'zoveel je wilt'. performantie voordeel daardoor is dus uitgesloten.
ik quote dit nog even extra:
Als PK wil ik dus iets zien wat op basis van het DB design uniek moet zijn. Niet iets dat enkel bij correcte invoer uniek is en waarvan de uniekheid door een externe partij bepaald wordt.
een ID met autonummering is idd ALTIJD uniek. Maar dit is enkel en alleen de easy-way om "fuck you" te zeggen tegen de personen die later iets met jouw DB moeten aanvangen.
En dat het deels steunt op correcte invoer is net een surplus.
als we even terug het geval nemen van 1 persoon die meerdere keren voorkomt in een DB
dan heb jij meer problemen als ik:
code:
1
2
3
4
5
6
7
8
9
10
11
12
ID     Naam
123   Jan met de Pet
253   met de Pet Jan
346   met de Pet, Jan
546   met de Pet, Jean
567   Jean met de Pet
874   met de Pet Jean

tegenover
ID    familienaam    voornaam
123  met de Pet     Jan
546  met de Pet     Jean

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Anoniem: 25556 schreef op woensdag 19 januari 2005 @ 05:50:
Bijkomend feit is ook nog eens dat je performance er behoorlijk onder kan lijden. Voorbeeld, je wilt een join doen over twee grote tabellen. Indien je netjes gebruik gemaakt hebt van unieke ID's, kan je database dat doen over een index die bestaat uit louter één (ID) veld. Dat een index opgebouwd uit één veld compacter is dan een index opgebouwd uit meerdere velden, waartussen ook nog eens varchar velden, behoeft geen uitleg.

Ik begrijp echt niet waarom hij zo vel uit de hoek komt tegen iets wat domweg BETER is dan hetgeen hij voorstelt.

Verder wil ik wel eens een voorbeeld van de 'problemen' die een ID veld kan brengen, al dan niet auto-genummerd.

constraints is the way to go, niet complexe PK's opbouwen omdat je het idiote idee hebt dat je PK iets moet betekenen voor een einduser.
lees aub eens al m'n posts opnieuw. het spijt me dat'k dit moet zeggen maar je hebt er nog nix van verstaan.

ik gebruik net als jij een ID veld, maar niet als PK, enkel als candidate key (en dit is al de 1542ste keer dat ik dit herhaal). deze candidate key wordt gebruikt om dan vanuit andere tabellen als verwijssleutel gebruikt te worden. mijn performantie is dus exact dezelfde als die van jou.

de PK moet nix betekenen voor de einduser. de einduser moet zelfs nix van de PK afweten. de PK moet iets betekenen voor wie de DB ontwerpt. Constraints zijn (zoals ik in m'n vorige post ook aal aangaf) the easy way out omdat je te lui bent een goeie PK te kiezen. Ik hou constraints liever om domeinen te bepalen, om foute gegevens te detecteren, etc...

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

Anoniem: 25556

HIGHGuY schreef op woensdag 19 januari 2005 @ 11:30:
het MOET geen betekenis hebben, maar wanneer het KAN is het mooi meegenomen en aangeraden om dit te doen.
waarom? wat is het voordeel? Waarom is het aangeraden?
dat je een ID nodig hebt in koppeltabellen zeg ik niet.
Ik zeg ook niet dat jij dat zegt.
ik laat helemaal niet de tabelnaam in veldnamen terug komen. enkel bij een foreign key kan dit handig zijn: klantID is foreign key in tabel aankopen bvb.
Dat was ook niet tegen jou gericht, maar tegen de TS, welke dat wel heeft.
Keuze van primaire sleutels:
- kies een sleutel die een werkelijke betekenis heeft (dit zal als een vloek klinken bij nogal wat DBA's)
- voer dus niet zomaar een nummering in om een primaire sleutel te hebben (tenzij deze nummering ook in de werkelijkheid wordt doorgedrukt)
Wat voor cursus hebben we het hier over? Ik bovenstaande adviezen niet terug vinden in m'n HBO Software Engineering boeken?
Jij wou normaliseren. volgens mijn cursus staat jouw DB nog niet eens in de eerste normaalvorm. Daarvoor moet je zoals ik zei het veld "naam" splitsen in "voornaam" en "familienaam".
Eh, ik ben de TS niet hoor.. ik weet wat normaliseren is, en ben bekend met normaalvormen.
business rules kunnnen idd veranderen, maar als je die business rule kan veranderen, kun je evengoed je PK veranderen. Want als je met problemen komt te zitten in je data door de gewijzigde business rule, dan heb je die toch in beide gevallen. Het is niet zo dat een PK door de tijd constant is. Morgen kan idd mijn PK anders zijn.
Waarom klooien met een samengestelde PK die je moet wijzigen als je business rules wijzigen, als je ook gewoon een autonummering ID veld kunt gebruiken? Je PK ligt dan voor eens en voor altijd gelijk vast.

Afgezien van 'ik vind dat dat zo hoort' zie ik je geen enkele daadwerkelijke reden geven waarom het gebruik van een ID fout is. Jij vind het lui en aan te raden een samengestelde PK te gebruiken.

Daarnaast wil ik je op iets anders wijzen. Als jij je PK legt over een samenstelling van velden, en daarnaast alsnog een uniek ID nummer toevoegt, is je database niet meer genormaliseerd. Je hebt dan namelijk twee velden met dezelfde functie, één record uniek identificeren.

Geheel nofi, maar het toevoegen van een ID veld met als doel 'm als FK te gaan gebruiken, maar ondertussen toch een PK leggen over een samenstelling van andere velden, is gewoon ronduit smerig imo.

Bij je voorbeeld mbt. tot een persoon die meerdere keren voorkomt zit het probleem niet in de gekozen PK, maar in het feit dat je voorbeeld (Zoals je zelf ook al aangeeft) niet genormaliseerd is.

[ Voor 12% gewijzigd door Anoniem: 25556 op 19-01-2005 12:15 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 13:24
Dit is gewoon zeuren over een verschil in naamgeving. Of je het nou primary key noemt of candidate key noemt kan me nou echt niet veel schelen. Het gaat er om of je database opzet goed functioneerd en klopt volgens de normalisatieregels zodat het een goed onderhoudbare collectie data wordt. Om hier nu 2 pagina's te gaan lopen discussieren over hoe je dat ID veldje wilt noemen 8)7

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Mijn cursus is een eigen samengestelde cursus van mijn docent.
Eh, ik ben de TS niet hoor.. ik weet wat normaliseren is, en ben bekend met normaalvormen.
was net als die van jou tegen de TS bedoeld.
Anoniem: 25556 schreef op woensdag 19 januari 2005 @ 12:12:
Waarom klooien met een samengestelde PK die je moet wijzigen als je business rules wijzigen, als je ook gewoon een autonummering ID veld kunt gebruiken? Je PK ligt dan voor eens en voor altijd gelijk vast.
een PK hoeft niet voor eens en voor altijd vast te liggen. waarom zou dat WEL moeten??
een PK is niet meer dan een keuze van de meest geschikte candidate key om je rijen uniek te definieren. Als de attributen wijzigen in je DB is het maar normaal dat je candidate keys en PK eventueel ook wijzigen.
Afgezien van 'ik vind dat dat zo hoort' zie ik je geen enkele daadwerkelijke reden geven waarom het gebruik van een ID fout is. Jij vind het lui en aan te raden een samengestelde PK te gebruiken.
ik zei al: data = gegevens + betekenis.
weet jij veel welke klant ID 12456 is??? terwijl ik al meer kan zeggen over "Jan met de Pet"
net door een goeie PK te kiezen geef je meer betekenis aan je DB.
Daarnaast wil ik je op iets anders wijzen. Als jij je PK legt over een samenstelling van velden, en daarnaast alsnog een uniek ID nummer toevoegt, is je database niet meer genormaliseerd. Je hebt dan namelijk twee velden met dezelfde functie, één record uniek identificeren.
mijn DB is nog 100% toppie genormaliseerd als ik een ID autonummering veld invoeg om te gebruiken als foreign key vanuit andere tabellen.
elke tabel heeft MINSTENS 1 candidate key, en als je even teruggaat naar wat'k uit m'n cursus quote is een candidate key niet meer dan een minimale superkey. Er is helemaal GEEN probleem mee dat een tabel meerdere candidate keys heeft.
Geheel nofi, maar het toevoegen van een ID veld met als doel 'm als FK te gaan gebruiken, maar ondertussen toch een PK leggen over een samenstelling van andere velden, is gewoon ronduit smerig imo.
dit zou meer regel dan uitzondering hoeven te zijn imo... het zorgt ervoor dat je een mooi uitziende PK hebt, en tegelijk de functionaliteit/performantie van een lui systeem met ID als PK behoudt

[ Voor 7% gewijzigd door H!GHGuY op 19-01-2005 13:14 ]

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

Anoniem: 25556

HIGHGuY schreef op woensdag 19 januari 2005 @ 13:11:
een PK hoeft niet voor eens en voor altijd vast te liggen. waarom zou dat WEL moeten??
Ik zeg ook niet dat het perse moet, maar het kan wel. Dat is een voordeel van het gebruik van een ID als PK. Je ziet, het heeft voordelen.
ik zei al: data = gegevens + betekenis.
weet jij veel welke klant ID 12456 is??? terwijl ik al meer kan zeggen over "Jan met de Pet"
Waarom zou ik moeten kunnen zeggen wie klant ID 12456 is, leg me dat eens uit? Waarom moet ik op basis van de PK iets over de data kunnen zeggen, wat is het voordeel daarvan. Noem me een praktijksituatie waarin dat voordelig is.
mijn DB is nog 100% toppie genormaliseerd als ik een ID autonummering veld invoeg om te gebruiken als foreign key vanuit andere tabellen.
elke tabel heeft MINSTENS 1 candidate key, en als je even teruggaat naar wat'k uit m'n cursus quote is een candidate key niet meer dan een minimale superkey. Er is helemaal GEEN probleem mee dat een tabel meerdere candidate keys heeft.
Je DB is dus niet meer genormaliseerd. Je hebt immers redundante gegevens, je ID veld is overbodig geworden door het toevoegen van een andere PK. De enige reden waarom je dat ID toevoegt is vanwege gemak en performance. Je denormaliseert dus vanwege performance. Ja een tabel mag meerdere candidate keys bevatten, maar niet als een of meer van die keys geen andere betekenis hebben dan key alleen.

Immers: je hebt al een wijze om een veld uniek te selecteren, en je kunt die key ook als FK gebruiken. Er is dus geen reden meer voor een ID veld, anders dan performance. Het ID veld is dan dus redundant.
dit zou meer regel dan uitzondering hoeven te zijn imo... het zorgt ervoor dat je een mooi uitziende PK hebt, en tegelijk de functionaliteit/performantie van een lui systeem met ID als PK behoudt
Een PK hoeft er niet mooi uit te zien, of betekenis te hebben. Een PK is niet bedoeld om aan de muur te hangen of om naar te kijken en te denken 'wat is ie mooi'. Een PK moet een record uniek identificeren, en dat is precies wat een ID veld doet.

Verder heb je nog steeds geen echt technisch argument gegeven waarom een ID veld niet goed is.

[ Voor 4% gewijzigd door Anoniem: 25556 op 19-01-2005 13:51 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:15

Creepy

Tactical Espionage Splatterer

HIGHGuY schreef op dinsdag 18 januari 2005 @ 11:50:
[...]


ok, maar de dingen die je aanhaalt zijn natuurlijk 'extreme' gevallen...
een chassisnummer zou de beste keuze zijn in dit geval, aangezien bvb niet elke auto een nummerplaat heeft etc. maar wel een chassisnummer.
en als er met het chassisnummer gefoefeld is zullen ze die auto uit roulatie halen, maw ze gaan dit bij de diensten die instaan voor het bijhouden van chassisnummers niet in hun DB gaan aanpassen dat chassisnummer XYZ nu bij auto ABC hoort...

wanneer je nu echter ID als PK neemt, dan kun je 30 auto's met chassisnummer XYZ invoeren, en geen mens die er ooit om maalt: dus nogmaals:
ID enkel als candidate key om naar te verwijzen vanuit andere tabellen (verwijssleutel) en chassisnummer als PK
[laat, ik weet het ;)]
Het is misschien een "extreem" geval, maar vertrouwe me maar als ik zeg dat het gegarandeerd een keer gaat voorkomen als je syteem wat groter word!
Daarnaast, knal een UNIQUE constraint op het chasiss nummer en klaar. Dat een kolom geen PK is wil niet zeggen dat die kolom niet uniek kan zijn ;)

Je PK gebruik je juist om naar te verwijzen vanuit andere tabellen. ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Anoniem: 25556 schreef op woensdag 19 januari 2005 @ 13:50:
Ik zeg ook niet dat het perse moet, maar het kan wel. Dat is een voordeel van het gebruik van een ID als PK. Je ziet, het heeft voordelen.
helemaal geen voordeel. want waar ik m'n PK moet aanpassen, moet jij je constraint aanpassen.
en oh daar staan we plots even ver
Waarom zou ik moeten kunnen zeggen wie klant ID 12456 is, leg me dat eens uit? Waarom moet ik op basis van de PK iets over de data kunnen zeggen, wat is het voordeel daarvan. Noem me een praktijksituatie waarin dat voordelig is.

Een PK hoeft er niet mooi uit te zien, of betekenis te hebben. Een PK is niet bedoeld om aan de muur te hangen of om naar te kijken en te denken 'wat is ie mooi'. Een PK moet een record uniek identificeren, en dat is precies wat een ID veld doet.
code:
1
2
3
4
5
6
7
ID     opmerking1                 opmerking2
1      data                       gegevens + betekenis
2      gegevens + betekenis       data
3      data - gegevens            betekenis
4      data - betekenis           gegevens
5      0                          data - gegevens - betekenis
6      data - geg - betekenis     0

heb'k mezelf duidelijk gemaakt?

en daarbij: het doel van een CK is om een record uniek te beschrijven. de PK is slechts de keuze van 1 van de CK's. En daarbij geef je best de voorkeur aan een PK die iets zinnigs/vatbaars is.
Je DB is dus niet meer genormaliseerd. Je hebt immers redundante gegevens, je ID veld is overbodig geworden door het toevoegen van een andere PK. De enige reden waarom je dat ID toevoegt is vanwege gemak en performance. Je denormaliseert dus vanwege performance. Ja een tabel mag meerdere candidate keys bevatten, maar niet als een of meer van die keys geen andere betekenis hebben dan key alleen.

Immers: je hebt al een wijze om een veld uniek te selecteren, en je kunt die key ook als FK gebruiken. Er is dus geen reden meer voor een ID veld, anders dan performance. Het ID veld is dan dus redundant.
als ik ID als PK neem is ID evenzeer redundant. aangezien er een candidate key bestaat die de gegevens evenzeer uniek bepaalt.
of met FA's:
ID|PK -> rest van gegevens
CK -> rest van gegevens

ID|CK -> rest van gegevens
PK -> rest van gegevens

in beide gevallen is volgens jouw theorie de DB niet meer genormaliseerd. je hebt echter ID (wat jij dan zelfs nog PK maakt) niet eens NODIG om je gegevens uniek te bepalen. ik denk dat mijn 'fout' om ID als CK/FK te gebruiken minder erg is dan die van jou om ID dan meteen ook nog PK te maken.
Verder heb je nog steeds geen echt technisch argument gegeven waarom een ID veld niet goed is.
misschien moeten we't dan maar even omdraaien. ik kwam mss in m'n eerste post niet netjes over, waardoor jullie me beginnen afkraken zijn, maar ok:
geef dan jullie onderbouwde argumenten om net wel ID als PK te kiezen. jullie komen volgens mij niet eens aan 'esthethische' argumenten.
Creepy schreef op woensdag 19 januari 2005 @ 13:57:
[laat, ik weet het ;)]
Het is misschien een "extreem" geval, maar vertrouwe me maar als ik zeg dat het gegarandeerd een keer gaat voorkomen als je syteem wat groter word!
Daarnaast, knal een UNIQUE constraint op het chasiss nummer en klaar. Dat een kolom geen PK is wil niet zeggen dat die kolom niet uniek kan zijn ;)

Je PK gebruik je juist om naar te verwijzen vanuit andere tabellen. ;)
dat zo'n extreem geval kan voorkomen is idd juist. daarom zeg'k er ook bij dat je dan evt je PK moet uitbreiden.

een unique constraint over iets knallen is volgens mij maar een plakkertje op het bloeden.
dat een kolom geen pk moet zijn om uniek te zijn weet'k heus wel ;)

en een PK is NIET enkel en alleen gemaakt om te gebruiken als verwijssleutel.
gelijk welke CK is bruikbaar als verwijssleutel.

[ Voor 23% gewijzigd door H!GHGuY op 19-01-2005 15:18 ]

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

Anoniem: 25556

HIGHGuY schreef op woensdag 19 januari 2005 @ 15:12:
misschien moeten we't dan maar even omdraaien. ik kwam mss in m'n eerste post niet netjes over, waardoor jullie me beginnen afkraken zijn, maar ok:
geef dan jullie onderbouwde argumenten om net wel ID als PK te kiezen. jullie komen volgens mij niet eens aan 'esthethische' argumenten.
Heel simpel. Als je vaak databases ontwerpt, weet je dat er veel situaties zijn waarin er in de data zelf domweg geen CK of PK te vinden is. Denk hierbij aan een NAW tabel, zoals hierboven al vaker gesuggereerd kan het voorkomen dat alle gegevens identiek zijn. Ik ben nog niet zo lang geleden zelfs tot mijn verbazing een tweeling tegengekomen met dezelfde initialen en die op hetzelfde adres woonden.

Gevolg is dat je meeste tabellen een ID veld zullen bevatten, wat PK is en als FK gebruikt wordt in andere tabellen. Een paar tabellen zullen een CK bevatten die uit de gegevens bestaat, die doe je dan zonder ID veld. Weg is je uniformiteit in je datamodel.

Je uitleg waarom een PK inzicht zou moeten geven in de gegevens, kan ik geen chocola van maken. Noem nou eens een praktijkvoorbeeld waarin je er daadwerkelijk voordeel bij hebt dat je PK niet een ID veld is, maar een 'betekenisvolle' samengestelde PK?
dat zo'n extreem geval kan voorkomen is idd juist. daarom zeg'k er ook bij dat je dan evt je PK moet uitbreiden.
Volgens mij is het verstandiger om gewoon bij het ontwerpen hier rekening mee te houden, en geen constraints te leggen die niet vanuit business rules noodzakelijk zijn. Op die manier hoef ik niets te wijzigen aan mijn tabel als een onmogelijk geachte doublure van gegevens toch voorkomt, en jij wel. Overigens vind ik het wijzigen van een PK iets ingrijpender dan het wijzigen van een constraint, al was het alleen maar om dat je RDMS dan de index opnieuw moet opbouwen.
een unique constraint over iets knallen is volgens mij maar een plakkertje op het bloeden.
De unique constraint is bedoelt om dit te realiseren. Ik zie niet in hoe het een 'doekje voor het bloeden' kan zijn, als iets gebruikt wordt waar het voor bedoeld wordt. Ik vind het eerder een workaround als je iets PK gaat maken omdat je er geen unique constraint op wil zetten.
en een PK is NIET enkel en alleen gemaakt om te gebruiken als verwijssleutel.
gelijk welke CK is bruikbaar als verwijssleutel.
Volgens mij is de heersende mening dat je als FK in een andere tabel de PK uit de te koppelen tabel gebruikt. CK's hiervoor gebruiken vind ik persoonlijk gewoon smerig. Dat geeft al aan dat je niet de juiste PK gekozen hebt.

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Anoniem: 25556 schreef op woensdag 19 januari 2005 @ 15:33:
Heel simpel. Als je vaak databases ontwerpt, weet je dat er veel situaties zijn waarin er in de data zelf domweg geen CK of PK te vinden is. Denk hierbij aan een NAW tabel, zoals hierboven al vaker gesuggereerd kan het voorkomen dat alle gegevens identiek zijn. Ik ben nog niet zo lang geleden zelfs tot mijn verbazing een tweeling tegengekomen met dezelfde initialen en die op hetzelfde adres woonden.

Gevolg is dat je meeste tabellen een ID veld zullen bevatten, wat PK is en als FK gebruikt wordt in andere tabellen. Een paar tabellen zullen een CK bevatten die uit de gegevens bestaat, die doe je dan zonder ID veld. Weg is je uniformiteit in je datamodel.
als het niet kan, kan het gewoonweg niet. en dan moet je mss idd denken aan een artificiele ID/PK. maar om dat zomaar overal klakkeloos toe te passen??
wat is de kans dat je binnen NAW tabel 2 verschillende personen met zelfde naam, adres en woonplaats krijgt? ik start morgen een bedrijf, en ik begin klanten te tellen.... ik ga m'n 100.000ste klant zien, en nog ga ik zo'n geval niet tegengekomen zijn. En als het toch gebeurt, is een 1malige minder esthetische oplossing (wanneer ik zeker ben dat het niet om dezelfde persoon gaat) wel toegestaan. (en dan heb'k et bvb op extra informatie invullen.)
en daarbij: als jij een constraint zet waar ik een PK op zet zit je met hetzelfde probleem als er zich dubbels willen voordoen.
Je uitleg waarom een PK inzicht zou moeten geven in de gegevens, kan ik geen chocola van maken. Noem nou eens een praktijkvoorbeeld waarin je er daadwerkelijk voordeel bij hebt dat je PK niet een ID veld is, maar een 'betekenisvolle' samengestelde PK?
jij maakt liever gegevensbanken dan DATAbanken...
waarom is het concept PK dan in leven geroepen als je alles met CK's kan doen? een PK is een gekozen CK. Lees nog eens m'n cursusextract over eht kiezen van sleutels. aub.
Volgens mij is het verstandiger om gewoon bij het ontwerpen hier rekening mee te houden, en geen constraints te leggen die niet vanuit business rules noodzakelijk zijn. Op die manier hoef ik niets te wijzigen aan mijn tabel als een onmogelijk geachte doublure van gegevens toch voorkomt, en jij wel. Overigens vind ik het wijzigen van een PK iets ingrijpender dan het wijzigen van een constraint, al was het alleen maar om dat je RDMS dan de index opnieuw moet opbouwen.
ik leg helemaal geen constraints wanneer het niet nodig is. jullie komen af dat ik niet in het extreem geval voorzie, en dat betekent dus een slechte reeks CK's... geen slechte PK want PK is en blijft slechts een keuze van een CK.door goeie CK's te maken kun je automatisch weer een goeie PK kiezen.
De unique constraint is bedoelt om dit te realiseren. Ik zie niet in hoe het een 'doekje voor het bloeden' kan zijn, als iets gebruikt wordt waar het voor bedoeld wordt. Ik vind het eerder een workaround als je iets PK gaat maken omdat je er geen unique constraint op wil zetten.

Volgens mij is de heersende mening dat je als FK in een andere tabel de PK uit de te koppelen tabel gebruikt. CK's hiervoor gebruiken vind ik persoonlijk gewoon smerig. Dat geeft al aan dat je niet de juiste PK gekozen hebt.
Ik snap niet waarom je niet gewoon een CK met betekenis als PK wil zetten ipv zo'n nietsduidend ID veldje. ze bepalen beide uniek de gegevens, alleen heeft de ene een betekenis en de andere niet. Daarbij:
waar ik 1 PK zet + 1 sequence voor autonummering(ID) (maw 1 constraint op de PK)
heb jij 1 PK(ID) + 1 constraint voor je CK te garanderen. (maw 2 constraints)
dit is voor 1 veld *theoretisch* O(n) en dus vrij duur...

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

Anoniem: 25556

HIGHGuY schreef op woensdag 19 januari 2005 @ 16:15:
jij maakt liever gegevensbanken dan DATAbanken...
Nofi, maar :Z

Stop nu eens met er omheen draaien, en noem me nu eens dat praktijkvoorbeeld waaruit blijkt dat het in de praktijk handig is om je PK 'betekenisvol' te laten zijn..

Acties:
  • 0 Henk 'm!

Anoniem: 127584

Stille hints worden blijkbaar niet opgepakt.
er is wel een wezenlijk verschil.
business rules kunnnen idd veranderen, maar als je die business rule kan veranderen, kun je evengoed je PK veranderen. Want als je met problemen komt te zitten in je data door de gewijzigde business rule, dan heb je die toch in beide gevallen. Het is niet zo dat een PK door de tijd constant is. Morgen kan idd mijn PK anders zijn.
wat jij geeft is een uitvlucht en pure luiheid.
Hoezo luiheid? Jij voegt toch precies hetzelfde ID veld toe?
daarenboven heb jij minstens 1 constraint/rule meer als ik wat (in beperkte mate) de performantie niet ten goede komt.
Lang over nagedacht, tot ik dit vond
Daarbij:
waar ik 1 PK zet + 1 sequence voor autonummering(ID) (maw 1 constraint op de PK)
heb jij 1 PK(ID) + 1 constraint voor je CK te garanderen. (maw 2 constraints)
dit is voor 1 veld *theoretisch* O(n) en dus vrij duur...
Ik gebruik geen contrains om PKs of CK te garanderen. Iets is een CK of het is niet. In dezelfde tabel (en die hebben we!) zul je dezelfde restricties moeten hebben om te garanderen of iets een CK is. Als iets een CK is kun je het een PK noemen. Daar heb je geen contraint voor nodig.
Maar dat ik, en velen met mij, in de implementatie van de database de uniekheid van iets wat ik als CK zie garandeer, door unique constraints, gaat inderdaad ten koste van de performance. In theorie hoeft dat natuurlijk niet. Een CK is een CK, of ik dat nu controleer of niet. En ik weet, in tegenstelling tot HighGuy dat mijn PK altijd uniek is. Die heb ik namelijk zo geconstrueerd.
dat de data in de tabel die jij geeft niet per se fout moet zijn is juist, maar het geval wat ik gaf was bedoeld om aan te tonen dat bij slecht ontwerp 1 persoon meerdere malen in dezelfde database kan zitten, terwijl dit helemaal niet zou mogen.
Ik val in herhalingen, Normalisatie helpt niet tegen invoerfouten van gebruikers.
Want
1) Hoe herkent de DB het verschil tussen correcte dubbele records en incorrecte
2) Hoe herkent de DB dat deze twee records dezelfde klant zijn
1 Jaaaaan Klaaasen
2 Jan Klaasen.
En die extreme gevallen: als de kans 1/100000 is dat je zo'n extreem geval tegenkomt, dan is het de vraag of het echt nodig is om er rekening mee te houden. In sommige situaties is het nodig, en kun je dit oplossen door de PK uit te breiden.
Ik weet niet hoeveel databases jij ontworpen hebt. Maar het vernoemen van kinderen naar de ouders/grootouders is vrij normaal. Dus bij een sportvereniging kun je ervan uit gaan dat er een vader/zoon of moeder/dochter combi is die enkel op geboortedatum verschillen. Nu kun je zeggen, ik voeg het geboortedatum aan mijn PK toe. Maar wat betekent de combi van Voornaam, Achternaam, Geboortedatum? In mijn ogen niets meer dan een simpel ID.
Echt iets nuttigs over de data zegt het mij namelijk niet.
ik praat over PK's, niet over indexen. In gelijk welk ontwerp kun je toch indexen toevoegen 'zoveel je wilt'. performantie voordeel daardoor is dus uitgesloten.
Ik gaf een argument in jou voordeel (namelijk de implementatie van clustered indexen in sommige databases) en zelfs dat weet je nog af te wimpelen. Maar wat doe je dan eigenlijk wel met je PK? Je koppelt er niet mee en je wilt het niet als index gebruiken. Op een papiertje schrijven en tegen jezelf zeggen. Kijk eens wat voor mooie PK ik gevonden heb?
een ID met autonummering is idd ALTIJD uniek. Maar dit is enkel en alleen de easy-way om "fuck you" te zeggen tegen de personen die later iets met jouw DB moeten aanvangen.
En dat het deels steunt op correcte invoer is net een surplus.
als we even terug het geval nemen van 1 persoon die meerdere keren voorkomt in een DB
dan heb jij meer problemen als ik:
code:
1
2
3
4
5
6
7
8
9
10
11
12
ID     Naam
123   Jan met de Pet
253   met de Pet Jan
346   met de Pet, Jan
546   met de Pet, Jean
567   Jean met de Pet
874   met de Pet Jean

tegenover
ID    familienaam    voornaam
123  met de Pet     Jan
546  met de Pet     Jean
Hoezo, waar heb ik gezegt dat familienaam voornaam niet handiger is dan enkel een naam veld? Maar een naamveld is net zo atomair als een familienaam veld. En trouwens, ik prefereer de volgende combo voor namen.
Voorvoegsel, Voornaam, Initialen, Tussenvoegsel, Achernaam, Achtervoegsel.

Zelfde geldt voor telefoonnummers, dus kun je afhankelijk van het doel opslaan als telefoonnummer dus +31101234567 en als combo van vier velden
Landcode, Areacode, abboneenummer en extensie.
Echter bij normaliseren voldoen beide versies aan de regels De inhoud van het veld is namelijk nergens relevant voor normalisatie, net zomin als het soort veld.


Maar voor de modarators, kunnen we het topic niet hernoemen tot [ALG] Highguy bashing?

[ Voor 12% gewijzigd door Anoniem: 127584 op 19-01-2005 20:33 ]


Acties:
  • 0 Henk 'm!

Anoniem: 26306

HIGHGuY schreef op woensdag 19 januari 2005 @ 16:15:

wat is de kans dat je binnen NAW tabel 2 verschillende personen met zelfde naam, adres en woonplaats krijgt?
Als de kans groter is dan 0 dan zou je er nooit voor mogen kiezen om iets als sleutel te nemen.
Een primary key identificeert een unieke rij.

Dat is ongeveer les 1 in elk willekeurig boek over relationele databases. Wil je beweren dat dat onzin is?

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 21:08
Identifying Foreign Keys
Every dependent and category (subtype) entity in the model must have a foreign key for each relationship in which it participates. Foreign keys are formed in dependent and subtype entities by migrating the entire primary key from the parent or generic entity. If the primary key is composite, it may not be split.
bron

Oftewel elke FK moet refereren naar een PK om het systeem integer te houden. Om performance redenen kies je dus altijd de kleinste CK. En eigenlijk is een samengestelde PK dus alleen een optie als er geen enkele FK naar refereert (en het zeker is dat dit in de toekomst nooit zal gebeuren). Dan kun je immers beter een kunstmatige PK genereren.

De notie van een "betekenis" in een database snap ik btw ook niet. Zo'n ding is om gegevens (==data) in op te slaan. Het wordt pas informatie in de applicatie die gebruik maakt van de database. Neem zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
tbl users
----------
uid | naam
----------
1   | DRM
2   | Curry684
3   | .Oisyn

tbl cars
----------
cid | auto
----------
1   | Fiat Panda
2   | Ferrari F40
3   | Volvo s80
4   | Renault Twingo

tbl users_cars
----------
uid | cid
----------
1   | 2
1   | 3
2   | 1
3   | 4

Wat betekent dit nu? Dat DRM een Ferrari en een Volvo heeft? Dat hij ze graag wil hebben? Dat hij ze heeft aangereden?
Je kunt er simpelweg niets over zeggen, behalve dat er een relatie tussen Curry en een Fiat Panda bestaat. De betekenis blijft volledig afhankelijk van de context die niet in de database te vatten is.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Anoniem: 113889

Een PK geeft aan dat er iets is vastgelegd, niet wat er is vastgelegd. Een clustered index is daarom de enige juiste keuze voor een PK. Vanaf daar kan begonnen worden met optimaliseren.

Verder is redundantie zelden 0 of minimaal:
In een n-op-m relatie tussen A en B is de redundantie in de koppeltabel R 33% als deze een ID-kolom bevat als PK.
Als in een andere tabel D weer aan de relatie R gerefereerd wordt en de PK van de relatie bestaat uit (idA, idB) is de redundantie hier echter 50%. De totale redundantie in deze database is nu een functie van de tabelomvang van R en D en is in beide gevallen niet 0.

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Anoniem: 127584 schreef op woensdag 19 januari 2005 @ 20:11:
Maar voor de modarators, kunnen we het topic niet hernoemen tot [ALG] Highguy bashing?
dit is het inderdaad geworden, en dat is ook de reden waarom jullie wat ik zeg zelfs niet als 'even goed' alternatief willen zien...

jammer (voor jullie?)

deze discussie hoeft voor mij niet meer... al veel te veel tijd in gestopt.
* H!GHGuY bailing out

[ Voor 12% gewijzigd door H!GHGuY op 21-01-2005 21:18 ]

ASSUME makes an ASS out of U and ME

Pagina: 1