1

J'ai un modèle Event avec start_time & end_time de ndb.DateTimeProperty() types de propriété.Evénements récurrents dans le magasin de données/NDB de Google

Je recherche normalement des événements avec une requête comme Event.query(Event.start_time >= START_OF_THE_MONTH, Event.start_time <= END_OF_THE_MONTH).

Quelle serait la meilleure approche pour ajouter la prise en charge des événements récurrents? La première chose qui vient à l'esprit est de créer chacun des événements individuellement mais avec un événement qui se répète tous les jours - c'est beaucoup d'entités créées (et à quel point devront-elles être créées pendant une année? ?). Bien que cette approche fasse fonctionner les requêtes de code & existantes, elle est très coûteuse et inefficace. Ensuite, en créant une seule entité pour l'événement récurrent complet avec une propriété qui stocke une règle de fréquence à laquelle l'événement se répète, puis, en plus de la requête ci-dessus - interroger à nouveau le modèle pour tous les événements récurrents seulement jusqu'à un certain point où il y a trop d'événements récurrents ...

Quoi d'autre est-ce approprié pour ndb et est évolutif, idéalement avec le moins de changements au code existant/requêtes?

+0

Combien d'événements prévoyez-vous gérer tous les mois? – janscas

+0

@janscas Je ne m'attends pas à beaucoup, ne devrait pas être plus de ~ 15-20 par utilisateur, je suis juste préoccupé par les pires scénarios où un utilisateur peut créer plusieurs événements récurrents quotidiens (tester des choses ou autre, qui ralentira un peu l'application pour cet utilisateur si une entité par événement est créée et qu'une vue mensuelle est demandée). –

Répondre

1

Je comprends que vous devez interroger les événements d'un mois donné de l'année. Je suppose également que les événements récurrents ont une sorte de date d'expiration. Donc, ce que vous pouvez faire est de changer la propriété start_date en propriété répétée (si cela casse une partie de votre code, vous pouvez créer une nouvelle propriété appelée 'target_dates' ou autre chose).

target_dates = ndb.DateProperty(repeated=True, indexed=True) 

Ensuite, lorsque vous enregistrez l'événement, calculer la plage de dates (en mois) cet événement est disponible et les stocker dans une liste:

start_date = datetime.date(year=2017, month=1, day=1) 
end_date = datetime.date(year=2017, month=5, day=1) 
target_dates = [datetime.date(year=2017, month=1, day=1), ... , datetime.date(year=2017, month=5, day=1)] 

Ce que je ferais alors, est de faire la même requête que vous avez faite, mais avec les target_dates.

Une autre approche consiste à effectuer deux requêtes de clés distinctes (requêtes rapides et bon marché car elles utilisent l'index de propriété). Une requête pour interroger les événements non récurrents du mois et une autre pour interroger les événements récurrents (en utilisant éventuellement la date de fin). Puis rejoignez le jeu de résultats et récupérez les entités avec get_multi. De plus, vous gagnez des entités mises en cache ici.

Je ne suis pas sûr que cela s'intègre dans votre application, mais avec l'information fournie est tout ce que je peux vous aider dès maintenant.