Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
06.05.2007, 02:05
kingduevel



Hallo erstmal.

Ich überlege derzeit, ob ich für meine Homepage ein einfaches Kommentarsystem mit PHP und mySQL programmiere. Die Struktur meiner tabelle "news" ist derzeit:

Quellcode:id
icon
titel
text
datum
autor
Jetzt habe ich mal gegoogelt und eine Möglichkeit gefunden: Ich erstelle innerhalb dieser Tabelle ein weiteres Feld mit dem Titel "kommentar". Dieses Feld würde im Falle eines Kommentares dann die "id" der News erhalten und so kann ich durch eine Inhaltsabfrage feststellen, ob es eine News oder ein Kommentar ist und gleichzeitig, zu welcher News.

Eine andere Möglichkeit um die eigentlichen News von den - eventuell vielen - Kommentaren zu trennen (empfinde ich als übersichtlicher) wäre, dass ich eine neue Tabelle "news_comments" erstelle mit ähnlichen Feldern wie oben. Diese Tabelle frage ich halt dann immer pro News ab und gut ist.

Wie handhabt ihr euer Kommentarsystem? Welche Vor- oder Nachteile bieten die beiden Systeme oder habe ich andere Möglichkeiten komplett vergessen? Wäre froh Feedback zu bekommen, auch wenn es nur eins wie "ich nutze erste Option" ist.

--

zum Seitenanfang zum Seitenende Profil || Suche
001
06.05.2007, 04:36
dp
Administrator


http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29

--

zum Seitenanfang zum Seitenende Profil || Suche
002
06.05.2007, 08:48
Megge



Zitat:
Wiki
Die Normalisierung dient eher zur mathematischen/theoretischen Aufarbeitung eines Datenbankmodells und zur Überprüfung eines relationalen Datenbankentwurfs. In der Praxis kommt Normalisierung überwiegend zu didaktischen Zwecken zur Anwendung. Es wird damit demonstriert, wie man auf keinen Fall ein Datenmodell entwirft – nämlich ausgehend von einer Universaltabelle.
Wenn du Kommentare auf der Seite für mehr als nur News brauchst, kannst du z.B. das hier anlegen:
Quellcode:id
type
parent_id
content
[weitere optionale felder]
unter type speicherst du dann z.B. "news","image_gallery" oder ähnliches.
unter parent_id speicherst du die eindeutige id der news/image_gallery_eintrag etc

--

zum Seitenanfang zum Seitenende Profil || Suche
003
07.05.2007, 11:17
kingduevel



Daran, dass man ja auch andere Sachen kommentieren könnte, hätte ich erstmal nicht gedacht. Vielen Dank dafür und werde es genau so machen, Megge.

Jetzt aber grade nochmal ne andere Frage: Der Wert für die Anzahl der Kommentare zu einer News, würdet ihr den immer ermitteln lassen, indem die entsprechenden Einträge in der Kommentartabelle gezählt werden? Oder würdet ihr in der Newstabelle ein neues Feld "kommentare" mit standardmäßig "0" anlegen und diese, wenn ein Kommentar getätigt wird, hochzählen? Letztere Methode scheint mir serverseitig schneller auszugeben sein, erstere ist aber irgendwie auch sehr bequem...

--

zum Seitenanfang zum Seitenende Profil || Suche
004
07.05.2007, 11:30
hausi



Die erste Methode ist die DB-technisch korrekte. Am besten schaust du dir noch kurz SQL JOINs an, dann kannst du die Zählung der Kommentare in einem Statement machen.
Die zweite Methode hat das Problem, dass Updates atomar sein sollten und somit korrekterweise eigentlich die Tabellen locken müsstest. Wenn du das nicht machst, hast du früher oder später falsche Kommentar-Anzahlen, die du dann irgendwie wieder korrigieren must.

Kurzum: Nur, falls sehr viele Abfragen nötig sind, solltest du die zweite Lösung überhaupt in betracht ziehen. Im zweifelsfalle ist aber nicht diese Abfrage der Punkt, der die Leistung der DB in die Knie und dich somit zum HW-update zwingt...

--

zum Seitenanfang zum Seitenende Profil || Suche
005
07.05.2007, 17:09
Megge



Das ThWBoard benutzt z.B. die zweite Variante, um auf der Boardindex Seite die Anzahl Posts und Threads pro Board anzuzeigen. Würde es jeweils voll durchzählen, so würde das bei 600'000 Posts 55'000 Threads eine Ewigkeit dauern.. aber bei kleinen Scripten ist die erste Variante absolut der Favorit

