2011-01-02 6 views
0

Je veux savoir quels articles un utilisateur a lu sur un site Web.Suivi des pages vues et affichage des données associées

Ensuite, avec ces données, être en mesure de savoir:

1) - top articles N lu dans la dernière heure/jour/semaine/mois

2) - Recommandations show ("les utilisateurs qui lisent ce , lire aussi que ")

3) - même que (1), mais pour une section spécifique sur le site

Depuis que le site a un trafic élevé (> 1M vues/jour) je ne peux pas utiliser un RDBMS pour cela.

J'ai commencé à regarder NoSQL (cassandra spécifiquement) et puisque c'est tout nouveau pour moi, je ne suis pas sûr que ce soit ce dont j'ai besoin ou non.

Je suis possitive je ne suis pas le premier à avoir besoin de quelque chose comme ça, mais je n'ai pas trouvé de liens/articles me donnant des indications sur la façon de faire quelque chose comme ça. NoSQL est-il la meilleure approche? Des conseils sur le modèle de données?

Merci.

Répondre

0

SQL le fera très heureusement. Un million de vues par jour est seulement dix par seconde; la plupart des bases de données en feront plusieurs centaines facilement.

Vous devriez déjà avoir une table pour les articles et une table pour les utilisateurs; vous devrez créer une table Lire ce qui est une relation plusieurs-à-plusieurs entre les utilisateurs et les articles et peut-être un horodatage. Chaque fois que vous servez un article, vous ajoutez une entrée à la table de lecture, en disant simplement 'Utilisateur x lisez simplement l'article y'

Vous pouvez ensuite poser des questions telles que "Combien de fois l'article a-t-il été lu la semaine dernière? », ou« Combien d'articles le lecteur moyen regarde-t-il les jeudis? »

Pour la vitesse, vous pouvez également trouver utile de prétraiter certaines de ces informations et de procéder à une dénormalisation sélective, par exemple en gardant les comptes par article de combien de fois il a été lu

Edit:.

Je suis tenté de vous référer à http://nosql.mypopescu.com/post/1016320617/mongodb-is-web-scale - être "NoSQL" ne réduit pas la quantité de travail nécessaire ou le fait tourner magiquement plus vite (bien qu'il soit souvent plus facile d'y lancer plus de matériel, si vous pouvez problème sous une forme qu'il aime).

« Les utilisateurs qui ont lu ce lire aussi: »

SELECT 
    Article.id, OtherArticle.id as oid, COUNT(*) AS cnt 
FROM 
    Article 
    JOIN Read AS R1 ON Article.id=R1.article_id 
    JOIN Read AS R2 ON R1.user_id=R2.user_id AND NOT R1.article_id=R2.article_id 
    JOIN Article AS OtherArticle on R2.article_id=OtherArticle.id 
GROUP BY 
    OtherArticle.id, OtherArticle.title 
ORDER BY 
    cnt DESC, OtherArticle.title ASC 

par tous les moyens voir combien de temps cela prend pour courir; Je conserverais probablement le résultat comme une table de référence pour une utilisation immédiate, et le mettre à jour avec un processus d'arrière-plan toutes les deux heures.

+0

oui, mais est-ce l'échelle? dans un mois, j'ai environ 40 millions d'enregistrements, quand un utilisateur visite un article, je dois leur montrer "les utilisateurs qui ont vu cela, ont également vu que". c'est rejoindre et regrouper une grande quantité d'enregistrements. Puisque le nouveau contenu est constamment ajouté je ne peux pas "pré-calculer ces choses" – Zake80

0

Hmm easyrec a exactement les fonctionnalités dont vous avez besoin et peut gérer des actions 1M (il utilise MySQL) vérifier le fil forum sur les actions max: forum topic

Questions connexes