Ich habe eine Use Case-Anforderung, wo ich ein Hashtag-Ranking-System entwerfen möchte. 10 beliebtesten Hashtag sollte ausgewählt werden. Meine Idee ist ungefähr so:
[hashtag, rateofhitsperminute, rateofhisper5minutes]
Dann werde ich fragen, finden Sie die 10 beliebtesten #hashtags, deren Rateofhits pro Minute am höchsten sind.
Meine Frage ist, welche Art von Datenbanken kann ich verwenden, um mir Statistiken wie "rateofhitsperminute" zur Verfügung zu stellen?
Was ist eine gute Möglichkeit, ein solches Detail zu berechnen und in db zu speichern? Bieten einige DBs diese Funktionen?
Zunächst wird "Trefferrate pro Minute" berechnet:
%Vor%Also hängt die Rate davon ab, wie lange der Zeitraum ist. (Die letzte Minute? Die letzten 10 Minuten? Seit die Hits begonnen wurden aufgezeichnet? Da wurde der Hashtag zuerst verwendet?)
Was Sie also wirklich speichern möchten, ist die Anzahl der Treffer, nicht die Rate. Es ist besser, entweder:
Nun müssen Sie den gewünschten Zeitraum auswählen und die Datenbank abfragen, um die Top 10 Hashtags mit den meisten Treffern in diesem Zeitraum zu finden.
Wenn Sie die Rate anzeigen möchten, verwenden Sie die obige Formel, beachten Sie jedoch, dass die Reihenfolge der obersten Hashtags nicht geändert wird, da die Periode für jedes Hashtag identisch ist.
Sie können den obigen Algorithmus auf fast jeden DB anwenden. Sie können es sogar tun, ohne eine Datenbank zu benutzen (benutzen Sie einfach eine eingebaute Programmiersprache hashmap).
Wenn Leistung ein Problem ist und es viele verschiedene Hashtags geben wird, schlage ich vor, eine OLAP-Datenbank zu verwenden. OLAP-Datenbanken sind speziell für Top-k-Abfragen (über einen bestimmten Zeitraum) konzipiert.
Nachdem dies gesagt wurde, hier ein Beispiel, wie Sie Ihren Anwendungsfall in Solr erreichen können: Solr als Analytics-Plattform . Solr ist keine OLAP-Datenbank, aber dieses Beispiel verwendet Solr wie eine OLAP-DB und scheint am einfachsten zu implementieren und an Ihren Anwendungsfall anzupassen:
Ihr Solr-Schema würde wie folgt aussehen:
%Vor%Ein Beispieldokument wäre:
%Vor%Eine Abfrage, die Sie verwenden könnten, wäre:
%Vor%Zum Schluss noch ein paar fortgeschrittene Ressourcen zu dieser Frage:
Keine Datenbank hat Statistiken pro Minute, aber jede moderne Datenbank könnte verwendet werden, um eine Datenbank zu erstellen, in der Sie ganz einfach Raten pro Minute oder andere berechnete Werte berechnen können.
Ihre Frage ist wie die Frage, welche Art von Auto von New York nach LA fahren kann - na ja, kein Auto kann selbst fahren oder sich selbst betanken (ich sollte vorsichtig mit dieser Analogie sein, denn ich denke Autos machen das fast schon! ), aber du könntest jedes Auto, das du magst, von New York nach LA fahren, einige werden komfortabler sein, einige sparsamer und einige schneller als andere, aber du musst fahren und tanken.
Sie können InfluxDB verwenden. Es ist gut für Ihren Anwendungsfall geeignet, da es erstellt wurde, um Zeitreihendaten zu verarbeiten (zum Beispiel "Treffer pro Minute").
In Ihrem Fall könnten Sie bei jedem Treffer einen Datensatz mit dem Namen des Hashtags und einem Zeitstempel senden.
Die Daten sind abfragbar, und es gibt bereits Tools, mit denen Sie sie verarbeiten oder visualisieren können (wie zB Grafana ). .
Wenn Sie mit einem großen Datensatz zufrieden sind, können Sie diese Informationen selbst speichern und berechnen.
Ich glaube, Mongo ist ziemlich schnell, wenn es um indexbasierte Abfragen geht, damit Sie so etwas strukturieren können.
Jedes Mal, wenn ein Tag "getroffen" oder zugegriffen wird, können Sie diese Informationen als Zeile speichern
%Vor%Wenn Sie es auf diese Weise speichern, können Sie zunächst einfache Gruppen-, Zähl- und Sortieroperationen ausführen, die Sie zu Ihrer ersten gewünschten Fähigkeit führen, die 10 beliebtesten Tags zu berechnen.
Mit den Informationen in diesem Format können Sie dann weitere Abfragen basierend auf Tag und Zeitstempel ausführen, um die Anzahl der Treffer für ein bestimmtes Tag zwischen den Zeiten X und Y zu zählen, die Ihnen Ihre Treffer pro Periode geben würden.
Vorteile, es auf diese Weise zu tun:
Negativ, es so zu machen:
Tags und Links database