--

zum Seitenanfang zum Seitenende Profil || Suche
006
07.05.2007, 18:14
kingduevel



Hab zwar irgendwie nicht alles verstanden, was du da geschrieben hast, hausi. Aber ich denke ich sollte die Kommentaranzahl schon direkt in der DB ablegen. Und damit es keine Probleme in der Anzahl gibt, mache ich das jetzt wohl so, dass der bei jedem Absenden oder Löschen eines Kommentares die Tabelle auf passende Kommentare zum grade ausgewählten Newsbeitrag durchsucht und so den aktuellen Wert erkennt. Damit habe ich quasi eine ständige Kontrolle und es kann nichts durch das stupide Hochzählen schief gehen...

Vielen Dank für die Antworten.

--

zum Seitenanfang zum Seitenende Profil || Suche
007
07.05.2007, 21:41
n0Brain



Also wenn ich das jetzt richtig verstanden habe, willst du einfach die Anzahl der Kommentare zu irgendeinem Foo (zB News) wissen?

http://www.w3schools.com/sql/func_count_ast.asp

einfach where hinten drann und du hast deinen Zähler

--

zum Seitenanfang zum Seitenende Profil || Suche
008
09.05.2007, 19:38
kingduevel



Ja, genau das möchte ich, nobrain. Mein bisheriger Code will aber net so richtig und der kann das nicht richtig zählen oder speichern:

Quellcode:$kommentare = mysql_query("SELECT COUNT(*) FROM kommentare WHERE type='news' AND parent='".$selection."'");
$query = mysql_query("UPDATE news SET kommentare='".$kommentare."' WHERE id='".$selection."'");
Die Struktur der Tabelle "news" seht ihr im ersten Post dieses Threads und die Tabelle "kommentare" hat folgende Felder. Apropo: Sind das zu viele Angaben für ein simples Commentsystem? Soll ich die Emailadresse, die nicht sichtbar ist und nur für Rückfragen gespeichert wird, weglassen? Oder die Webseite? Was habt ihr so ^^ ?

Quellcode:id
type
parent
datum
name
ip
email
webseite
text

--

zum Seitenanfang zum Seitenende Profil || Suche
009
09.05.2007, 20:03
scus



mysql_query gibt dir ein Result zurück, das musst du erst noch weiter bearbeiten, bevor du die Zahl speichern kannst...

--

sincères amitiés scus
--
Tand, Tand ist das Gebilde von Menschenhand

zum Seitenanfang zum Seitenende Profil || Suche
010
09.05.2007, 20:17
n0Brain



Ich hab in meinem Leben noch kein Kommentarsystem benutzt... Aber dein Aufbau sieht mir nicht falsch aus.

btw schon mit Google probiert?

Ansonsten, je mehr Infos du postest, desto leichter kann man dir helfen.

Wie geht denn der Code weiter?

--

zum Seitenanfang zum Seitenende Profil || Suche
011
09.05.2007, 20:31
kingduevel



Klar surfe ich in Google rum. Aber es will einfach net. Wie scus das sagt, muss ich noch irgendwie das Result umwandeln. Darum weiß ich ja leider net, wie es weiter geht. Ich kenn das jetzt nur mit ner while-Schleife, aber ich dachte durch den Count hab ich nur ein Ergebnis und zwar eine Zahl... wie bringe ich datt nun dazu, die Tabelle nach bestimmten Einträgen zu durchsuchen, diese zu zählen und den Wert in eine andere Tabelle zu speichern? Ich raff das mal grad gar net... Arbeitsblindheit oder so :| :

Quellcode:$query = mysql_query("SELECT COUNT(*) FROM kommentare WHERE type='news' AND parent='".$selection."'");
$kommentare = mysql_fetch_assoc($query);
$query = mysql_query("UPDATE news SET kommentare='".$kommentare."' WHERE id='".$selection."'");

--

zum Seitenanfang zum Seitenende Profil || Suche
012
09.05.2007, 20:38
n0Brain



Meine PHP-Kenntnisse sind sehr eingerostet, aber probiers mal mit
Quellcode:$sql = "SELECT
                    COUNT(*) as Anzahl
                FROM
                    users
                WHERE
                    ID = '".$id."' AND
                    Password = MD5('".$pass."');";
        $result = mysql_query($sql) OR die(mysql_error());
        $row = mysql_fetch_assoc($result);
        mysql_free_result($result);
        return $row['Anzahl'];
