Ik ben bezig om een klein forum te implementeren in mijn cms om zodoende meer backoffice activiteiten online te zetten.
Nu heeft mysql een aantal grote beperkingen zoals het niet ondersteunen van subselects enz. Nu heb ik de source van verschillende fora door gekeken en zie dat deze eigenlijk niet geheel volgens de normaalvormen zijn opgebouwd. Als ik het goed gedaan heb zou het db model er ongeveer zo uit moeten zien.
De tabellen zullen altijd meer info bevatten maar het gaat om het idee
Aan de hand van dit basis model kan je in wezen alle informatief herleiden. Dus om een index te maken zoals op got zul je alle tabellen moeten aanspreken om de forum naam, omschrijving, aantal posts, aantal reply's en lastpost datum/tijd te verkrijgen. Nu zie je bij verschillende fora dat informatie als aantal posts, reply's en lastpost time zijn opgenomen als een kolom in je db.
Dit heeft een aantal reden die ik zo kan bedenken;
- Query's worden een stuk eenvoudiger
- DB belasting is lager door minder joins en/of subselects
- MySQL heeft geen subslects.
Als gevolg hiervan is je db model dus niet opgebouwd volgens de noormaal vormen omdat je rekenvelden opneemt in je db. Verder worden ander acties zoals een topic move of post delete een stuk complexer en kan dus leiden tot foutieve data in je db.
Nu ik ds zelf bezig ben zie ik dus een aantal problemen, ik heb dus redleijk volgens de normaalvormen een db opzet gemaakt en loop dus tegen problemen aan als het niet ondersteuen van subselects. Nu kan je hier redelijk omheen werken door joins te gebruiken wat dus opzich niet zo'n probleem is. Maar zie bijvoorbeeld de volgende query; doe is het verkrijgen van een overzicht van alle topics binnin een bepaalde tijd, eerst gesorteerd op status dan op lastpost time. Als uitkomst moeten er dus info als status, topictitel, lastposttime en id, aantal replyl's enz worden opgehaald.
Gevolg is dat door de group by niet de lastpost maar de firstpost wordt geselecteerd.
Terwijl de sortering wel goed gaat op lastpost. Maar dat terzijde, het gaat om het voorbeeld.
Mijn vraag is dan ook, laat je de normaalvormen vallen en ga je voor eenvoudigere query's die je de juiste informatie geven maar weer niet zorgen voor een waterdicht db model. Of kies je juist voor een zo perfect mogelijk model, waarbij je dus in het geval van MySQL tegen zeer irritante zaken aanloopt.
Ik weet dat geavanceerdere RDBMS'en wel ondersteuning bieden voor transacties, subselect en wat ever maar helaas is de werkelijkheid zo dat voor veel van dit soort zaken gebruik wordt gemaakt van MySQL, dus reply's over andere RDBMS'en hebben dan ook weinig nut, aangezien het hier vooral over MySQL gaat.
Nu heeft mysql een aantal grote beperkingen zoals het niet ondersteunen van subselects enz. Nu heb ik de source van verschillende fora door gekeken en zie dat deze eigenlijk niet geheel volgens de normaalvormen zijn opgebouwd. Als ik het goed gedaan heb zou het db model er ongeveer zo uit moeten zien.
| Fora | Topic | Post | ||
| Forum_id | Topic_id | Post_id | ||
| Naam | Forum_id | Topic_id | ||
| Omschrijving | Topic titel | Post |
De tabellen zullen altijd meer info bevatten maar het gaat om het idee
Aan de hand van dit basis model kan je in wezen alle informatief herleiden. Dus om een index te maken zoals op got zul je alle tabellen moeten aanspreken om de forum naam, omschrijving, aantal posts, aantal reply's en lastpost datum/tijd te verkrijgen. Nu zie je bij verschillende fora dat informatie als aantal posts, reply's en lastpost time zijn opgenomen als een kolom in je db.
Dit heeft een aantal reden die ik zo kan bedenken;
- Query's worden een stuk eenvoudiger
- DB belasting is lager door minder joins en/of subselects
- MySQL heeft geen subslects.
Als gevolg hiervan is je db model dus niet opgebouwd volgens de noormaal vormen omdat je rekenvelden opneemt in je db. Verder worden ander acties zoals een topic move of post delete een stuk complexer en kan dus leiden tot foutieve data in je db.
Nu ik ds zelf bezig ben zie ik dus een aantal problemen, ik heb dus redleijk volgens de normaalvormen een db opzet gemaakt en loop dus tegen problemen aan als het niet ondersteuen van subselects. Nu kan je hier redelijk omheen werken door joins te gebruiken wat dus opzich niet zo'n probleem is. Maar zie bijvoorbeeld de volgende query; doe is het verkrijgen van een overzicht van alle topics binnin een bepaalde tijd, eerst gesorteerd op status dan op lastpost time. Als uitkomst moeten er dus info als status, topictitel, lastposttime en id, aantal replyl's enz worden opgehaald.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| SELECT forum_topic.titel, forum_topic.status, forum_topic.lid_id, forum_topic.forum_id, forum_topic.forum_topic_id, forum_post.pdt, forum_post.deleted, forum_post.lid_id, forum_post.forum_topic_id, forum_post.forum_post_id , leden.lid_id, leden.voornaam, leden.tussenvoegsel, leden.achternaam, leden.functie, count(forum_post.forum_post_id) as reply FROM forum_topic LEFT JOIN leden ON forum_topic.lid_id = leden.lid_id LEFT JOIN forum_post ON forum_topic.forum_topic_id = forum_post.forum_topic_id WHERE forum_topic.forum_id = '$fid' AND forum_post.deleted = 'N' AND forum_post.pdt > '$dts' GROUP BY forum_post.forum_topic_id DESC ORDER BY forum_topic.status ASC, forum_post.pdt ASC; |
Gevolg is dat door de group by niet de lastpost maar de firstpost wordt geselecteerd.
Mijn vraag is dan ook, laat je de normaalvormen vallen en ga je voor eenvoudigere query's die je de juiste informatie geven maar weer niet zorgen voor een waterdicht db model. Of kies je juist voor een zo perfect mogelijk model, waarbij je dus in het geval van MySQL tegen zeer irritante zaken aanloopt.
Ik weet dat geavanceerdere RDBMS'en wel ondersteuning bieden voor transacties, subselect en wat ever maar helaas is de werkelijkheid zo dat voor veel van dit soort zaken gebruik wordt gemaakt van MySQL, dus reply's over andere RDBMS'en hebben dan ook weinig nut, aangezien het hier vooral over MySQL gaat.
buit is binnen sukkel