forum programmeren

Gestart doorRogier8 reacties43 weergaven

9 berichten · pagina 1 van 1

Rogier

Lid · Topicstarter

Berichten
6.485
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Hey iedereen,

Voor een klant ben ik nu bezig met het programmeren van een forum.

Ik ben al eind op weg (zit nu al iets van 15 uur in). Ik bouw het in een door de klant al zelf ontwikkeld mvc framework die al over de hele site draait.

Ik heb eigenlijk een vrij simpele vraag aan de wat gevorderde programmeurs hier. Wat zijn de "dos" en "donts" van een forum? Ik heb het systeem zelf al een helemaal uitgedacht.

Waar ik tegen aanloop is bijvoorbeeld is het quoten. Het lijkt me nogal vervelend om een omgekeerde UBB class te maken in javascript. Maar is het dan handig om een ajax pagina te maken die het in JSON terugstuurt? Hebben jullie nog andere oplossingen?

Er komt overigens geen ongelezen/gelezen systeem. (de klant vond het geen €100 waard toen ik zei dat ik er 10 uur voor uit wilde trekken).

Rogier
0
Berichten
1.284
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Dos:
Berichten systeem
UBB
Rate systeem
Refferals
Likes (een topic liken)

Donts:
(idk)
0
Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
Rogier schreef:
Waar ik tegen aanloop is bijvoorbeeld is het quoten. Het lijkt me nogal vervelend om een omgekeerde UBB class te maken in javascript. Maar is het dan handig om een ajax pagina te maken die het in JSON terugstuurt? Hebben jullie nog andere oplossingen?
Maar je slaat de berichten toch plain (zoals ze zijn ingevoerd) + verwerkt (geparsed door je UBB parser) op?
Dan koppel je het plain-bericht gewoon aan de quote-knop zodat je helemaal geen extra request nodig hebt.
Je kan het wel met een extra request doen, maar dan heb je dus alsnog geen omgekeerde parser nodig.

De grootste do: optimaliseer de boel meteen al. Zorg dus dat je zware queries cachet waar dat kan, zorg dat het aantal queries niet verandert als er meer forums/topics/posts worden toegevoegd, doe een stresstest op de boel om te kijken hoe hij presteert als er duizenden berichten in zitten en een X aantal bezoekers per seconde moet bewerken, dan zie je meteen welke queries het zwaarst zijn en kun je die ook optimaliseren.
0
Rogier

Lid · Topicstarter

Berichten
6.485
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
@Lennard:
Ik sla berichten nu op als voor de UBB parse. Want dan is het nog goed mogelijk om de berichten aan te passen.

Anders moet je voor het aanpassen weer een omgekeerde parser gebruiken. Dus mij lijkt de enige optie een ajax request die een bericht in JSON ophaalt.

Jij zegt dus eigenlijk dat ik gewoon een query met heel veel joins enzo moet gebruiken om te voorkomen dat er meer querys komen?

@Mounssif: Tja het gaat iets meer om de technische eigenschappen van het systeem.
0
Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
Rogier schreef:
@Lennard:
Ik sla berichten nu op als voor de UBB parse. Want dan is het nog goed mogelijk om de berichten aan te passen.

