Struktur eines Forums

  • Themenstarter Themenstarter P_F
  • Beginndatum Beginndatum
das hatte ich ja weiter oben schon geschrieben das es bei den meisten Foren egal sein dürfte erst wenn man viele Foren/Kategorien hat und somit auch vermutlich mehr klicks muss man sich wirklich gedanken über Geschwindigkeit machen.

btw: phpBB benutzt auch die query Methode.
 
Tja, das wird auch seinen Grunde haben...und bestimmt nicht den, dass die Programmierer zu dumm sind ;-)

Aber wenn das langsamste an einer PHP Seite die MySQL-Querys sind, wieso programmiert man dann nicht einfach mit Textdateien oder so als Datenspeicher? ;-] :rolleyes: :)
 
Na, dann will ich auch mal einen Vorschlag machen.
Bedingung für meienn Vorschlag ist allerdings, dass es nur 2 Ebenen gibt, also die Ebene Kategorie und die Ebene Foren.

Du nimmst 2 Tabellen:
Kategorie
  • ID
  • Bezeichner
  • (Optional Sortierungsindex)
  • weitere Attribute...
Forum
  • ID
  • Bezeichner
  • KategorieID
  • (Optional Sortierungsindex)
  • weitere Attribute...

Du kannst dann mit einem Query alle Foren und Kategorien auslesen.
Ungefähr so:
Code:
SELECT Forum.ID as forumID, 
Kategorie.ID AS kategorieID,
Forum.Bezeichner AS forum, 
Kategorie.Bezeichner AS kategorie 
FROM Forum LEFT JOIN Kategorie ON Kategorie.ID=Forum.KategorieID
ORDER BY Kategorie.Bezeichner, Forum.Bezeichner

oder statt der letzten Zeile:

ORDER BY Kategorie.Sortierungsindex, Forum.Sortierungsindex

Beim Auslesen in der while-Schleife musst Du dann darauf achten, wann sich die Kategorie ändert, um eine Überschrift einzufügen, je nachdem, wie Dein Layout aussieht.

Gruß hpvw
 
BobDerMeister hat gesagt.:
btw: phpBB benutzt auch die query Methode.

Nein, das Stimmt nicht. Zumindest nicht beim phpBB 2.0.4

Lars Michelsen hat gesagt.:
Aber wenn das langsamste an einer PHP Seite die MySQL-Querys sind, wieso programmiert man dann nicht einfach mit Textdateien oder so als Datenspeicher?

Der Zugriff auf die Festplatte im Allgemeinen ist langsamer, als wenn du nur Werte in Variablen speicherst, etc., da das alles im Arbeitsspeicher abläuft.

@hpvw: Das wäre auch eine Möglichkeit, wobei du dabei natürlich redundante Daten hast, da der Kategorie-Name für jedes Forum ausgelesen wird.

Im Endeffekt ist es bei dir wahrscheinlich egal, wie du es machst. Ich wollte dir nur die performanteste und beste Lösung anbieten, und sobald du mal ANwendungen programmierst, bei denen es auf Performance ankommt, wirst du verstehen, worauf es ankommt.
 
Oliver Gringel hat gesagt.:
@hpvw: Das wäre auch eine Möglichkeit, wobei du dabei natürlich redundante Daten hast, da der Kategorie-Name für jedes Forum ausgelesen wird.
Die Datenbank ist aber korrekt normalisiert.
Redundante Daten habe ich nur bei der Ausgabe.
Das ist nichts unübliches, wenn man mit JOINS aus einer normalisierten Datenbankstruktur ausliest.
Man normalisiert ja, damit die Daten redundanzfrei gespeichert werden und nicht, damit sie redundanzfrei ausgegeben werden.
Ich sehe keine Lösung, die Abfrage mit nur einem Query zu machen, ohne in dem Ergebnis redundante Daten zu erhalten.
Und nach meiner bisherigen Erfahrung ist ein Skript am performantesten, wenn man so wenig SQL-Abfragen, wie möglich, macht.
Wenn es denn bei einem kleinem Forum überhaupt nötig ist so sehr auf die Performanz zu achten.
Die Ausgabe müsste übrigends ungefähr so gemacht werden:
PHP:
//db verbinden

$sql = "SELECT siehe mein letzter post";
$result = mysql_query($sql);

$lastCat="";

