44 votes

Quel est le meilleur moyen de représenter des "Événements Récurrents" dans la base de données?

Je suis en train de développer un planificateur et calendrier dépendant de cas d'application en C#, pour qui l'essentiel est de représenter des événements récurrents dans la base de données. Quel est le meilleur moyen de représenter des événements récurrents dans une base de données?

Plus De Détails:

Alors que la création de l'événement, je suis également à envoyer les invitations à certains utilisateurs et les invités devraient être autorisés à se connecter à la réunion, au cours de la fenêtre spécifiée(réunion de la durée) ou peut-être le déclin de la connexion lors de l'invité tentatives de login dire, 5 minutes avant l'heure de début de la réunion.

42voto

Bob Points 34449

Le sysjobs, sysjobsschedule et sysschedules des tables dans SQL Server fait un assez bon travail de ce. Je ne cherche pas à réinventer la roue, je venais de copier leur conception.

Voici quelques-uns des domaines importants de sysschedules

freq_type

Comment souvent une tâche en cours d'exécution de ce programme.

1 = Une seule fois

4 = tous les jours

8 = Hebdomadaire

16 = Mensuel

32 = Mensuellement, par rapport à freq_interval

64 = s'Exécute lorsque le service SQL Server Agent commence

128 = s'Exécute lorsque l'ordinateur est inactif

freq_interval

Jours que le travail est exécuté. Dépend de la valeur de freq_type. La valeur par défaut est 0, ce qui indique que freq_interval est pas utilisé. La valeur de freq_type Effet sur freq_interval

1 (une fois) freq_interval est inutilisée (0)

4 (tous les jours) Tous les freq_interval jours

8 (hebdomadaire) freq_interval a la valeur d'un ou de plusieurs des éléments suivants: 1 = dimanche, 2 = lundi 4 = mardi 8 = mercredi 16 = jeudi 32 = 64 vendredi = samedi

16 (mensuel) Sur la freq_interval jour du mois

32 (mensuel, relative) freq_interval est l'une des opérations suivantes: 1 = dimanche, 2 = lundi 3 = mardi 4 = mercredi 5 = jeudi 6 = vendredi 7 = samedi 8 = Jour 9 = jour de la Semaine 10 = jour de Week-end

64 (commence lorsque le service SQL Server Agent commence) freq_interval est inutilisée (0)