von http://tut.php-q.net/login.html.

Von der Seite hab ich mir früher sehr viel abgeschaut.

--

zum Seitenanfang zum Seitenende Profil || Suche
013
09.05.2007, 21:02
kingduevel



Ich raff dieses olle COUNT irgendwie net. Hab es jetzt so umgesetzt:

Quellcode:$kommentare = 0;
$query = mysql_query("SELECT * FROM kommentare WHERE type='news' AND parent='".$selection."'") OR die(mysql_error());
while ($kommentar = mysql_fetch_assoc($query))
{
$kommentare = $kommentare+1;
}
$query = mysql_query("UPDATE news SET kommentare='".$kommentare."' WHERE id='".$selection."'");

--

zum Seitenanfang zum Seitenende Profil || Suche
014
09.05.2007, 21:50
hausi



Quellcode:$res = mysql_query("SELECT COUNT(*) AS anzahl FROM kommentare WHERE type='news' AND parent=" . intval($selection)) || die(mysql_error());
$kommentare = mysql_result($res, 0, 'anzahl'); // oder 0 anstatt 'count' um per Index darauf zuzugreifen
Aber ich verstehe dich nicht so ganz. Auf der einen Seite wählst du eine Lösung, die nicht normalisiert ist, um ein wenig Geschwindigkeit zu gewinnen; auf der anderen Seite machst du dann Code, der viel zu langsam ist. Anstatt deiner while-Schlaufe könntest du z.B. mysql_num_rows nehmen, anstatt SELECT * könntest du nur 1 Feld abfragen und anstatt n Datensätze abzufragen könntest du COUNT(*) nehmen. Übrigens würde ich mich mal noch ins Thema SQL Injections einlesen, da mir dein Code sehr stark nach Problemen aussieht...
Edit: Es gäbe übrigens ziemlich sicher auch keine Geschwindigkeitsprobleme, wenn du das normalisiert löst.

--


Dieser Beitrag wurde am 09.05.2007 um 21:52 von hausi bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
015
10.05.2007, 11:19
oxff



Normalisieren kann man so standard Kommentarsysteme, für die es eigentlich nichtmals eine Datenbank bräuchte, meistens ohnehin ohne Geschwindigkeitsprobleme -- Problematisch wird es erst bei richtigen Datenmengen, wo man locker mal 1M rows pro Woche hat. Ursprünglich hatte ich mich da auch für ein normalisiertes Design entschieden, dass performed jetzt aber nichtmehr.

Kurzum: Denk nichtmals über Performance-Optimierung nach, solange du einen Datenheap wie MySQL nutzt. Mach dir dann lieber ein ordentliches Design.

--

mwcollect - mein Projekt | oxlog - mein blog | happyhardcore.com Stream - gute Musik

zum Seitenanfang zum Seitenende Profil || Suche
016
10.05.2007, 17:11
n0Brain



no.plan, schau dir einfach SQL bisschen mehr an, es lohnt sich. V. a. kannst du durch SQL viele Zeilen PHP-Code sparen. Die Performance wirst du nicht spüren, da es bei ein paar Einträgen in der DB keine Unterschiede macht, ob du 2 Kommentare, oder 200 hast. Schau lieber, dass deine Scripts sauber gestaltet sind, der Rest kommt dann von allein :)

--

zum Seitenanfang zum Seitenende Profil || Suche
017
11.05.2007, 16:38
scus



Ich weiss nicht, obs noch erwünscht ist, aber no.plan hatte mich per PN nach ner Lösung gefragt:
PHP-Quellcode:<?php
$count_result 
mysql_query("SELECT COUNT(*) FROM komentare WHERE ´type´ = 'news'");
if(
$count_result !== false and mysql_num_rows($count_result) == 1) {
  
$count_tmp mysql_fetch_array($count_resultMYSQL_NUM);
  
$count $count_tmp[0];
  unset(
$count_tmp);
} else {
  
// Fehlermeldung, o.ä
}

mysql_free_result($count_result);

$result mysql_query("UPDATE tabelle SET ´anzahl´ = '".$count."' WHERE id = '".$id."'");
if(
$result !== false) {
  echo 
"Anzahl gespeichert";
} else {
  echo 
"Speichern fehlgeschlagen";
}
?>

--

sincères amitiés scus
--
Tand, Tand ist das Gebilde von Menschenhand


Dieser Beitrag wurde am 11.05.2007 um 16:39 von scus bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche