Laatste post op forumindex
Op mijn forum heb ik een forumindex met alle categorieën, subcategorieën en de laatste topic waarin gereageerd is per subcategorie.
Nu nog maak ik gebruik van één aparte query per subcategorie om te kijken in welk topic het laatst gereageerd is en deze vervolgens te tonen ter plaatse van de bijbehorende subcategorie.
Het aantal queries op deze pagina (forumindex) is daarom best hoog (momenteel 70 queries op deze pagina (doordat er wel 70 subcategorieën zijn)). Dit wil ik graag reduceren. Maar ik ben er nog niet echt achter wat de beste methode is om dit te doen.
Is het wellicht verstandig om een view te maken voor de forumindex pagina, zodat met één query alle items voor de forumindex opgehaald kunnen worden?
Mijn databasestructuur voor het forum is als volgt:
forum_cats (alle categorieën)
forum_subcats (alle subcategorieën)
forum_topics (id,titel,datum,etc.)
forum_posts (alle gegevens van de berichten in de topic)
Hebben jullie tips om dit efficiënter aan te pakken?
Gewijzigd op 06/10/2010 22:51:56 door Arjan -
Arjen - op 06/10/2010 22:51:12:
(...)
Mijn databasestructuur voor het forum is als volgt:
forum_cats (alle categorieën)
forum_subcats (alle subcategorieën)
forum_topics (id,titel,datum,etc.)
forum_posts (alle gegevens van de berichten in de topic)
Hebben jullie tips om dit efficiënter aan te pakken?
Mijn databasestructuur voor het forum is als volgt:
forum_cats (alle categorieën)
forum_subcats (alle subcategorieën)
forum_topics (id,titel,datum,etc.)
forum_posts (alle gegevens van de berichten in de topic)
Hebben jullie tips om dit efficiënter aan te pakken?
Volgens mij is jou db structuur niet zo.
Verder moet je je afvragen of je subcategorieën in een aparte tabel wilt.
De rest wijst zich hopelijk vanzelf ;)
Ook vraag ik me af waarom er een verschil moet zijn tussen topics en posts? Als je een topic aanmaakt, kun je toch voor alle volgende posts een veldje toevoegen?
oftewel:
POST
post_id,
isTopic ( set '0','1' )
parent_id
Parent_id krijgt dus de post_id mee voor het topic waar op gereageerd wordt. Dit mag natuurlijk alleen als die POST dus ook een isTopic gelijk aan 1 is.
Verder krijgt elke POST toch ook een ID mee, net als een titel en Datum? Waar titel optioneel is?
Volgens mij hoef je dit verder niet echt te abstraheren. Er is verder niets unieks aan een topic, dus als het enige verschil dus id, titel en datum is, zou ik het gewoon in 1 tabel zetten.
Maar een topic heeft een titel, geeft aan of een topic gesloten is of een sticky betreft, etc.
Dus een topic heeft wel degelijk andere eisen. Het eerste bericht in een topic is eigenlijk niets anders dan een normale post in deze topic, vandaar dat ik topic en posts heb gescheiden.
Overigens dwalen jullie een beetje af van mijn vraag, want mijn vraag blijft nog gewoon staan. Hoe kan ik het beste per subcategorie het laatst gereageerde topic tonen, zonder daarvoor bij elke subcategorie een nieuwe query te moeten maken?
Hij zegt namelijk dat je de 2 tabellen moet samenvoegen en er 1 ouder id aan toe moet voegen.
Kijk anders even in het andere topic daar gaan ze namelijk in op precies dezelfde vraag.
Ook bij het verwijderen van een topic kan je nu eenvoudig alle berichten verwijderen middels een foreign key, wat in het geval van 1 tabel niet mogelijk is (je kan wel de parentid opvragen en deze allemaal verwijderen, maar dat is (iets) omslachtiger).
Maar dit gaat allemaal niet over mijn beginvraag. Dat de topics los staan van de categorieën lijkt mij logisch, dus de beginvraag staat nog steeds.....
Jullie gaan in op het normaliseren (op mijn manier is het ook een vorm van normaliseren) van de tabellen, maar daar vroeg ik volgens mij niet naar.
Gewijzigd op 07/10/2010 12:52:26 door Arjan -
Maar dat bedoel ik je niet, even kijken: je wil 1 query welke er voor zorgt dat je een overzicht krijgt van alle (recente) posts van elke categorie.
Dus zou je in een categorie een veldje moeten maken waar de datum instaat van het laatst geposte bericht.
dus:
Categorie:
INT cat_id,
VARCHAR naam,
INT ouder_id,
TIMESTAMP laatste_post
Nu kun je er makkelijk door heen lussen. Je kunt het ook anders doen ,maar dan moet je alle posts bij na, filteren op zowel datum alsook categorie, wat de query niet ten goed komt.
Ik had zelf ook gedacht aan jouw oplossing alleen kleeft er een groot nadeel aan, namelijk wanneer de moderator de laatste reactie binnen een topic verwijderd dan kloppen de gegevens niet meer en moeten dus de gegevens van de een na laatste post worden opgehaald en geplaatst worden in de tabel met categorieen.
Ik dacht zelf om 1 query te maken die alle laatste berichten binnen de subcategorieen ophaalt. Vervolgens controleer ik per subcategorie of er relevante waarde in de teruggekregen array zit. Is dit in jullie ogen een goede oploasing? Hierdoor heb je maar 1 extra query nodig.