"Gefällt mir"

lisali

Erfahrenes Mitglied
Hallo,

ich würde gerne wie aus Facebook bekannt dieses "like" bzw. "gefällt mir" machen. Also, wenn jemand ein Beitrag (Kommentar, Link, etc.) gefällt, klickt man auf den Link und dann sehen alle wem das gefällt.

Jetzt habe ich nur die Frage wie genau ich das machen könnte... also, ich habe eine Tabelle in MySQL angelegt namens "rate" mit den Spalten id und uid (für User-ID).

Jetzt weiß ich aber nicht wie ich das realisieren soll, weil es garkeine eindeutige Zuordnung geben kann.
Ich habe zum Beispiel die Spalte "rid" (für Rate-ID) in der Kommentar-Tabelle von mir hinzugefügt und auch bei einer Link-Sammlung. Also, eine Tabelle, wo Links abgelegt werden.

Ich dachte jetzt, dass ich es so machen könnte, dass dann bei jedem Klick ALLE Tabellen überprüft und guckt was die höchste ID ist, damit es keine Doppeldeutigkeiten geben wird/geben kann. Aber das wäre sicher zu viel SQL-Nutzung für eigentlich eine relativ einfache Sache.

Was würde es für Alternativen geben?
 
Ich würde eine Tabelle in der die ID des users, die ID des Beitrags und eine Spalte mit 1 für gefällt mir und 0 nicht gewählt anlegen.

Das sollte eigentlich reichen. So brauchst du eigentlich nur noch die ID des Beitrages nehmen und schauen welche User alle mit "like" geantwortet haben... Weitere Informationen kannst du ja dann über die USER_ID erfahren.
 
Zuletzt bearbeitet:
Naja, wenn wem was gefällt, gibt es einen Eintrag. Und wenn nicht, wird er gelöscht. Mir geht es um die Eindeutigkeit der Zuordnung der ID, da mehrere IDs in mehreren Tabellen sein können, wie in meinem Beitrag beschrieben.
 
Entweder du fügst eine weitere Spalte hinzu, welche angibt, um was für eine Art von Beitrag es sich handelt (Kommentar, Link, Blogeintrag, etc.) oder du benutzt für jede dieser Teile eine eigene Tabelle.
 
Ein weiteres Feld wo du hinzufügst, welche Kategorie gemocht wird...

id - userid - category - rated_id
 
Die zweite. Du hast insgesamt kleinere Tabellen, welche
1. Schneller gelesen und geschrieben werden können
2. Seltener korrupt werden
3. Leichter zu warten sind.

Ich gehe davon aus, dass du ohnehin nie gleichzeitig die Daten für Links und Kommentare auslesen musst, also brauchst du es ja nicht in eine Tabelle zu stecken.

Der erste Ansatz hat natürlich auch gute Seiten. Wenn du eine weitere Sache hinzufügen willst, z.b. Fotos, dann musst du garnichts an der Datenbank ändern (keine neue Tabelle einfügen), sondern trägst als "Art" einfach "foto" o.ä. ein und alles funktioniert.

Wenn man aber davon ausgeht, dass solche "Like" button sehr häufig geklickt werden, ist es bei hohen Zugriffszahlen sicher sinnvoll, alles zu verteilen.

Wenn man wirklich so weit denken wollte, könnte man auch sagen, es ist wesentlich einfacher die Datenbank später auf mehrere Server zu verteilen, da du unabhängige Tabellen hast.

Edit:
Also Zusammenfassend könnte man sagen, dass Felix Jacobi's Antwort für dich ausreichen ist.
 
Okay, ich danke euch.

Ich habe da eine kleine themen-unrelevante kleine Frage. Wenn ich beispielsweise etwas aus der Datenbank löschen will. Also, einen Eintrag löschen.

Ist es da sinnvoll erstmal abzufragen, ob der Eintrag überhaupt besteht (mittels PHP abfragen)? Oder Sollte ich einfach den Befehl ausführen und wenn er was findet, löscht er sowieso und wenn nicht sowieso nicht? Eher die Abfrage mit PHP, oder?
 
Kommt drauf an, ob du zuerst wissen willst, welche Zeilen gelöscht werden.
Wenn du nur wissen willst, ob was gelöscht wurde bzw. gar keine Information darüber brauchst, einfach löschen und ggf. mysql_affected_rows (bei Mysql eben) die Anzahl der gelöschten Zeilen abfragen.
 
Also, eigentlich weiß ich welche Zeilen gelöscht werden sollen. Da wäre dann nur die Frage, ob sie da sind oder nicht.
Kann man da verallgemeinern und sagen, dass es besser wäre mit PHP erst zu überprüfen, statt direkt einen SQL-Befehl zu senden? Dieser Befehl löscht dann eventuell auch wohlmöglich mal etwas, was gar nicht existiert bzw. versucht es. Ich weiß ja nicht, ob allein dieser Befehl schon zu viel Speicher verbraucht? Also, ich stell mir nur die Frage wegen der Datenbank-Entlastung.
 
Zurück