2017-05-15 3 views
-2

Il ya un site de nouvelles - environ 50 000 nouvelles dans mysql db pour l'instant. J'ai besoin de créer une liste des nouvelles les plus intéressantes et les plus pertinentes pour chaque page de nouvelles et supprimer les éléments déjà affichés pour l'utilisateur actuel (la personnalisation réelle). J'ai déjà fait une liste de nouvelles vues dans les cookies. Tout ce dont j'ai besoin, c'est d'une meilleure approche architecturale pour filtrer les nouvelles.Personnalisation de l'utilisateur PHP

Je ne vois que des options de remorquage:

  1. Conserver dans la mémoire déjà calculé la liste complète des nouvelles les plus populaires (20-30K articles) et pour chaque remove demande du client les vues.
  2. Chaque fois que l'utilisateur ouvre la page, créez-lui à nouveau une liste d'éléments populaires.

    Dans l'option 1, nous pouvons utiliser la mise en cache avec APC, REDIS etc., mais toujours avoir une grande quantité de données copiées dans chaque requête qui consomme beaucoup de mémoire. Mais dans l'option 2, nous aurions besoin de demander à chaque fois que la DB ne soit pas rapide et que la CPU et la ressource DB ne consomment pas.

Alors est-il possible d'éviter d'utiliser autant de ressources et de le rendre rapide?

+1

Il y a trop de réponses possibles, sinon les bonnes réponses seraient trop longues pour ce format. Veuillez ajouter des détails pour affiner le jeu de réponses ou pour isoler un problème auquel vous pouvez répondre en quelques paragraphes. Je vous suggère de trouver un forum de développement (peut-être [Quora] (http://www.quora.com/Computer-Programming)?) Pour élaborer des généralités. Ensuite, lorsque/si vous avez des problèmes de codage spécifiques, revenez à Stack Overflow et nous serons heureux de vous aider. –

+0

Comme je l'ai dit j'ai besoin d'une approche architecturale comment puis-je manipuler les données dans mon cas et non l'extrait de code ou certains détails de bas niveau ... – Alex

Répondre

0

Vous pouvez faire quelque chose comme

SELECT ... article data .. FROM Articles 
LEFT JOIN ViewedArticles USING (articleId) 
LEFT JOIN Users USING (userId) 
WHERE ViewedArticles.articleId IS NULL AND Users.userId = :id 

Cela devrait choisir de sélectionner uniquement les articles, qui n'ont pas correspondant articleId dans le tableau ViewedArticles avec correspondance userId.