Séparez vos données en deux parties: les données « canoniques » (la règle de récurrence) et « au service » (dates générées, en lecture seule en dehors de la régénération). Si les données canoniques changent, régénérez les données de "diffusion" à ce moment-là. Pour les récurrences infinies, conservez un certain nombre d'instances et générez plus d'occurrences si vous en manquez (par exemple, si l'utilisateur consulte son calendrier pour 2020). Si vous aviez une vitesse de processeur infinie, vous auriez seulement besoin des données canoniques - mais en réalité, faire tout le traitement de la date/heure pour toutes les règles de récurrence sur chaque page risque de prendre trop de temps ... donc vous échangez du stockage (et de la complexité) pour sauvegarder ce calcul répété. Le stockage est généralement bon marché, comparé au calcul requis pour un grand nombre d'événements. Si vous ne besoin de stocker les dates des événements, qui est vraiment très pas cher - vous pouvez facilement utiliser un entier de 4 octets pour représenter une date, puis générer une date complète/heure de cela, en supposant que vos récurrences sont tous fondé sur la date . Pour des récurrences basées sur le temps (par exemple "toutes les trois heures"), vous pouvez avoir des instants UTC complets - 8 octets représenteront cela jusqu'à une résolution assez fine aussi longtemps que vous en aurez probablement besoin.
Vous devez faire attention à maintenir la validité si - si une réunion récurrente change aujourd'hui, cela ne change pas quand il a est arrivé dans le passé ... si vous voulez probablement aussi ont canonique des données en lecture seule sur le moment où les récurrences se sont réellement produites. Évidemment, vous ne voudrez pas que cela garde le passé pour toujours, alors vous voudrez probablement "ramassez" les événements de plus de quelques années, en fonction de vos limites de stockage.
Vous devrez peut-être la possibilité d'ajouter des notes et des exceptions (par exemple « réunion ne se produit pas aujourd'hui en raison d'un jour férié » ou « déplacé à 16 heures ») sur une base par événement. Cela devient vraiment amusant quand vous changez la récurrence - si vous changez "tous les lundis" à "tous les mardis" gardez-vous les exceptions ou non? Comment faites-vous correspondre les exceptions lorsque vous passez de "tous les jours" à "chaque semaine"? Ce ne sont pas des questions qui concernent directement le stockage, mais les décisions de stockage affecteront la facilité d'implémentation de la politique que vous décidez.
si vous avez enregistré une date distincte pour chaque récurrence de chaque utilisateur qui a une récidive, il peut devenir beaucoup de données à la hâte. –
+ 1 favorisant la récurrence de stockage. Pensez à l'utilisation cas où un utilisateur déplace une instance d'un événement récurrent: elle a la possibilité d'appliquer le mouvement à tous les événements, tous les événements ultérieurs, tout cet événement, etc. – Fuhrmanator