Struktur eines Forums

  • Themenstarter Themenstarter P_F
  • Beginndatum Beginndatum
P

P_F

Hi, ich beginne gerade damit ein Froum für mein CMS zu schreiben, es soll ganz einfach sein. Programmiertechnisch habe ich denke ich wenig Probleme, nur eine Sache und zwar:
Dieses Forum soll auch Kategorien besitzen. AUf der Forenstartseite werden dann alle kategorien und darunter die enthaltenen Foren angezeigt - wie in diesem forum.
Das wären dann ja 2 while-schleifen. Die eine für die kategorien und darin die für die foren. Habe nun aber irgendwo mal aufgeschnappt, dass dies nicht besonders vorteilhaft ist. Oder ist das so in ordnung.
 
Was nicht besonders Vorteilhaft wäre ist, wenn du innerhalb der while-Schleife für die Kategorieren die jeweiligen Foren für diese Kategorie ausliest. Dann hättest du für jede Kategorie ein mySQL-Query, und bei mehreren Kategorien wird das sehr langsam werden.

Am besten alle Kategorien und alle Foren auslesen, die Daten in Arrays schreiben, und dann die Foren den Kategorien zuordnen, um sie auszugeben.
 
Hm...wenn ich das richtig verstanden habe, halte ich das für nicht sehr sinnvoll, was ihr hier sagt, das wäre ja doppelter Aufwandt?!

So sieht der "übliche" Weg im groben aus:
PHP:
$query = mysql_query("SELECT * FROM kategorien");
while($data = mysql_fetch_array($query))
{
	//Auflisten der Kategorien
	
	$query1 = mysql_query("SELECT * FROM forum WHERE kategorie='".$data['id']."'");
	while($data = mysql_fetch_array($query))
	{
		//Auflisten der Foren
	}
}
 
Lars Michelsen hat gesagt.:
Hm...wenn ich das richtig verstanden habe, halte ich das für nicht sehr sinnvoll, was ihr hier sagt, das wäre ja doppelter Aufwandt?!

So sieht der "übliche" Weg im groben aus:
PHP:
$query = mysql_query("SELECT * FROM kategorien");
while($data = mysql_fetch_array($query))
{
	//Auflisten der Kategorien
	
	$query1 = mysql_query("SELECT * FROM forum WHERE kategorie='".$data['id']."'");
	while($data = mysql_fetch_array($query))
	{
		//Auflisten der Foren
	}
}

Das ist nicht der übliche Weg, sondern der definitiv langsamste Weg. Zwei Queries reichen vollkommen aus. Eins für die Kategorien, und eins für die Foren.
 
ich denke der übliche Weg ist es auf einer Seite die Kategorien anzuzeigen und auf einer anderen die Threads der jeweiligen Kategorie.
 
oh äääh hmmmm

wer lesen kann ist klar im Vorteil. ich ziehe zurück was ich eben gesagt habe. Ich würde auch Lars 'üblichen' Weg nehmen da ich zum einen bezweifel das das zusammenbasteln und anschließende auseinanderpflücken eines Arrays extrem viel schneller ist und zum anderen ist mir einfacher Code wesentlich wichtiger als 0.002ms Zeitersparniss pro Klick - die bei weniger als 1000 klicks die Stunde ohnehin keinen interessieren.
 
BobDerMeister hat gesagt.:
oh äääh hmmmm

wer lesen kann ist klar im Vorteil. ich ziehe zurück was ich eben gesagt habe. Ich würde auch Lars 'üblichen' Weg nehmen da ich zum einen bezweifel das das zusammenbasteln und anschließende auseinanderpflücken eines Arrays extrem viel schneller ist und zum anderen ist mir einfacher Code wesentlich wichtiger als 0.002ms Zeitersparniss pro Klick - die bei weniger als 1000 klicks die Stunde ohnehin keinen interessieren.
Es geht dabei nicht um 0.002ms sondern eher um Sekunden. Mich persönlich stört es schon, wenn ein Forum ein paar Sekunden braucht für den Seitenaufbau. Außerdem musst du nichts "zusammenbasteln" und wieder "auseinanderpflücken".
Es macht schon einen gewaltigen Unterschied, ob man 2 Queries oder evtl. 20 Queries hat.
 
nun gut mit meinen 0,002s bin ich wohl ein wenig weit gegangen.
Hab mir mal die Arbeit gemacht das auszuprobieren.
die Variante mit querys:
PHP:
	$db = mysql_connect('localhost', 'root', 'root');
	mysql_select_db('phpbb2', $db);

	$sql = 'SELECT cat_id, cat_title FROM categories ORDER BY cat_order';
	$result_cat = mysql_query($sql);
	while($cat = mysql_fetch_assoc($result_cat)) {
		echo $cat['cat_title'].'<br>';
		$sql = 'SELECT forum_id, forum_name FROM forums WHERE cat_id='.$cat['cat_id'].' ORDER BY forum_order';
		$result_forum = mysql_query($sql);
		while($forum = mysql_fetch_assoc($result_forum)) {
			echo '- '.$forum['forum_name'].'<br>';
		}
	}
und mit Arrays:
PHP:
	$sql = 'SELECT cat_id, cat_title FROM categories ORDER BY cat_order';
	$result_cat = mysql_query($sql);
	$category = array();
	while($cat = mysql_fetch_assoc($result_cat)) {
		$category[] = $cat;
	}

	$sql = 'SELECT forum_id, forum_name, cat_id FROM forums ORDER BY forum_order';
	$result_forum = mysql_query($sql);
	$board = array();
	while($forum = mysql_fetch_assoc($result_forum)) {
		if(!isset($board[$forum['cat_id']])) { $board[$forum['cat_id']] = array(); }
		$board[$forum['cat_id']][] = $forum;
	}

	foreach($category as $cat) {
		echo $cat['cat_title'].'<br>';
		foreach($board[$cat['cat_id']] as $forum) {
			echo '- '.$forum['forum_name'].'<br>';
		}
	}
zu bewältigen waren 9 Kategorien mit jeweils 5 Foren. Nach 100 durchläufen ergab sich das die Array Methode im Schnitt um 16,93% bzw 0,023s schneller ist. Ich denke jetzt kann sich jeder überlegen welche Methode für ihn die richtige ist.
 
Ich denke aber, wenn man viele Foren hat, dass die Array-Tehode dann wieder langsamer wird...
Der Array muss für jede Kategorie durchlaufen werden, wenn eine Kategorie nur 1 Forum hat, muss trotzdem der ganze Array von z.B. 1000 Foren durchsucht werden. Ich denke das schlägt dann wieder auf die Zeit...

...könnte man auch nochmal testen!
 
Das langsamste einer PHP-Seite sind immer die mySQL-Queries. Je weniger, desto besser.
Die Methode mit den Arrays wird immer schneller sein, außer man hat nur eine Kategorie. Dann kommt es aufs gleiche raus. Und wenn es keine Kategorie gibt, dann wird die andere Methode schneller sein.

@BobDerMeister:
Wenn du unter realen Bedingungen testest, dann wirst du noch viel größere Unterschiede feststellen. Wenn es nur um ein kleines Forum geht, dann ist es wahrscheinlich wirklich egal, wie mans macht. Das ändert aber trotzdem nichts an der Tatsache, dass es einfach schlecht programmiert ist.
 
Zurück