Dois-je stocker des dates ou des règles de récurrence dans ma base de données lors de la construction d'une application de calendrier?

StackOverflow https://stackoverflow.com/questions/4239871

Question

Je suis la construction d'un site de calendrier (ASP.NET MVC) application (pensez version simple de perspectives) et je veux commencer à soutenir les événements de calendrier qui sont récurrents (mensuel, annuel, etc.)

en ce moment je stocke les dates réelles dans ma mais je voulais savoir si, avec la récurrence, est-il logique de continuer à dates de magasin (avec une coupure évidente), ou devrais-je stocker les options de récurrence et de générer les dates à la volée.

Il me fait penser comment perspectives, Google Mail, etc fait ceci ou tout autre service de soutien récurrents éléments de calendrier.

Y a-t-il des suggestions à ce sujet?

Était-ce utile?

La solution

Séparer 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 modifications de données canoniques, régénérer les données « au service » à ce moment-là. Pour récurrences infinies, garder un certain nombre d'instances et de générer plus si vous exécutez (par exemple si les regards des utilisateurs à leur calendrier pour 2020).

Si vous aviez la vitesse du processeur infini, vous auriez seulement besoin des données canoniques - mais en réalité, faire tout le traitement de date / heure pour toutes les règles de récurrence sur tous page vue est d'être probable trop de temps ... si vous le commerce hors un espace de stockage (et la complexité) pour enregistrer ce calcul répété. Le stockage est généralement assez pas cher, par rapport au calcul nécessaire pour un grand nombre d'événements. Si vous uniquement nécessité 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 votre récurrences sont toutes les dates en fonction. Pour récurrences en fonction du temps (par exemple, « toutes les trois heures »), vous pouvez plein instants UTC - 8 octets représenterez que jusqu'à une résolution assez fine pour aussi longtemps que vous êtes susceptibles d'avoir besoin

.

Vous devez faire attention à maintenir la validité si - en cas de changement de réunion périodique aujourd'hui , cela ne change pas quand il a est arrivé dans le passé ... donc vous voulez probablement aussi vous canonique des données en lecture seule sur le moment où récurrences effectivement eu lieu. Il est évident que vous ne voulez pas que pour garder le passé pour toujours, si vous voulez probablement « déchets Collect » événements plus de quelques années, en fonction de vos limites de stockage.

Vous pouvez aussi avoir besoin 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 pouvez-vous même faire correspondre les exceptions lorsque vous changez de « tous les jours » à « chaque semaine »? Ce ne sont pas des questions qui sont directement sur le stockage - mais les décisions de stockage auront une incidence sur la façon dont il est facile de mettre en œuvre toute politique que vous choisissez

.

Autres conseils

Vous devrez gérer séparément les événements et les événements.

EVENEMENT WISE: Pour les événements, vous devez stocker les règles de recurence (qui peut être un RRULE comme spécifié par rfc5545 mais aussi un ensemble explicite de dates comme rdate dans rfc5545), mais aussi des exceptions (voir EXDATE de rfc5545 et peut-être exrule comme dans RFC2445). Vous devrez également garder une trace des changements dans les règles: Les changements dans rdate, EXDATE ne posent aucun problème quand ils se produisent à l'avenir et à être ignorés pour les dates antérieures. Les changements dans RRULE sont plus difficiles comme ayant un impact occurences précédentes. Ma préférence personnelle est d'ajouter une propriété spécifique pour l'ancien et le nouveau RRULE de préciser leur date de début et fin de validité respective.

si l'événement a une durée limitée dans le temps (disons COUNT ou jusqu'à ce que la propriété sont présents), vous devez stocker le début et la fin de votre table pour permettre l'interrogation plus facile des événements (en particulier lorsque la recherche d'événements en dehors de la fenêtre de votre temps précalculé (voir ci-dessous ), il peut aider à réduire le nombre d'événements pour lesquels le calcul doit être refait à neuf).

Occurrence WISE: pour occurences vous devez stocker des instances dans une fenêtre prédéfinie autour actuelle (disons +/- 6 mois ou 12 mois et calculé sur une base régulière) et tenir des registres de ce pour permettre recalcul si vos utilisateurs veulent voir plus loin dans l'avenir (pour problèmes de performances). vous devriez également considérer calculer l'indice (RÉCIDIVE-ID) pour aider plus facile constatation de l'occurrence suivante.

moins sur l'arrière-plan, mais plus sur le front-end, vous devriez également garder une trace des changements TZID pour demander à l'utilisateur si un événement qui était prévu sur un TZID donné si elle est destinée à rester sur le fuseau horaire actuel de celui-ci a besoin d'être mis à jour (pensez à quelqu'un dans l'île de Samoa qui avait calendrier une réunion le vendredi 30 décembre 2011 avant que le pays a décidé ce jour n'existerait pas), vous pouvez de la même demander si un événement qui se produit pendant l'heure d'été est destiné à « ne jamais se produire » ou « passer deux fois » (plus sur ce sujet ici )

