2009-06-03 10 views
20

Sur n'importe quel site Web, comme sur StackOverflow, chaque question a un nombre de vues, et l'utilisateur lisant une question mais ayant lu précédemment ne comptera pas deux fois.Comment "View Count" est le mieux implémenté?

J'ai quelques idées sur la façon dont il est implémenté et en utilisant quelles tables pour le faire.

Selon vous, quelle est la meilleure façon de mettre en œuvre cette solution?

Répondre

10

Vous avez un couple d'options comme je le vois.

Cookies

Vous pouvez stocker un cookie dans le navigateur des utilisateurs pour chaque page que vous vues connexion. Vérifiez l'existence de ce cookie et n'enregistrez pas de vue si le cookie existe déjà. Inconvénient à cela est que cela ne fonctionnera pas si les cookies sont désactivés ou quelqu'un essaie de jouer le système. Sur le plan positif, vous n'avez pas à vous préoccuper du stockage de millions/milliards de lignes de données de table.

Database

Vous tenir un dossier pour chaque vue. Relier cet enregistrement à un utilisateur d'une manière ou d'une autre, par ex. MemberID, adresse IP; quelque chose qui devrait être unique à l'utilisateur. L'adresse IP n'est pas idéale mais suffisante si vous ne demandez pas aux utilisateurs de se connecter.

Vous auriez par exemple une table avec les colonnes suivantes,

  • ArticleID (clé étrangère)
  • UserID (clé étrangère)
  • Date de

La date sera utile pour plusieurs raisons,

  • Rapports. Vous pouvez construire de bien meilleures statistiques une fois que vous savez quand chaque vue a été enregistrée.
  • Afficher les délais. Par exemple, vous pouvez uniquement stocker une vue par utilisateur et par heure. Avec la colonne de date, vous pouvez le faire.

Si votre application devient populaire dans cette situation, vous devrez faire face aux implications de stockage. Je lance une application Facebook populaire qui se traduit par l'ajout de plus de 100 000 lignes de vue chaque jour. D'un point de vue réaliste, cependant, si votre application devient si populaire qu'elle devient un problème, vous aurez des problèmes beaucoup plus importants à gérer.

+0

aviez-vous un exemple de code? – AminM

1

Lorsque la plupart des visiteurs de votre site sont enregistrés, il est relativement facile de s'assurer qu'aucun d'entre eux ne soit compté deux fois.

Je ne sais pas si SO compte les vues des invités. Je suppose que je pourrais vérifier, mais il est tard.

+0

Je viens de voir une question plusieurs fois et le compte n'a pas changé après la première fois. –

+1

Je pense que cela ne compte pas non plus les vues de l'OP - donc si je pose une question et que je regarde ensuite le nombre de vues, je pense que c'est le nombre distinct d'utilisateurs qui ont regardé la question. –

2

Réponse courte: Cela dépend! Cela dépend vraiment de la précision avec laquelle vous voulez que votre compte soit. Est-il acceptable qu'une personne puisse être enregistrée deux ou trois fois?

  • Cela dépend de ce que vous allez utiliser les données. Si vous voulez faire d'autres choses intéressantes avec les données (statistiques, liste des vues récentes, etc.), vous pouvez envisager de stocker toutes les vues individuelles dans une base de données. Cela peut entraîner une énorme table de sorte que vous devez chose à travers avant de l'implémenter. J'ai déjà utilisé des cookies combinés avec une base de données en mémoire pour stocker les vues individuelles (pour des raisons évidentes j'ai stocké le nombre de vues réelles dans une table de base de données persisté sur le disque). Je pourrais le faire parce que les statistiques ne signifiaient rien.

  • 0

    Je vais essayer de donner une réponse du point de vue fonctionnel.

    compte count par utilisateur - pour les utilisateurs enregistrés. pour les utilisateurs anonymes - par session. La vue d'incrément compte sur la première vue et sur n'importe quelle vue après une mise à jour importante par quelqu'un d'autre que la personne qui regarde l'objet.

    vue de l'affiche au moment de la création ne doit pas compter

    vous pouvez imaginer le faire plus simple aussi, mais je l'ai essayé de penser à une solution idéale.

    1

    Il semble que stackoverflow ne comptabilise pas les utilisateurs invités (non connectés) qui consultent un sujet. Le problème avec le comptage des vues d'utilisateurs anonymes est que votre compteur peut être gaming. Quelqu'un peut toujours supprimer le cookie et afficher à nouveau. La consignation des vues est la solution la plus sûre pour l'exactitude, mais bien sûr vous avez deux problèmes majeurs: la taille de la table et le manque d'utilisateurs invités/anonymes. Cela m'étonne que stackoverflow n'enregistre pas les utilisateurs invités (non ouverts). Je pense que la majorité des opinions viendraient de ces utilisateurs faisant des recherches sur google.

    9

    Sur mon site Web, je traite le comptage des vues des invités et la «masse de données» que cela produit en divisant le nombre de vues en utilisant un nombre aléatoire. Disons que j'ai un générateur de nombres aléatoires avec une bonne distribution entre 0 et 1, et que je reçois 100 000 vues par jour sur une page particulière. Si j'appelle la fonction 'logView()' à chaque vue, mais génère un nouveau nombre aléatoire et n'enregistre vraiment la vue sur la base de données que lorsque le nombre aléatoire est < 0.001, alors pour les 100.000 vues 100 000 * 0,001 = 1 000 fois.

    Si je veux retourner un nombre de vues, alors je divise juste mon numéro de DB par la même valeur, par exemple. 1000/0,001 = 100 000. Ceci est approximativement précis aux 1000 vues les plus proches. Il est évident que vous pouvez choisir une plage de nombres aléatoires en fonction de la charge de votre site, et même la modifier si votre charge change radicalement (il vous suffit de modifier vos valeurs stockées en conséquence).

    En outre, une page avec seulement 1000 vues ne peut même pas obtenir un 1 dans le nombre de vues, mais si vous avez une page avec 100 000 vues, celle avec 1000 est assez insignifiante.

    +0

    Bonne idée. Merci pour le partage –

    Questions connexes