2017-11-06 5 views
0

Ich habe eine Tabelle mit dem Namen topic, die eine Spalte mit dem Namen like_count hat.MySQL-Design: Eine Abfrage zum Abrufen mit den meisten Aktionen innerhalb eines bestimmten Zeitraums

Ist es möglich, eine Anfrage zu dieser Tabelle zu schreiben, um "die Top 10 beliebtesten Themen in den letzten 7 Tagen zu geben", also die 10 Themen, die in den letzten 7 Tagen die meisten Likes hatten, ohne eine zusätzliche Auditing-Tabelle zu erstellen?

Ich dachte daran, dies zu tun, indem Sie eine Auditing-Tabelle wie topic_like_audit erstellen, die nur zwei Spalten hätte: topic_id und created_at. Jedes Mal, wenn das Thema mit dieser ID gefallen ist, wird ein neuer Datensatz in der Audit-Tabelle gespeichert. Dann kann ich eine Abfrage schreiben, die alle Ergebnisse innerhalb der letzten 7 Tage mit der Spalte created_at aggregiert und nach den Rängen sortiert, die die meisten Datensätze in diesem Zeitraum enthalten.

Aber ich kann mir nicht vorstellen, dass es eine skalierbare Lösung ist ... es mag auf kurze Sicht funktionieren, aber das muss sicherlich schlecht sein, wenn Sie Themen haben, die Millionen oder sogar Hunderttausende von Likes haben.

Irgendwelche guten Standardlösungen, wenn Sie so etwas tun, oder reicht mein Ansatz aus? P.S. Ich bin ein DB-Noob.

+0

Die vorgeschlagene Audit-Tabelle mit entsprechender Indizierung sollte praktikabel sein. Wenn Sie sich vorstellen, dass sie in Millionen von Zeilen vorgeht, können Sie sie partitionieren (vielleicht nach Monat oder Jahr?) und/oder erwägen, Zeilen zu archivieren, die für den aktuellen Standortbetrieb nicht relevant sind. –

+0

@Used_By_Already Sie machen tatsächlich einen wirklich guten Punkt, könnten nur Datensätze löschen, die älter als ein bestimmter Zeitraum sind, um die Tabellengröße zu reduzieren. Danke für den Tipp. – Lansana

+0

übrigens zu lösen '" geben Sie mir die Top 10 beliebtesten Themen in den letzten 7 Tagen "' Sie brauchen Datetime-Informationen für jeden wie –

Antwort

1

Es hängt davon ab, ob Sie tolerieren können, dass Ihr Einsatz etwas langsamer ist oder nicht.

Was Sie tun können, ist, können Sie zunächst Daten für Top-Ten-Themen durch eine Abfrage generieren. Sie können diese Liste in mysql oder einer anderen Caching-Ebene verwalten. Es wäre gut, wenn Sie die Caching-Ebene beibehalten, weil Sie möchten, dass Ihr Abruf schnell erfolgt.

Bei jeder Einfügung von Like eines neuen Themas, können Sie das aktuelle Thema wie mit dem Thema mit Minimum wie in Ihrer Liste vergleichen, wenn der Strom größer ist, können Sie sie austauschen. Sie können die Prioritätswarteschlange als Datenstruktur für diese Sache verwenden, die zu O (logn) -Zeit führt.

Dieser Prozess kann weiter verzögert werden, da Sie eventuell ein konsistentes System anstelle eines konsistenten Systems haben könnten. Sie könnten dies in die Warteschlange schieben, die von den Arbeitern weiter bearbeitet werden kann.

1

Es klingt wie Sie können nicht sagen, wenn ein "wie" aufgetreten ist? Wenn Sie jedes "Gefällt mir" (oder eine Charge von "Likes") an eine Datetime (oder nur einen Tag) binden, können Sie das nicht tun. Wenn ein "Gefällt mir" auftritt, speichern Sie es in einer Tabelle (TodaysLikes) mit topic und datetime. Am Ende jeden Tages die gestrigen Daten in eine Übersichtstabelle (LikesSummary) mit topic, date (nicht Datum) und count zusammenfassen. Dann entfernen Sie sie von TodaysLikes.

Dann wird das die Top 10:

SELECT topic, SUM(count) AS likes 
    FROM LikesSummary 
    WHERE date >= CURDATE() - INTERVAL 7 DAY 
    ORDER BY likes DESC 
    LIMIT 10 

Eine weitere Optimierung nicht direkt ist like_count in stoßen als „wie“ auftritt, sondern tut, dass im Rahmen der nächtlichen Verdichtung. (Das bedeutet, dass die like_count nicht sekundengenau ist, sondern nur bis letzte Nacht zählt.

+0

Danke für die Antwort. Hatte das schon gelöst, aber guter Rat an den mehreren Tischen. Kann eine gute Idee sein, wenn ich die Speichergröße klein halten möchte. Bis auf weiteres möchte ich jedoch alle Aufzeichnungen für historische Zwecke aufbewahren. – Lansana

Verwandte Themen