2011-09-26 2 views
2

J'ai un tableau de bord pour les mises à jour en temps réel et les dernières notifications. Imaginez qu'il s'agit d'un système de blog où vous pouvez vous abonner aux publications et commentaires des auteurs. Je veux alors 2 types de notifications à apparaître dans mon tableau de bord, triées par temps d'insertion:Sélection de la base de données et tri des dates (tableau de bord Python en temps réel)

  1. Derniers articles
  2. Derniers commentaires

Imaginez que je veux seulement 10 mises à jour apparaissent lorsque je charge le tableau de bord (plus tard, je passe à travers ajax). Comment dois-je interroger la base de données et comment trier les résultats? J'ai pensé à interroger les 2 tables (messages et commentaires) pour les données que j'ai souscrites, ajouter ces données à une liste et trier ces résultats pour datetime, puis retourner les 10 dernières, mais je pense que c'est Ce n'est pas une très bonne solution car il faudrait beaucoup de temps pour trier si ces tables (et mes abonnements) commencent à croître.

Quelles sont vos réponses/réflexions pour ce problème?

+0

Utilisez-vous un framework web (comme Django) qui a un ORM? J'ai fait quelque chose comme ça il y a quelque temps dans Django avec environ un million de lignes et la récupération de base de données n'était pas un goulot d'étranglement. –

+0

J'utilise web2py avec DAL (supportant MySQL) et pymongo (supportant MongoDB) –

Répondre

2

Interrogez la première table en ordonnant un temps d'insertion décroissant et en limitant les résultats à 10. Ensuite, interrogez la deuxième table de la même manière. Puis fusionnez les résultats dans python et renvoyez les 10 premiers d'entre eux.

Un exemple django pourrait ressembler à ceci:

from operator import attrgetter 

recent_posts = Post.objects.order_by('-created')[:10] 
recent_comments = Comment.objects.order_by('-created')[:10] 
both_combined = list(recent_posts) + list(recent_comments) 
both_sorted = sorted(both_combined, key=attrgetter('created'), reverse=True) 
most_recent = both_sorted[:10] 
+0

Et si j'avais un bouton de chargement plus bas qui me donnerait les 10 prochaines mises à jour? avec cette solution, certaines mises à jour seraient manquantes. –

+0

Pour vous assurer que rien ne manque, vous devez passer un "dernier horodatage vu" à la vue "suivante", puis répéter les mêmes étapes, en ajoutant simplement un équivalent de 'WHERE created patrys

Questions connexes