Note: vous voudrez peut-être envisager un soutien au-delà de ce qui est défini dans rfc5545 en termes de règles de recurence et ajouter des règles récurrentes soutien religieux ( voir l'introduction USNO à des calendriers ou en version imprimée "Calendrical calculs"(troisième édition) de E. Reingol et N. Dershowitz).

Puisque vous posez des questions sur la mise en œuvre existante, vous pouvez facilement vérifier le schéma de base de données de Sunbird (sqlite) ou de )

Je devais construire un système qui a travaillé avec la planification et nous avons fait les deux. Voici ce que nous avions

  • un ensemble de tables qui ont gardé la trace de l'annexe.
  • une table qui a gardé la trace des instances précédentes du calendrier (quand ils effectivement eu lieu)
  • une table qui a gardé la trace de l'instance dernière et suivant (lorsque l'élément suivant est dû à se produire en fonction de la dernière fois) Vous n'avez pas besoin de cette table, mais nous l'avons utilisé, parce que sinon vous constamment calculera si un élément doit se produire maintenant

Avec la planification, les choses peuvent devenir vraiment difficile parce que vous devez vous rappeler que, à tout moment, l'horaire peut changer. En outre, un élément peut être dû lorsque votre application ne fonctionne pas, et quand il démarre à nouveau, vous devez savoir comment identifier les articles en souffrance.

En outre, nous nous sommes assurés que les tables qui ont gardé la trace de l'horaire réel se retrouvent seuls. La raison est que ce sont les plus ensemble complexe de tables dans le système et nous voulions être en mesure de les réutiliser afin qu'ils puissent être utilisés pour des choses différentes que l'ordonnancement nécessaire. Tels que l'envoi de courriels d'administration, l'envoi de notifications, et la maintenance des serveurs comme le nettoyage des fichiers journaux.

Je voudrais certainement utiliser votre deuxième option. Utilisez différentes options de récurrence, le stocker séparément et calculer à la volée. Stocker toutes ces dates serait une cargaison de données qui ne sont pas nécessaires.

Voici une bonne réponse pour compléter votre question.
Structure de données pour stocker des événements récurrents?

En outre, comme une note de côté. J'ai commencé à stocker tout le temps UTC afin que vous ayez une base commune si vous avez besoin d'utiliser plusieurs fuseaux horaires.

J'ai eu un problème similaire dans une application web que j'ai fait il y a quelques années (il y a bien peut-être une meilleure façon maintenant :)). Je voulais inclure un programmateur qui a toutes les fonctionnalités d'événements récurrents, le temps de traitement, jours, semaines, mois, années et exceptions, pour que je puisse avoir des règles comme:

1) Chaque jour à 10h les mercredis exceptés

2) Toutes les 2 heures avec un maximum de 4 itérations par jour

3) Tous les premiers lundis du mois

etc ..

Enregistrement des dates / heures récurrents était possible, mais inflexible. Chaque itération de votre événement change lorsque le serait « maximum » être. Et combien de temps avant que vous regardez?

En fin de compte, j'ai écrit une classe de planification personnalisée qui peut lire et écrire à une chaîne. Ce fut la chaîne qui a été stocké dans la base de données et une fonction simple peut être appelé pour savoir quand la prochaine occurrence est.

Vous devez stocker certains d'entre eux à coup sûr. La puissance de l'utilisateur modifier l'un des événements, laissant les autres intacts. (Vous avez probablement rencontré la question. « ? Est-ce que vous voulez modifier tous les événements récurrents ou que celui-ci » dans certains calendriers, à savoir Windows Mobile)

Vous pouvez également stocker des événements passés et retirez pas lorsque l'utilisateur supprime l'événement récurrent.

Si vous stockez tous les autres ou les générer est un détail de mise en œuvre. Je préférerais les générer, si possible.

Dans tous les cas, vous aurez envie d'avoir une pièce d'identité de l'événement récurrent stocké à chaque événement, ainsi que certains drapeau vous dire si l'événement a été modifié par la suite. Ou dans l'approche plus compliquée, un drapeau pour chaque récit de propriété d'événement, si sa valeur par défaut (de l'événement récurrent) ou si elle a été modifiée pour ce cas particulier. Vous en aurez besoin lorsque l'utilisateur décide de modifier l'événement récurrent.

Notez que la plupart des réponses penchent vers la sauvegarde des données générées. Mais assurez-vous que vous considérez votre cas d'utilisation.

De retour dans les jours mes serveurs ont été limités par io avec beaucoup de rien faire cpu. Aujourd'hui, vous avez ssd (si vous pouvez vous permettre les, sinon votre gauche avec un vieux HD tournant), mais noter que la valeur de base a augmenté aussi.

La chose agréable au sujet de ce genre de calculs est que vous pouvez les diviser facilement et de les donner à vos nombreux noyaux ou même à quelques serveurs bon marché dans un réseau local. Souvent moins cher que la mise en place d'un cluster NoSQL ou d'aller le chemin du cluster base de données complète.

Et pourrait aussi être une solution de rechange cache, juste en cache l'affichage du calendrier, pas besoin de faire tous les calculs à chaque fois que rien n'a changé.

Mais comme dit cela dépend de votre cas d'utilisation. Ne vous contentez pas de suivre les réponses ci-dessus mais faites vos propres calculs si vous avez le temps et que prendre une décision.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top