Frage

Jedes Produkt ein product_date_added, die ein Date Feld ist das Datum enthalten hinzugefügt wurde. Sie haben auch eine product_views, die ein int Feld enthält, wie oft ein Produkt angesehen wurde.

Produkte nach Beliebtheit anzuzeigen, ich uns ein Algorithmus zu berechnen, wie viele Zugriffe pro Tag ein Produkt hat.

SELECT 
    AVG(product_views / DATEDIFF(NOW(), product_date_added)) as avg_hits
    , product_table.* 
FROM product_table
WHERE product_available = "yes" 
GROUP BY product_id
ORDER BY avg_hits DESC

Das funktioniert, aber der Chef ist immer eine Menge von älteren Produkten zu bemerken zuerst auftauchen. So ist er im Grunde neuere Ansichten will mehr Gewicht als ältere Ansichten haben.

war sein Vorschlag, dass alle Ansichten über ein Jahr alt zählen nicht. Ich glaube, ich würde ein Datum jeder Ansicht in Ordnung halten müssen, um das zu tun, was ich denke, würde die Leistung verlangsamen.

Was ist der beste Weg, um einen Beliebtheits Algorithmus wie zu schaffen, was mein Chef ist zu fragen?

Im Idealfall würde ich mag in der Lage sein, mit etwas zu entwickeln, die nicht der Tabellenstruktur nicht verändert. Wenn das nicht möglich ist, würde ich zumindest wie mit einer Lösung zu kommen, die die vorhandenen Daten verwenden können, so dass wir nicht von 0 beginnend werden Wenn das ist nicht möglich, entweder als alles, was funktionieren wird.

War es hilfreich?

Lösung

Sie würde nicht (als solche), um das Datum jeder Ansicht zu halten hat. Sie könnten stattdessen mit Spalten in einer Tabelle zu 366 Zeilen pro Stück halten: product_id, Felder day_of_year, zählen. Jeden Tag eine neue Aufgabe auf Null alle Zählungen von vor einem Jahr laufen. Wenn Sie nicht denormalised Daten dagegen, könnte diese Aufgabe aktualisieren auch die „Zähl“ -Feld in der Sendung selbst für den schnellen Abruf, so dass Ihre Abfrage nicht zu ändern braucht. product_views wird nur product_views_in_the_last_year. Die Zeitdauer von 1 Tag ist frei wählbar - ich bezweifle, dass Sie darauf, dass die Popularität auf einem Fenster von genau 1 Jahr basieren, so dass ich es auch nur erwarten konnte eine Stunde, eine Woche oder zwei Wochen sein, je nachdem, wie viele Eimer Sie‘ bereit sind, zu beschäftigen.

Ein alternatives Schema könnte seine exponentiellen Abfall zu verwenden. Drehen Sie das Zählfeld in einem Dezimal-Typ. Einmal pro Tag, reduzieren die Anzahl der einzelnen Elemente durch einen festen Prozentsatz (weniger als 1%, mehr als 0,1%), so daß der neuere ein Treffer ist, desto mehr „Gewicht“ hat. So alt Popularität stirbt nie ganz, sondern Hits von vor einem Jahr nicht viel beitragen. Ein Äquivalent zu dieser Regelung, durch die Art und Weise, ist es, den Code zu lassen, wie es ist aber sicher, dass Ihre Website als Ganzes exponentiell mehr populär im Laufe der Zeit wird; -)

Wie zur Vermeidung von Null beginnen - vielleicht jeder Zählung des Elements reduzieren sofort, als eine einmalige Aktion, die von einem Anteil, der auf das Alter des Elements abhängt. Im Großen und Ganzen würde man erwarten, dass ältere Objekte ältere Ansichten haben und daher von der derzeitigen Regelung überbewertet werden. Das ist nicht narrensicher, da vielleicht einige ältere Artikel, die kürzlich eine Menge Hits gewonnen haben. Sie könnten in der Lage sein, diese Elemente zu identifizieren, indem sie auf den letzten Webserver-Logs suchen, oder eine Woche oder einen Monat Zählen Hits verbringen, bevor Sie die einmalige Reduktion zu tun. Auch ohne das zu tun, wenn es ein wesentlicher Grund für ihre Popularität ist (nicht nur, weil sie in Ihrem Rankings Rating hoch und damit Verkehr von Menschen in Ihrem „beliebtesten“ Chart suchen Empfangen), dann hoffentlich werden sie zeit recover .

Andere Tipps

Sie möchten vielleicht diesem Blog-Post . Es ist im App Engine richtet, aber die Technik ist allgemein. Der grundlegende Ansatz ist eine Popularität haben, dass exponentiell abklingt, und jedes Mal, wenn Sie eine Stimme aufzeichnen erhöht / download / was auch immer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top