128 (fonctionne lorsque l'ordinateur est inactif) freq_interval est inutilisée (0)

freq_subday_type

Unités pour la freq_subday_interval. Peut être une des valeurs suivantes: Description de la valeur (l'unité)

1 À l'heure spécifiée

2 Secondes

4 Minutes

8 Heures

freq_subday_interval

Nombre de périodes freq_subday_type entre chaque exécution de la tâche.

freq_relative_interval

Lorsque freq_interval chaque mois, si freq_interval est de 32 (mensuel relatif). Peut être une des valeurs suivantes:

0 = freq_relative_interval est pas utilisé

1 = Premier

2 = Deuxième

4 = Troisième

8 = Quatrième

16 = Dernier

freq_recurrence_factor

Nombre de semaines ou de mois entre la date prévue de l'exécution d'un travail. freq_recurrence_factor est utilisé uniquement si freq_type est de 8, 16 ou 32. Si cette colonne contient 0, freq_recurrence_factor est pas utilisé.

23voto

Jon Skeet Points 692016

Eh bien, pour stocker la règle de récurrence lui-même, vous pouvez utiliser une version réduite de la RFC 5545 (et vraiment, je vous suggère de couper vers le bas fortement). À côté de quelque chose d'autre, qui le rendra facile pour l'exportation vers d'autres applications si vous le souhaitez.

Après que vous avez pris cette décision, pour le côté de la base de données, vous devez savoir si vous voulez stocker chaque occurrence de l'événement, ou tout simplement un record pour la répétition de l'événement, de l'élargir comme et quand vous en avez besoin. Bien évidemment, il est beaucoup plus facile à interroger la base de données lorsque vous en avez déjà tout élargi, mais il le rend plus difficile à maintenir.

Sauf si vous avez envie d'écrire quelques-unes assez complexe SQL qui peuvent être difficiles à tester (et vous aurez besoin d'un lot de tests unitaires pour toutes sortes de cas de coin) je vous conseille de vous rendre la base de données elle-même relativement "stupide" et écrire la plupart de la logique métier dans un langage comme Java ou C# - soit de ce qui peut être intégré dans des procédures stockées en fonction de votre base de données, bien sûr.

Une autre chose que vous devez vous poser est de savoir si vous devez composer avec les exceptions à des événements, un événement dans une série changeant heure, l'endroit, etc.

J'ai une certaine expérience avec la gestion d'agenda (j'ai passé la plupart de la dernière année de travail sur le calendrier bits de Google Sync via ActiveSync) et je dois vous avertir que les choses se compliquent vraiment rapidement. Tout ce que vous pouvez juger "hors de portée" est une bénédiction. En particulier, avez-vous besoin de travailler dans plusieurs fuseaux horaires?

Oh, et enfin - être très, très prudent lorsque vous faites de réelles arithmétique avec le calendrier des opérations. Si vous allez utiliser Java, veuillez utiliser Joda Temps plutôt que dans le haut- Calendar/Date les classes. Ils vous aideront beaucoup.

5voto

James Points 159

J'ai écrit ScheduleWidget pour résoudre ce problème. Il est déployé comme un package nuget et voici le site du projet pour elle.

0voto

Mark Redman Points 10816

J'ai pensé à cela aussi, bien que n'ont pas mis en œuvre, mais ce sont mes pensées pour une solution simple.

Lors de la configuration d'un événement c'est récurrent, demandez à l'utilisateur de spécifier la "date de fin" et de créer des événements pour chacun (basé sur la récurrence des options). Parce que c'est un événement périodique, établi un "récurrents ID" pour chacun de ces. Ce code sera ensuite utilisé pour marquer un événement récurrent et si vous modifiez un événement à venir, vous pouvez inviter l'utilisateur à appliquer ce pour le reste des événements futurs par effacer et recréer les événements récurrents avec un nouveau "récurrents" ID qui permettra également de différencier cet événement récurrent de l'ancien et ceux qui ont changé.

Espérons que cela a du sens et des commentaires.

0voto

Michael Dillon Points 18741

Je voudrais enregistrer des événements récurrents comme deux choses distinctes dans la base de données. Tout d'abord, dans un tableau des événements, d'enregistrer chaque et chaque occurence de l'événement. Deuxièmement, avoir des répétitions de tableau dans lequel vous enregistrez les détails que vous demandez pour configurer l'événement récurrent. La date de début, la périodicité, le nombre d'occurrences, etc.

Alors vous pourriez penser à mettre tout ensemble, en mettant le PK de récidives dans chacun des enregistrements d'événement comme un FK. Mais une meilleure conception serait de normaliser la table d'événements en deux tableaux, l'un qui est juste la barebones d'un événement, et celui qui a les détails, ce qui pourrait maintenant être en se référant à de multiples événements. De cette manière, chaque enregistrement de l'événement, récurrents ou non, a un FK à la PK de la eventdetails table. Puis dans eventdetails, enregistrement de la PK de récidives quelque part le long de avec l'ordre du jour, les invités, etc. La récurrence de l'enregistrement n'a pas de lecteur de quoi que ce soit. Par exemple, si vous souhaitez une liste de tous les événements récurrents, vous pouvez regarder à travers eventdetails pour tous les événements avec une valeur non nulle FK pour les récidives.

Vous devez être prudent de synchroniser toutes ces choses, afin que vous insérez ou supprimez des événements lors de la récurrence des modifications de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X