Ich mache ein kleines Programm, in dem Benutzer Beiträge verfassen oder Blogs schreiben. Auf diesen Posts können andere Benutzer den Post wie in Facebook mögen oder nicht mögen oder den Post wie im Stackoverflow hoch- oder runterstimmen. Ich würde gerne eine gute Datenbankstruktur kennen, die häufig verwendet wird und das Programm arbeitet effizient mit dieser Struktur. Ich habe zwei Möglichkeiten
Zuerst
Post:
id head message datepost likes dislikes
1 ab anchdg DATE 1,2,3 7,55,44,3
In obiger Weise id
ist die Postid. In der Likes-Spalte 1,2,3
befindet sich die Benutzer-ID, die den Beitrag oder das Blog gemocht oder positiv bewertet hat. 7,55,44,3
ist die ID der Benutzer, die den Beitrag oder das Blog nicht mochten oder ablehnten.
Zweite
Post:
id head message datepost
1 ab anchdg DATE
Likes:
id postid userid
1 1 1
2 2 2
Abneigungen:
id postid userid
1 1 7
2 1 55
Auf diese Weise muss ich zwei separate Tabellen für Likes und Dislikes erstellen, um die Likes von Posts zu erhalten. Auf diese Weise werden die Tabellen dh Likes
& Dislikes
stark gefüllt. Dies kann die Tabelle schwer und die Verarbeitung langsam machen.
Ich würde gerne wissen, wie diese Aufgabe besser und standardisierter gelöst werden kann.
quelle
Antworten:
Das Problem, mit dem Sie konfrontiert sind, wird als "Normalform" von Datenbanken bezeichnet, insbesondere als erste Normalform. https://en.wikipedia.org/wiki/First_normal_form .
Ihre Datenbank mit den verketteten Benutzer-IDs (erste Version) befindet sich nicht in der ersten normalen Form.
Unter https://en.wikipedia.org/wiki/Database_normalization erfahren Sie, warum und wie Normalisierung im Allgemeinen als gut angesehen wird.
In Ihrem ersten Beispiel wird die Abfrage nach "Benutzer 4 mag den Beitrag nicht mehr" kompliziert. Es müssen Zeichenfolgenoperationen ausgeführt werden, bei denen Nebenwirkungen und Eckfälle berücksichtigt werden müssen (Benutzer ist der einzige Benutzer, der "gefällt", Benutzer ist der Benutzer, der zuletzt gefällt, Benutzer befindet sich in der Mitte der Zeichenfolge "Gefällt mir"). Ich würde das schlecht finden. Tu es nicht. Verwenden Sie ein normalisiertes Design.
re: Datenbank wird schwer
Wenn Sie einen Beitrag mit 4 Millionen Likes haben, haben Sie in Datenbankdesign 1 eine Zeile mit einer "Likes" -Spalte, die mindestens 4 Millionen Zeichen breit ist (da Sie das Komma als Trennzeichen benötigen). Sie müssen dann Zeichenfolgenoperationen für Zeichenfolgen mit einer Breite von vier Millionen Ziffern ausführen. Dies ist sehr unperformant und langsam.
Andererseits sind Datenbanken für die Verarbeitung von Millionen von Zeilen ausgelegt. Wir haben Datenbanken mit mehreren hundert Millionen Zeilen und count () - Operationen sind schnell. Extrem schnell. Nein, dies ist kein Leistungsengpass.
Das nächste Problem wäre Lesbarkeit und Wartbarkeit.
Sagen Sie mir zum Beispiel, was diese beiden Aussagen bewirken:
quelle
Der zweite Weg ist viel besser, da Sie leicht ein Like / Dislike hinzufügen oder entfernen können.
Sie sollten Ihre zweite Lösung jedoch ändern, indem Sie eine Tabelle für "Gefällt mir" oder "Gefällt mir nicht" verwenden.
Die Spalten der Like / Dislike-Tabelle sollten id, postid, userid und eine andere für den Wert eines Like oder Dislike sein, z. B. 1 für Dislike und -1 für Like.
Legen Sie post_id und user_id als zusammengesetzten Primärschlüssel fest und es funktioniert einwandfrei.
Die Größe des Tisches wächst mit der Zeit. Sie haben jedoch nur zwei echte Spalten. Die ID und der Wert des Like / Dislike. Die Post-ID und die Benutzer-ID sind nur damit verknüpft und in Ihrer Benutzer- und Post-Tabelle gespeichert.
quelle
user_id
,post_id
undvalue
in der Tabelle. Keine separateid
Spalte erforderlich .sum
können Sie Liebe = 2 und Wut = 3 setzen