Ik zit erg te twijfelen over een bepaald probleem waar ik graag wat meningen en input over zou willen hebben. Ik ben bezig met een site waar bepaalde diensten worden aangeboden. Afhankelijk van welke dienst wordt gekozen (denk hierbij aan verhuizingen, schilderen, tuinieren) komt er een vragenformulier tevoorschijn. Deze vragen sla ik op in een MySQL database die ik benader met PHP. Ik heb de topictitel 'databases' genoemd omdat (volgens mij) dit probleem niet specifiek binnen PHP/MySQL bestaat. De tabel ziet er ruwweg als volgt uit (is eigenlijk groter, maar hier alleen de nodige info);
Probleem
Het probleem waar ik nu mee zit is dat ik me afvraag hoe ik de mogelijke opties voor question_type ga opslaan in de tabel. Hoe weet ik welke mogelijkheden er zijn? Ik zie hier een aantal mogelijkheden;
Voor de question_type lijkt optie 2 me een overkill omdat er geen extra informatie nodig is zoals bij de services wel het geval is. Het voordeel van dit doen is echter wel dat het makkelijk terug te vinden is wat de opties zijn (minder makkelijk dan bij optie 1) en dat het eenvoudig is deze aan te passen. Ook is er makkelijk binnen MySQL security toe te voegen om te zorgen dat er alleen waarden worden toegevoegd die ook echt bestaan.
Optie 3 lijkt me handig omdat er geen extra tabel voor nodig is en minder ingewikkelde queries met joins (al is dat hier natuurlijk best te overzien) nodig zijn. Nadeel is wel dat er minder snel te zien is wat de opties zijn omdat je moet weten waar de array met mogelijkheden is (al zou het logisch zijn om dit in een common.php of constants.php oid. op te slaan). Wel is het, net als bij optie 2, makkelijk aan te passen. Nieuwe mogelijkheden zijn makkelijk toe te voegen.
Optie 1 geeft me om de één of andere reden gewoon een slecht gevoel. Het zou wel duidelijk zijn en het zou ook niet al te moeilijk zijn om nieuwe opties toe te voegen maar ik werk liever toch met integers. Het lijkt gewoon wat veiliger en 'cleaner'. Ik kan dit helaas niet al te goed beargumenteren.
Ik neig zelf naar optie 3, maar ook lijkt optie 4 me wel interessant al is het alleen al omdat ik nog nooit met Enums heb gewerkt binnen MySQL. Onder andere door deze post echter twijfel ik ook erg of het sowieso wel nuttig is;
http://ronaldbradford.com...r-not-to-enum-2006-01-22/
Dus
Dus mijn vraag: wie heeft hier ervaring mee? Wat is verstandig, en wat niet? Googlen naar dit probleem geeft me niets, eigenlijk vooral omdat ik de juiste keywords niet helemaal weet te vinden om iets nuttigs uit Google te halen. Wel ben ik op Tweakers de volgende topic tegengekomen maar ik hoop eigenlijk op een wat bredere discussie hierover;
[mysql] enum of een join
Wat ik namelijk ook zou willen vragen is om verder te kijken dan dit specifieke probleem en het ook wat algemener te bekijken: wanneer zou je welke optie gebruiken? Is Optie 3 de grootste bullshit ooit? Is Optie 4 de oplossing voor vrijwel alle problemen die hier op lijken? De grootste reden dat ik deze topic start is omdat ik simpelweg niets op google kan vinden, en dus hoop dat er een interessante discussie ontstaat waar niet alleen ik maar ook anderen iets aan hebben.
id | Primary Key / auto_increment |
---|---|
service_id | Type service, FK naar een andere DB |
question | De daadwerkelijke vraag |
question_type | Type vraag, bepaald hoe de input weergeven wordt (textarea, text input, checkbox, listbox/radio buttons, etc) |
question_options | Eventueel de mogelijke opties afhankelijk van het type vraag. Ik moet nog bepalen hoe ik dit precies op ga slaan (overweeg nu gewoon simpel een array te serializen) |
Probleem
Het probleem waar ik nu mee zit is dat ik me afvraag hoe ik de mogelijke opties voor question_type ga opslaan in de tabel. Hoe weet ik welke mogelijkheden er zijn? Ik zie hier een aantal mogelijkheden;
- Opslaan als text, dus bv 'text', 'fulltext' (waarbij ik met 'fulltext' aan een textarea zit te denken), 'checkbox', 'listbox' etc. Het voordeel hiervan is dat het meteen duidelijk te zien is.
- Mooier is, lijkt mij, om hier een integer op te slaan net als ik bij service_id gedaan heb. Dit linkt naar een tabel services waar informatie over de diensten is opgeslagen (bv tarieven). Bij services is het logisch om dan een aparte tabel te gebruiken omdat ik voor diensten nog veel extra informatie op moet slaan. Dat is dus de tweede optie: een integer gebruiken die linkt naar een andere tabel
- Optie 3 is om ook een integer te gebruiken, maar de mogelijkheden vervolgens in een array in PHP op te slaan. Ik zou dus iets hebben als array(1 => 'text', 2 => 'fulltext', 3 => 'checkbox' ..) waarmee ik kan zien wat het type is.
- Enums. Ik ben er nog niet helemaal achter wanneer Enums nou nuttig zijn om te gebruiken binnen MySQL. De data zit in de database zelf wat het moeilijk maakt om te bewerken wanneer nodig.
Voor de question_type lijkt optie 2 me een overkill omdat er geen extra informatie nodig is zoals bij de services wel het geval is. Het voordeel van dit doen is echter wel dat het makkelijk terug te vinden is wat de opties zijn (minder makkelijk dan bij optie 1) en dat het eenvoudig is deze aan te passen. Ook is er makkelijk binnen MySQL security toe te voegen om te zorgen dat er alleen waarden worden toegevoegd die ook echt bestaan.
Optie 3 lijkt me handig omdat er geen extra tabel voor nodig is en minder ingewikkelde queries met joins (al is dat hier natuurlijk best te overzien) nodig zijn. Nadeel is wel dat er minder snel te zien is wat de opties zijn omdat je moet weten waar de array met mogelijkheden is (al zou het logisch zijn om dit in een common.php of constants.php oid. op te slaan). Wel is het, net als bij optie 2, makkelijk aan te passen. Nieuwe mogelijkheden zijn makkelijk toe te voegen.
Optie 1 geeft me om de één of andere reden gewoon een slecht gevoel. Het zou wel duidelijk zijn en het zou ook niet al te moeilijk zijn om nieuwe opties toe te voegen maar ik werk liever toch met integers. Het lijkt gewoon wat veiliger en 'cleaner'. Ik kan dit helaas niet al te goed beargumenteren.
Ik neig zelf naar optie 3, maar ook lijkt optie 4 me wel interessant al is het alleen al omdat ik nog nooit met Enums heb gewerkt binnen MySQL. Onder andere door deze post echter twijfel ik ook erg of het sowieso wel nuttig is;
http://ronaldbradford.com...r-not-to-enum-2006-01-22/
Dus
Dus mijn vraag: wie heeft hier ervaring mee? Wat is verstandig, en wat niet? Googlen naar dit probleem geeft me niets, eigenlijk vooral omdat ik de juiste keywords niet helemaal weet te vinden om iets nuttigs uit Google te halen. Wel ben ik op Tweakers de volgende topic tegengekomen maar ik hoop eigenlijk op een wat bredere discussie hierover;
[mysql] enum of een join
Wat ik namelijk ook zou willen vragen is om verder te kijken dan dit specifieke probleem en het ook wat algemener te bekijken: wanneer zou je welke optie gebruiken? Is Optie 3 de grootste bullshit ooit? Is Optie 4 de oplossing voor vrijwel alle problemen die hier op lijken? De grootste reden dat ik deze topic start is omdat ik simpelweg niets op google kan vinden, en dus hoop dat er een interessante discussie ontstaat waar niet alleen ik maar ook anderen iets aan hebben.