Anders moet je voor het aanpassen weer een omgekeerde parser gebruiken. Dus mij lijkt de enige optie een ajax request die een bericht in JSON ophaalt.
Je kan de berichten toch tweemaal opslaan? Geparsed en origineel?
Je database wordt er een stuk groter van maar dan hoeft je parser niet elke post bij elke pageview opnieuw te parsen.
Rogier schreef:
Jij zegt dus eigenlijk dat ik gewoon een query met heel veel joins enzo moet gebruiken om te voorkomen dat er meer querys komen?
Nouja, uiteraard wel je queries zo simpel mogelijk houden, en soms is 2 queries beter dan 1 huge query, maar ik bedoelde meer dat je niet zoiets moet gaan doen:
[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/while"]while[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$forum[/COLOR] [COLOR= #007700]= ...)
{[/COLOR]

  [COLOR= #0000BB]$aantal[/COLOR] [COLOR= #007700]=[/COLOR] [URL="http://www.php.net/mysql_query"]mysql_query[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]"SELECT COUNT(1) AS aantal FROM forum_topics WHERE forum_id = "[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$forum[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]id[/COLOR][COLOR= #007700]]);[/COLOR]
  [COLOR= #0000BB]$aantal[/COLOR] [COLOR= #007700]=[/COLOR] [URL="http://www.php.net/mysql_fetch_assoc"]mysql_fetch_assoc[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$aantal[/COLOR][COLOR= #007700]);[/COLOR]

  [URL="http://www.php.net/echo"]echo[/URL] [COLOR= #0000BB]$aantal[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]aantal[/COLOR][COLOR= #007700]].[/COLOR][COLOR= #DD0000] topics in dit forum<br />[/COLOR][COLOR= #007700];

}[/COLOR]


@Mounssif: Tja het gaat iets meer om de technische eigenschappen van het systeem.[/quote]

toevoeging op 5 februari 2013, 181647:
En soms is het goed om wat te denormaliseren.
Een post staat in een topic, een topic in een forum, en een forum in een categorie.
In theorie kun je dus als je een post-id hebt al nagaan in welke categorie hij staat, maar dat kost je wel een aantal subqueries/joins. Als je dat denormaliseert door het forum_id en categorie_id meteen al in je posts-tabel op te slaan heb je dat veel sneller bij de hand.

En zo ook met totalen (aantal berichten in een forum enzo), etc.
0
Rogier

Lid · Topicstarter

Berichten
6.485
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Ja dat laatste had ik zelf ook al bedacht, ik geef elk bericht een topic, message en board id mee.

Ik heb nu deze query:

"SELECT * FROM forum_boards ORDER BY board_category"


SELECT 
    m.board_id, 
    m.topic_id, 
    m.message_author, 
    m.message_id,
    u.username, 
    t.topic_title 
FROM 
    forum_messages as m, 
    forum_topics as t, 
    users as u  
WHERE 
    m.message_author = u.id AND
    m.topic_id = t.topic_id AND
    m.board_id = ".$row[board_id]."
ORDER BY m.message_id 
DESC LIMIT 1


De 2de wordt het aantal dat de eerste teruggeeft uitgevoerd. Hoe zou jij die dan samenvoegen?

Nu al bedankt voor je hulp!
0
Berichten
20.364
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Best wel handig, hier heb ik ook wat aan smile@lennard
0
Rogier

Lid · Topicstarter

Berichten
6.485
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Ik sla dingen als topic berichtencoutn trouwens ook in het topic op, want bij het posten is iets langer wachten minder erg dan bij pagina laden. Dus liever een update query extra dan een ingewikkelde zware select query.
0
Berichten
308
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Rogier schreef:
Ja dat laatste had ik zelf ook al bedacht, ik geef elk bericht een topic, message en board id mee.

Ik heb nu deze query:
"SELECT * FROM forum_boards ORDER BY board_category"


SELECT 
    m.board_id, 
    m.topic_id, 
    m.message_author, 
    m.message_id,
    u.username, 
    t.topic_title 
FROM 
    forum_messages as m, 
    forum_topics as t, 
    users as u  
WHERE 
    m.message_author = u.id AND
    m.topic_id = t.topic_id AND
    m.board_id = ".$row[board_id]."
ORDER BY m.message_id 
DESC LIMIT 1


De 2de wordt het aantal dat de eerste teruggeeft uitgevoerd. Hoe zou jij die dan samenvoegen?

Nu al bedankt voor je hulp!

Waarom gebruik je geen gefilterde joins zoals INNER JOIN , wat bij dit voorbeeld het best zou zijn.

Nu importeer je sowieso alle rijen van die drie tabellen. En filter je later pas je data d.m.v. je WHERE-Clause. Dat is dus zwaarder dan de te filteren data al op voorhand te verminderen.

Een db-engine werkt als volgt.

1. Er wordt naar de FROM-clause gekeken welke tabellen hij moet importeren.
2. Er wordt naar de WHERE-clause gekeken om de specifieke rijen op te halen.
3. Eventuele andere filter clauses zoals GROUP BY, HAVING, ...
4. Er wordt naar een eventuele LIMIT-clause gekeken om het aantal rijen te beperken.
5. Er wordt naar de SELECT-clause gekeken om de specifieke velden op te halen.

Zon query kan indien je veel rijen hebt je db serieus overbelasten. Ik spreek uit ervaring waarbij ik via n gelijkaardige query MySQL voor 5 min heb platgelegd.
0

Jouw reactie

Deel je idee, stel een vraag of help een ander verder.

Editor laden…

Praat mee met de One2xs-community.

Inloggen om te reageren