frickY schreef op dinsdag 29 januari 2008 @ 08:48:
[...]
Ik prefix in camelCase.
In de tabel `producten`` zijn velden geprefixed met `product`.
Tabelnamen zijn altijd in meervouw, prefixen in enkelfout.
Bij lange tabelnamen, zoals `productcategorieen` kort ik de prefi af; `prodcat`. Het moet wel handig blijven natuurlijk.
Nooit doen. Jij denkt dat je handig bezig bent maar het is niet handig. Ten eerste gebruik je namen die JIJ handig vindt, maar die voor een ander wellicht raar over komen. Ten tweede is het steevast inconsequent, en gaat het dus op een zootje lijken na een tijdje en ten derde is het overbodig, omdat het allerlei text toevoegt die semantisch niets toevoegt. Tenzij je met een hobbyprogramma bezig bent zou ik echt kappen met dit soort dingen. Ik krijg bv kromme tenen bij het zien van 'prodcat'. Tenzij je op DB2 zit uit 1979 kan iedere database redelijk lange namen aan, dus is productcategorie de enige juiste naam die je moet geven. Ja dat is even wat meer typewerk, maar het zegt wel wat er in zit, 'prodcat' zegt nl. niets. Het kan ook productiecategory betekenen.
Als je een model zou opstellen in NIAM/ORM bv dan kom je erachter dat wat jij doet eigenlijk onzin is. Ten eerste zijn entities niet meervoud, je hebt Product, en geen Producten. Ten tweede heeft Product een attribute 'Naam' en niet 'ProductNaam', het is nl. de naam van product, niet de naam van klant.
Dus: tabelnamen: enkelvoud en niet afkorten.
veldnamen: NIET prefixen. Het veld Naam in Product is de naam van .... juist, het product. Anders krijg ik Product.ProductNaam, beetje overbodig.
Het enige waar ik over struikel is benaming van foreignkeys.
In mijn producten tabel heb ik bijvoorbeeld gewoon een `prodcatID`, de PK van de categorietabel. Maar bijvoorbeeld bij het koppelen van beeld, welke altijd uit een files tabel komt, zou ik 2x een `fileID` kolom hebben. En dan maak ik er al snel `fileID2` of `product_foto2` van,waar ik beide niet gelukkig mee ben

Waarom ben je zo bang dat je wat characters teveel moet tikken in sommige gevallen? (Terwijl je juist in andere gevallen overbodige text erbij tikt!). In je product tabel heb je een productcategorieID, prima, want dat veld stelt dat ook voor. Als je 2x een column nodig hebt voor hetzelfde is dat dus een fout in je model: je hebt dan een 1:n relatie en moet een nieuwe tabel aanmaken.
Nog even over prefixes van namen. Men is zo bang dat dat dan clashes oplevert bij projections. Tja. Je kunt velden in projections gewoon aliasen, maar veelal heb je die velden met dubbele namen niet allebei nodig want ze zijn bv hetzelfde. Ja de aliases zijn even wat extra typewerk, maar is dat erg? Wat heb je liever: dat iemand jouw code leest en er een uur over doet met giswerk wat het voorstelt, dan de foute conclusie trekt en foute code toevoegt, of jouw code leest en accuut snapt wat er bedoeld wordt?
Over de discussie van denormalisatie: men verwart vaak het fenomeen denormalisatie met een juiste vorm van normalisatie en dat die goed genoeg is en men maakt dan direct de stap om die 'normalisatievorm' direct in te voeren: waarom moeilijk doen als je daar toch eindigt, toch? De grootste fout die je kunt maken.
Les 1 van relationele datamodellen is dat je geen compromissen kunt sluiten mbt je model: je hebt OF een juist model of niet. Dat is je basis. Als na implementatie van dat model blijkt dat er hotspots zijn in het gebruik van het model en door bepaalde (!) tabellen te denormaliseren in een bepaalde vorm de performance kan worden verbeterd, dan kan op dat moment besloten worden om die maatregelen te nemen, maar dat is wat anders dan direct maar op de prutsmethode wat tabellen te gaan samenvoegen. Wanneer je delen van je juiste model gaat denormaliseren kun je bv besluiten om indexed views toe te voegen voor de hotspots, zodat je model in tact blijft. Of de data in gedenormaliseerde vorm op een aparte server te plaatsen omdat de hotspots in bepaalde reports zitten die je 1 keer per week draait.
Als je uitgaat van een juist model, dan kun je documenteren welke delen je hebt gedenormaliseerd en waarom. Waarom is dat belangrijk? Nou, om de domme reden dat wanneer je iets gaat wijzigen aan je model je dat alleen kunt doen in het correcte model, niet in je gedenormaliseerde model! De wijzigingen kunnen nl. een ander model opleveren met ANDERE hotspots en dus dat je ANDERE delen moet denormaliseren.
Echter, deze discussie is net zo oud als de zeikdiscussie over stored procs vs. dyn. sql: een gebed zonder eind.
BikkelZ schreef op dinsdag 29 januari 2008 @ 10:37:
[...]
Als je je hoofdtabel JOINt naar een steuntabel, dan wordt in bijvoorbeeld PHP de id van de hoofdtabel overschreven door die van de steuntabel, als je * gebruikt. Je kunt inderdaad ook alle velden intikken terwijl je eigenlijk * bedoelt, maar dat is ietsjes nadelig voor de performance meen ik.
Dat is dan een bottleneck in PHP, want '*' projections zijn veelal (iewat) trager dan uitgeschreven projections. Net zoals uitgeschreven tabel references MET catalog, schema, user sneller zijn dan alleen tabelnaam. Neemt niet weg dat correctheid bovenalles gaat. IEDEREEN die hoekjes afsnijdt krijgt het vroeg of laat weer als een boomerang op hem terug: hetzij dat je het later zelf moet beheren en jezelf dan vervloekt, hetzij dat je de zak krijgt wegens afleveren van prutswerk, hetzij dat het niet in dank wordt afgenomen door je collegas die jouw code moeten beheren. Wees een professional, gehobby doet men niet op het werk.
[
Voor 10% gewijzigd door
EfBe op 29-01-2008 10:41
]