[MySQL] threaded reactiesysteem

Pagina: 1
Acties:

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 10-05 16:53
Ik ben bezig met een threaded reactiesysteem, gebruik makend van PHP en MySQL. Het probleem dat ik heb gaat over de langzaamheid (aantal queries) voor het opbouwen van de reactie-boom (reactie-op-reactie), net zoals bij T.net.


Ik heb in een grijs verleden volgens mij ooit een uitgebreide thread hierover op GoT gezien, maar kan deze niet meer vinden (ruim half huur lopen searchen). Op dit moment maak ik gebruik van recursieve selects, dus veel queries, dus tamelijk traag. Ik wil dit versnellen, maar weet niet hoe.

Iemand ideeen of een link naar de thread die ik niet vinden kan? Alvast bedankt.

  • Engineer
  • Registratie: Juni 2001
  • Laatst online: 04-05 00:03

Engineer

Software

Was je al zover? :)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
mysql_connect("localhost","","");
mysql_select_db("testzooi");

$messages_query = mysql_query("SELECT * FROM notes");

print("<table border=1>");
while($messages=mysql_fetch_array($messages_query)){
$userid = $messages[userid];
$message = $messages[message];

$users_query = mysql_query("SELECT * FROM users WHERE id = $userid");
$users=mysql_fetch_array($users_query);

$username = $users[name];

print("<tr><td>$username</td><td>$message</td></tr>");
}
print("</table>");
?>

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hier gaat het ook over bomen:

[topic=234350/1/25]

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 10-05 16:53
Ik was al zover dat ik een recursieve functie printChildren($post_id) gebruik waarin ik voor elk bericht alle kindjes weergeef. Probleem is dat ik voor ELK bericht mysql query moet uitvoeren om uit te zoeken wat zijn kindjes zijn.

De vraag is: hoe kan ik met zo weinig mogelijk queries toch een boom bouwen? Dat heb ik nog niet echt gevonden. Of kan het simpelweg niet anders met een mysql database?

Verwijderd

Stel, op de eerste pagina laat je de eerste 40 berichten zien. Kun je dan niet met 1 query de eerste 40 berichten ophalen, die op een slimme manier in het geheugen gooien (cachen dus). En dan vanuit het geheugen die boom opbouwen?

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

in jsp heb ik ooit hetzelfde gedaan met 1 query. Het principe is heel erg simpel.

Je maakt een object Bericht. die heeft de variabelen inhoud, nr, en Children, parent.

nu lees je de resultaten uit de database in en die zet je stuk voor stuk in een (eigen) object. Deze objecten voeg je toe aan een array. (ik gebruikte een hashMap voor het snel vinden, en omdat volgorde in de array toch niet van belang is)
Nu controlleer je voor dat object of hij een parent heeft. Als hij een parent heeft zoek je die parent op in de array en roep je daar addChild() aan.

Als het geen parent's heeft is het een root object. Deze sla je ook ergens anders op.

Als je nu klaar bent met je resultset. Dan begin je recursief je objcecten door te lopen beginnend bij je root object.. je roept seeds getChildren aan, die steeds een array van lengte 0 of meer teruggeeft..

Zo bouw je met maar 1 query, een threaded reactiesysteem op.

Verwijderd

Kun je niet een querie bouwen zoals dit:
pseudo
code:
1
2
3
4
PLEUR databases Users en Content bij elkaar 
en Pak uit gejoinde db een root_object met ID=$ID
en alle reacties waar reactie_op=$ID
 en alle users waar author=$userID

En laat php uitzoeken wat wat is.
Kijk eens in de manual bij join en distinct ofzoiets.
Weetik ervan.

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 10-05 16:53
Oke, het is inderdaad wel een idee om alle reacties in PHP in te lezen (met 1 query) en vervolgens PHP de boom laten bouwen. Maar, wat doe je in het (hypothetische :?) geval als een bepaalde reactie-boom duizenden reacties bevat?

Laat eigenlijk ook maar. Tegen de tijd dat dat eraan zit te komen kom ik er nog wel eens op terug ;) Caching zou dan een oplossing kunnen zijn, bijvoorbeeld de boom alleen opnieuw genereren als er een nieuwe reactie geplaatst wordt.

Klein vraagje nog: zou PHP er niet net zo lang over doen als een hoop keer MySQL queries uitvoeren?

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 21-09 17:01
Alles binnentrekken en het dan in PHP uitzoeken is echt super bagger als je het mij vraagt.. Echt mega inefficient.

Als je dat doet waarom gebruik je dan uberhaupt een database?!?!

Maar een idee voor dat threaded gebeuren is het gebruiken van een string met een hoop nummers voor het aangeven van je nivo. Het idee is dat je iedere reactie op de een of andere manier een nummer/string meegeeft die er zo uit ziet:

'00233-1-3-2'

eerste deel geeft aan op welk bericht het een reactie is (b.v. welk nieuws item) 2e geeft aan welk bericht (eerste bericht), 3e geeft aan dat het de 3e reactie is in de thread over dat 1e bericht en 4e nr. geeft aan dat het de 2e reactie is op de 3e reactie op het 1e bericht ;) Volg je het nog? :)

Op die manier kan je dus iets als:

SELECT * from posts where level like '00233%'

doen om alle reacties op dat bericht op te halen, of alleen de reacties binnen 1 thread.

Maar zoek ook ff op internet, staat behoorlijk wat info over het maken van trees in MySQL. Dit is maar 1 manier, het hoeft dus niet met een string, het hoeft niet met scheidingstekens, het hoeft niet met LIKE, kan je allemaal lekker aanpassen aan je eigen wensen..
Maar trek AUB NIET alles met een 'SELECT * FROM posts' binnen, als er iets totaaaal niet schaalbaar is |:(
Pagina: 1