2010-12-13 3 views
0

Ich entwickle eine Website mit 200.000 Seiten. Es gibt auch einen Browse-Bereich, der die beliebtesten und am höchsten bewerteten Dokumente anzeigt. Dieser Abschnitt wird jedoch einige Wochen später, nach dem Start, fast statisch werden. Also würde ich auch gerne ein Filtersystem implementieren, das die beliebtesten Artikel von heute, diese Woche, wie youtube zeigt.Filtern von beliebten Artikeln mit Tag/Woche/Monat

Genau wie folgt aus:

http://www.youtube.com/videos?c=2

Wie soll ich diese Funktion implementieren? Brauche ich eine andere Tabelle, die jeden Tag einen neuen Eintrag für jedes Dokument enthält?

docid, Datum, view_count, Bewertung

Also werde ich heute die Reihe zum Filtern erhalten, indem Sie einen Tag, oder eine Woche (7 Zeilen) für die Filterung unter Verwendung Woche berechnen? Es scheint nicht effizient zu sein. Hast du irgendwelche Vorschläge?

Ich benutze übrigens LAMP-Stack.

Danke,

+0

Bedenken Sie Sicherheitsbedenken, wenn Sie nicht möchten, dass ein einzelner Benutzer beispielsweise 1000 Aufrufe pro Sekunde generieren kann. Viel Glück dabei, einen Weg zu finden, einen entschlossenen Angreifer zu stoppen. –

Antwort

0

Ich glaube, ich würde das Datum des in Code berechnen und sie dann als Argumente übergeben, auf dem SQL Sie verwenden.

1

Wenn Sie die Datensätze in Ihrer Tabelle mit einem Zeitstempel versehen, sollten Sie in der Lage sein, eine where-Klausel zu setzen, die den Zeitstempel auf den von Ihnen gewünschten Zeitraum begrenzt.

Sie können das Ergebnis, insbesondere die längeren, lange genug zwischenspeichern, um die Anfrage inkonsequent zu machen.

EDIT

Aber vielleicht meinen Sie beliebtesten heute nicht populärste, die heute aufgenommen?

In diesem Fall habe ich keine Antwort.

1

Der direkteste Ansatz besteht darin, den Zeitstempel und die Ressourcen-ID jedes Mal zu speichern, wenn die Ressource in recent_views(what, when) angezeigt wird. Tages-/Wochen-/Monatsdiagramme können mit entsprechenden WHERE-Klauseln wie WHERE when > $beginOfPeriod AND when < $endOfPeriod erstellt werden.

Aus Leistungsgründen können Sie die Werte jede Nacht aggregieren, die Summen in separaten Tabellen wie daily_views(what, sum) speichern und die Quellentabelle abschneiden.

0

Ich würde es mit einem Compiler tun. Youtube macht das wahrscheinlich auch, wenn man den Traffic und die Antwortzeiten berücksichtigt.

Das Prinzip ist leicht zu verstehen. Sie protokollieren jede Ansicht oder Bewertung in einer Tabelle page_view. Sie definieren Perioden, zu denen die Übersetzung stattfindet (stündlich, täglich, wöchentlich, monatlich). Jedes Mal, wenn Sie die gute Zeit getroffen (z .: Ende des Tages), führen Sie den Compiler, die im Wesentlichen eine Abfrage à-la ausführen ...

SELECT * FROM page_view WHERE date > $from_date AND date < $to_date 

... und das Ergebnis. Dies funktioniert wahrscheinlich besser in einem Cron-Job.

Wenn Sie das nächste Mal die Informationen anzeigen müssen, können Sie einfach das gespeicherte Ergebnis abrufen und ohne erneute Berechnung anzeigen. Es gibt eine Vielzahl von Speichermethoden, die Sie verwenden können: eine MySQL-Tabelle (z. B. page_view_compiled), Memcached usw.

Verwandte Themen