Question

Nous avons un site Web qui contient une base de données de lieux. Pour chaque lieu nos utilisateurs sont en mesure de prendre l'une des actions de suivi que nous enregistrons:

  1. VIEW - Voir son profil il
  2. Avis - Taux sur une échelle de 1-5 étoiles
  3. REVUE - Examen it
  4. REMPLI - Mark qu'ils ont été là
  5. COUP DE CŒUR - Mark qu'ils veulent y aller
  6. COUP DE COEUR - Mark qu'il est l'un de leurs favoris

Dans notre table de base de données de lieux chaque endroit contient un décompte du nombre de fois chaque action ci-dessus a été prise, ainsi que la note moyenne donnée par les utilisateurs.

    vues
  • évaluations
  • avg_rating
  • terminé
  • liste
  • favori

Ce que nous voulons être en mesure de faire est de générer des listes des meilleurs endroits en utilisant les informations ci-dessus. Idéalement, nous voulons être en mesure de générer cette liste à l'aide d'une requête SQL relativement simple sans avoir besoin de faire tout travail sur le terrain pour le calcul des champs supplémentaires ou des lieux de rang pile les uns contre les autres. Cela étant dit, puisque nous avons seulement environ 50 000 places que nous pourrions exécuter une tâche cron nuit pour calculer certains domaines tels que le classement sur les différentes catégories si elle ferait une différence significative dans les résultats globaux de nos premières places.

Je vous en serais reconnaissant si vous pouviez faire des suggestions sur la façon dont nous devrions penser à bulles les meilleurs endroits au sommet, quels critères nous poids plus lourd, et étant donné que les informations - suggèrent que la requête MySQL devrait ressembler à afin de sélectionner le top 10 des endroits.

Une chose à noter est que, à ce moment, nous sommes moins préoccupés par la récence d'un lieu d'être populaire -. Ce qui signifie que la recherche à l'information globale est fine et que les données plus récentes n'a pas besoin d'être plus fortement pondéré

Merci d'avance pour votre aide et conseils!

Était-ce utile?

La solution

La formule exacte pour le favori devrait venir de vous, nous l'appellerons f (x).
Pour la mise en œuvre réelle, je voudrais ajouter un champ popularity_score que je calcule, comme vous le dites d'un emploi de nuit à l'aide Cron f (x) pour chaque ligne.

Ensuite, il est tout simplement un cas de faire un « select toponyme de l'ordre de table par popularity_score desc ».

Ok - nous allons lui donner un coup de couteau popularity_score = (FAVORITE * 3 + TERMINE * 2 + FAVORIS) * * EVALUATION VIEW / AVG_VIEWS_OF_ALL_PROFILES

Autres conseils

Je n'ai pas d'avis sur la façon de peser les choses.

Cela dit, pourquoi ne pas ajouter simplement une colonne de popularité à la table de l'emplacement? Tout à coup, votre requête SQL est incroyablement simple.

La partie la plus délicate, bien sûr, est de déterminer comment et quand mettre à jour cette valeur. Mais puisque vous enregistrez toutes les données d'activité, vous pouvez toujours régénérer les valeurs de popularité des entrées du journal.

De cette façon, vous obtenez de belles requêtes rapides pour les emplacements « les plus populaires », et si vous voulez changer la popularité façon est calculée, vous pouvez le faire à volonté.

Si vous êtes intelligent, vous pourriez être en mesure de concevoir une formule assez simple pour que la popularité peut être suivi en temps réel. Par exemple, si nous ne souciés notes moyennes, vous pouvez modifier la note moyenne avec seulement trois variables:. La note moyenne actuelle, le nombre de fois que l'objet a été évalué, et la nouvelle valeur de notation

Bien sûr, les choses deviennent plus complexes lorsque vous commencez à mélanger dans combien de fois l'objet a été vu, revu, favorited, etc ... mais vous pouvez constater que vous pouvez concevoir une méthode qui est assez informatiquement pas cher que vous pouvez mettre à jour la valeur globale de popularité sur à peu près toutes les actions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top