Database do's and dont's
Uit Yapf
Inhoud |
Do's
Gebruik zinvolle namen voor alles.
Geef niet toe aan de verleiding om korte, eenvoudige namen te gebruiken voor tabelen, kolommen, indexes, contraints etc.
Waarom: een korte naam is alleen begrijpelijk zolang de context in je hoofd zit. Bugs en problemen doen zich steevast op onverwachte moment voor, wanneer je met hele andere dingen bezig bent. Het laatste wat je dan wilt is dat je een rror krijgt die zegt dat kolom ap_gem_abs_ter_knf niet voldoet aan contraint ap_gem_constraint_4. Wat je wilt is dat de error zegt dat de kolom applicatie_gemiddelde niet voldoet aan contraint applicatiegemiddelde_niet_negatief.
Hetzelfde geldt voor indexes, wanneer je met explain aan het uitzoeken bent waarom je query zo traag is, dan wil je niet weten dat idx_1 wordt gebruikt, maar idx_lower_voornaam.
Dont's
Sommige dingen kun je in databases beter niet doen.
Casten naar INT om invoer te beveiligen.
Invoer beveiligen in een query kan *ALLEEN* door de invoer te escapen en valideren.
Iets als $a= (int)$_GET['id']; of nog erger: $a = 1*$_GET['id']; is geen beveiliging, het zijn oogkleppen. Alle invoer die niet correct kan worden geinterpreteerd wordt omgezet naar nul en de query wordt uitgevoerd alsof er nul was ingevoerd.
Het probleem hiermee is dat er nog steeds een query wordt uitgevoerd die niet doet wat je wil. Nul is niet een soort magische waarde die je zomaar kunt gaan gebruiken op het moment dat je even de juiste waarde niet weet. Wat als in jouw systeem de nul is gereserveerd voor het id van de beheerder (nul is een volkomen normale waarde in databases!) Als een hacker iets gaat proberen met het userid dan herken jij wel dat het fout is, en vervangt het vervolgens gewoon door de nul die je juist *niet* in de query wilde hebben.
Als je wilt voorkomen dat er foute waarden in je database komen, doe dat dan ook: valideer de invoer en stop de query als de invoer niet geldig is. Escapen en quoten is in dit geval dus ook beter want als er dan een term staat die geen getal is dan gaat SQL proberen om de term als string te interpreteren en dat zal nooit matchen, er is geen userid '2-1 ' of '1;DROP TABLE users;'
Voorloopnullen
Mensen gebruiken graag voorloopnullen om getallen te printen. Niemand weet waarom, want niemand tikt ze ooit in.
- Moet je voorloopnullen wel of niet opslaan in een database?
Niet. waarom niet:
- Voorloopnullen hebben binnen databases (en programmeertalenin het algemeen) geen waarde, het getal 0001 heeft de waarde 1, en dat heeft 01 ook, en 000001 ook.
- Voorloopnullen zijn presentatie, je past ze pas toe wanneer ze nodig zijn: wanneer jet het getal print voor een mens. (en mensen slaan ze vervolgens weer over want ook voor hen hebben ze geen betekenis.