Domanda

Abbiamo un sito Web che contiene un database di posti. Per ogni luogo i nostri utenti sono in grado di prendere una delle azioni di follow che registriamo:

  1. VIEW - vederlo di profilo
  2. RATING - Votalo su una scala da 1-5 stelle
  3. Recensione - Recensione it
  4. COMPLETATA - Marco che sono stati lì
  5. PREFERITI - Marco che vogliono andare lì
  6. FAVORITE - Marco che è uno dei loro favoriti

Nella nostra tabella di database di posti ogni luogo contiene un conteggio del numero di volte che ogni azione di cui sopra è stata presa, così come la valutazione media data dagli utenti.

  • viste
  • feedback
  • avg_rating
  • completato
  • lista dei desideri
  • preferito

Quello che vogliamo essere in grado di fare è generare elenchi dei luoghi migliori utilizzando le informazioni di cui sopra. Idealmente, vorremmo essere in grado di generare questo elenco utilizzando un relativamente semplice query SQL senza bisogno di fare alcuna noia per calcolare campi aggiuntivi o luoghi di rango stack contro l'un l'altro. Detto questo, dal momento che abbiamo solo circa 50.000 posti che abbiamo potuto eseguire un processo di cron ogni notte per calcolare alcuni campi come posizionamento su diverse categorie se sarebbe fare una differenza significativa nei risultati complessivi delle nostre migliori posti.

Ti sarei grato se potesse fare alcuni suggerimenti su come dovremmo pensare spumeggiante posti migliori per la parte superiore, quali criteri dovremmo pesare più pesantemente, e dato che le informazioni - suggeriscono ciò che la query MySQL avrebbe bisogno di guardare come al fine di selezionare i primi 10 posti.

Una cosa da notare è che in questo momento siamo meno preoccupati con l'attività recente di un luogo di essere popolare -. Che significa che guardando le informazioni aggregate va bene e che i dati più recenti non ha bisogno di essere un peso maggiore

Grazie in anticipo per il vostro aiuto e consigli!

È stato utile?

Soluzione

La formula esatta per il favorito avrebbe bisogno di venire da voi, che chiameremo f (x).
Per l'attuazione effettiva vorrei aggiungere un campo popularity_score che avrei calcolare, come hai detto da un job cron ogni notte con f (x) per ogni riga.

Allora è semplicemente un caso di fare un "select toponimo dall'ordine tavolo popularity_score disc".

Ok - Diamogli una pugnalata popularity_score = (FAVORITE * 3 + COMPLETATA * 2 + WISHLIST) * * RATING VIEW / AVG_VIEWS_OF_ALL_PROFILES

Altri suggerimenti

Non ho un parere sul modo di pesare le cose.

Detto questo, perché non è sufficiente aggiungere una colonna popolarità alla tabella posizione? Tutto ad un tratto, la query SQL è incredibilmente semplice.

La parte difficile, naturalmente, è capire come e quando aggiornare tale valore. Ma dal momento che si sta salvando tutti i dati relativi all'attività, è sempre possibile rigenerare i valori popolarità dalle voci di registro.

In questo modo, si ottiene query veloci piacevoli per le posizioni "più popolare", e se si desidera cambiare il modo in cui popolarità è calcolato, si può farlo a volontà.

Se sei intelligente, si potrebbe essere in grado di elaborare una formula abbastanza semplice, in modo che la popolarità possono essere monitorati in tempo reale. Per esempio, se abbiamo curato solo di media delle recensioni, è possibile modificare la valutazione media con solo tre variabili:. La corrente media, il numero di volte in cui l'oggetto è stato valutato, e il nuovo valore di rating

Naturalmente, le cose si fanno più complesse quando si inizia mescolando in quante volte l'oggetto è stato visto, rivisto, i preferiti, ecc ... ma si potrebbe scoprire che si può ideare un metodo che è abbastanza computazionalmente a buon mercato che è possibile aggiornare il valore di popolarità globale su quasi ogni azione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top