while ($row=mysql_fetch_array($result)) {
  if($row['kategorie'] != $lastCat) {
    //überschrift ausgeben
    $lastCat=$row['kategorie'];
  }
  //forum ausgeben
}
Als Overhead zur reinen Ausgabe gibt es eine if-Abfrage pro Forum und eine SQL-Abfrage.
 
Wie gesagt, es ist eine Möglichkeit, wenn auch keine schöne. Sicherlich gibt es keine Redundanzen in der Datenbank, aber eben im Ergebnis der Abfrage. Der Sinn von SQL ist es ja, dass man die Daten so aufbereitet bekommt, wie man sie braucht. Und ob es nun ein oder zwei Queries sind, macht keinen wirklichen Unterschied, wobei ich auch nicht unbedingt behaupten würde, dass ein Query mit einem Left-Join schneller ist, als zwei einfache Queries.

Im Allgemeinen gilt natürlich: Je weniger Abfragen, desto besser, aber auch da gibt es Ausnahmen, auf die man achten muss. (z.B. niemals zwei Left-Joins über die gleiche Tabelle machen)
 
Oliver Gringel hat gesagt.:
Wie gesagt, es ist eine Möglichkeit, wenn auch keine schöne. Sicherlich gibt es keine Redundanzen in der Datenbank, aber eben im Ergebnis der Abfrage. Der Sinn von SQL ist es ja, dass man die Daten so aufbereitet bekommt, wie man sie braucht.
Da muss ich Dir entschieden widersprechen.
"Schöner" Code ist für mich performant und verständlich.
Ich halte das was ich da produziert habe für wesentlich verständlicher, als die Array-Variante. Das kommt sicherlich darauf an, wie sehr der einzelne Programmierer mit PHP bzw. SQL vertraut ist. Mag sein dass ein versierter PHP-Programmierer, der mit SQL gerade anfängt die Array-Variante für verständlicher hält.
Der Sinn von Normalisierung ist ja nicht, redundanzfreie Abfragen zu erzeugen.
Wenn ich mir den Code mit Arrays anschaue dann hat das auch nichts mit "Daten so aufbereiten, wie man sie braucht" zu tun und die andere Variante ist sicherlich inperfomanter.

Oliver Gringel hat gesagt.:
Und ob es nun ein oder zwei Queries sind, macht keinen wirklichen Unterschied, wobei ich auch nicht unbedingt behaupten würde, dass ein Query mit einem Left-Join schneller ist, als zwei einfache Queries.

Im Allgemeinen gilt natürlich: Je weniger Abfragen, desto besser, aber auch da gibt es Ausnahmen, auf die man achten muss. (z.B. niemals zwei Left-Joins über die gleiche Tabelle machen)
In diesem konkreten Beispiel müsste man es sicher noch überprüfen, aber bei ähnlichen Konstrukten mit Kategorie und Elementen mit eigener Tabelle war bei mir bisher immer eine einzelne Abfrage mit JOIN schneller, als das nachträgliche Zuordnen und Sortieren in PHP.
Der Unterschied liegt nicht in ein oder zwei Querys, sondern in insgesamt 4 Schleifen (wovon 2 verschachtelt sind) gegenüber einer Schleife.
 
Ich verstehe nicht, was ihr immer für Probleme mit dem "Zuordnen und Sortieren" habt?
PHP:
foreach ($categories AS $category)
{
	echo $category['name'];
	foreach ($forums[$category['id']] AS $forum)
	{
		echo '- ' . $forum['name'];
	}
}
Das ist der ganze Code für die Ausgabe. Sicherlich sind es in dem Fall 2 Schleifen, aber die zwei Schleifen laufen genausooft durch, wie deine eine Schleife. Es ist also von der Performance her schlichtweg egal.

Und da das Resultat einer Abfrage auch nichts anderes ist, als eine Tabelle in der Datenbank, nur das sie eben nur im Arbeitsspeicher liegt, und nicht auf der Platte, ist auch in diesem Fall auf Redundanzfreiheit zu achten. Alle überflüssig übertragenen Daten kosten schließlich auch Performance.

Die Tatsache, dass es in diesem Fall nicht auf die Performance ankommt bzw. diese eher nebensächlich ist, ist noch lange kein Grund, nicht optimiert zu programmieren.
 
Zurück