2016-04-06 3 views
0

Ich versuche, ein Datenbankschema einrichten, wo Objekte Likes erhalten können. Ich werde oft auf die Gesamtzahl der Likes eines beliebigen Objekts zugreifen müssen.Wie "Anzahl der Likes" in relationalen Datenbank zu implementieren

I Setup zwei Tabellen:

[OBJECT] 
id 
path 
desc 

[LIKES] 
obj_id 
user_id 
timestamp 

Es würde Sinn für mich, ein Feld „nr_of_likes“ in der Objekttabelle zu implementieren, die jedes Mal, wenn eine neue Zeile in den Gleichen eingefügt wird erhöht werden Tabelle. Dies sollte viel schneller sein als COUNT(*) die Anzahl der Likes pro Objekt, oder? Das Problem ist, dass ich redundante Daten bekomme, und normalerweise ist das, was ich studiert habe, nicht gut. Welche Best Practices gibt es in dieser Hinsicht? Kann das Feld "nr_of_likes" implementiert werden? Vielen Dank für Ihre Meinung!

+0

seine sogenannte De-Normalisierung oder Memoisierung, sehr oft aus Gründen der Performance verwendet –

+0

Das Hinzufügen einer Spalte, die die Gesamtzahl der Likes zu einer Tabelle im Gegensatz zu einem 'COUNT()' enthält, ist nicht ideal. Obwohl es möglicherweise schneller zu lesen ist, müssen Sie berücksichtigen, dass Sie diese Spalte bei jeder Änderung der Nummer ständig pflegen müssen. Darüber hinaus verlieren Sie alle Konzept, wer es mochte, und wann. Redundante Daten sind nicht immer schlecht, aber was halten Sie für redundant? – Siyual

Antwort

1

Es ist sicherlich möglich, eine Spalte zu implementieren, wie Sie vorgeschlagen haben. Wie Sie auch herausgefunden haben, ist es normalerweise eine schlechte Übung. Wenn Sie in Ihrer Tabelle Likes richtig indizieren, ist die Leistung in der Regel in Ordnung. Natürlich hängt es davon ab, wie groß Ihre Datenbank ist und auf welcher Art von System sie läuft.

Ob Sie die "allgemeine" Regel des Datenbankentwurfs verletzen wollen oder nicht, ist genauso wie die Entscheidung für jede andere Art von Denormalisierung - was ist die Begründung? Welche Kosten sind mit dieser Designwahl verbunden? Überwiegen sie die Pluspunkte?

Mein eigener Ansatz besteht darin, immer den Standardregeln für das Datenbankdesign zu folgen. TEST für die Leistung, bevor Sie sich für ein Leistungsproblem entscheiden. Wenn Sie ein Leistungsproblem feststellen, prüfen Sie, wie Sie es beheben können (Indizierung usw.), ohne ein minderwertiges Datenbankdesign zu verwenden. Denormalize als letzten Ausweg. Es ist ein Tool im Toolbelt, nur eines, das leider öfter benutzt wird, als es sein sollte.

Immer stellen Sie sicher, dass Sie vollständig verstehen, dass die Designentscheidung jedoch Nachteile hat.