web-dev-qa-db-fra.com

Conception de table de base de données pour les tâches de planification

Je veux pouvoir créer des horaires pouvant être exécutés en fonction d'une date fixe, répétée quotidienne, répété un jour de la semaine, répété sur un mois donné de l'année, répété à une date donnée chaque année et répétée à une période donnée de la journée.

Comment savoir comment construire les tables de base de données de ce problème?

Edit n ° 1

Fondamentalement, j'écris une application permettant aux utilisateurs de planifier des salutations préconfigurées à envoyer à divers moments préconfigurés. Je sais que j'ai besoin d'une table qui stocke des informations sur une planification (ex. Noël, marketing One, ... | et lorsque l'horaire devrait fonctionner). Ensuite, une autre table pour enregistrer quel horaire a couru, ce qui le saluant a envoyé, à qui et quel email; fondamentalement une table de transactions.

Mon problème est de concevoir la table de planification car, je souhaite permettre aux utilisateurs d'exécuter l'horaire à une date précise, un jour particulier de la semaine (récurrente), un jour donné de chaque mois, sur une période donnée quotidienne et sur un jour/mois particulier (ex. 25/12) chaque année.

Comment créer un ensemble de tables pour la planification qui prendra soin de ces entrées de manière flexible?

16
Tebo

C'est la structure de la table que j'ai proposée;

Schedule
 - ScheduleName
 - ScheduleTypeId (Daily, Weekly, Monthly, Yearly, Specific)
 - StartDate
 - IntervalInDays
 - Frequency
 - FrequencyCounter

ScheduleDaily
 - ScheduleDailyId 
 - ScheduleId
 - TimeOfDay
 - StartDate
 - EndDate

ScheduleMonthly
 - ScheduleMonthlyId
 - ScheduleId
 - DayOfMonth
 - StartDate
 - EndDate

ScheduleSpecific
 - ScheduleSpecificId
 - ScheduleId
 - SpecificDate
 - StartDate

...

ScheduleJob
 - ScheduleJobId
 - ScheduleId
 - ScheduleTypeId
 - RunDate
 - ScheduleStatusId
20
Tebo

Microsoft SQL Server dispose d'une conception efficace et flexible: https://msdn.microsoft.com/en-us/library/ms178644.aspx?f=255&msppperror=-2147217396

18
Rob Kraft

J'ai lu les réponses ci-dessus et je pense que beaucoup de choses sont inutiles, corrigez-moi si je me trompe.

Voici ce que je pense devoir être fait:

calendrier


  • Identifiant

  • type (quotidien, mensuel, hebdomadaire, fixe, annuel) - Enum

  • fréquence (peut être 1-7 [jours de la semaine], 1-30 (ou 28) [jours de mois], 1-365 [Jours de l'année] ou NULL (pour quotidiennement, fixe) - Arrayfield (de l'INTS) - [ 1, 7] OR [23] OR [235] ou null

  • temps (heure de la journée en UTC) - Arrayfield (de Char Strings - ['9:00', '13: 30 ']

  • date (pour type fixe) - DateTime - 2009-03-21

  • is_active (booléen) - pour permettre, désactiver le calendrier

  • nom (Charfield) - Si vous voulez nommer l'horaire

Le reste des champs aurait besoin de contexte à ce que vous construisez.

Maintenant, pour cela, je pense à gérer un cronjob tous les 30 minutes (je prends l'entrée de temps séparé par 30 minutes) qui exécute un script (commande de gestion de Django dans mon cas) qui filtre des horaires de cette table à exécuter:

La requête serait quelque chose comme ça:

current_day_of_week = 3
current_day_of_month = 24
current_day_of_year = 114
current_time = 13:30
current_date = 2019-04-24

Filter records that match the below query(not even psuedo code)(I'm using Q objects(https://docs.djangoproject.com/en/2.2/topics/db/queries/#complex-lookups-with-q-objects)

Q(daily AND current_time) OR
Q(weekly AND current_day_of_week AND current_time) OR
Q(monthly AND current_day_of_month AND current_time) OR
Q(yearly AND current_day_of_year AND current_time) OR
Q(fixed AND current_date AND current_time)
3
Gourav Chawla

Je pense que la réponse acceptée est beaucoup plus compliquée que nécessaire. Cela peut être fait avec une seule table comme celle-ci:

Schedules

 - Id :int
 - Greetingid :int
 - Startdate :date
 - Frequencytype :char(1)
 - Frequencyinterval :int
 - Timeofday :time

FréquenceType serait l'une des valeurs suivantes

  • 'O' = une fois
  • 'D' = quotidiennement
  • 'W' = hebdomadaire
  • 'M' = mensuel
  • 'A' = annuellement

FréquenceInterval serait numérique et le sens de la valeur dépend de la valeur de la fréquence de fréquence

  • Si TYPE = "Une fois", la valeur = 0 (aucun intervalle) est exécutée sur le démarrage
  • Si type = 'quotidien' puis valeur = # d'intervalle de jours
  • Si type = 'hebdomadaire' puis 1 à 7 pour la journée de la semaine
  • Si Type = 'Mensuel' puis 1 à 31 pour la journée du mois du mois
  • Si TYPE = 'annuellement' puis 1 à 365 pour le jour de l'année
1
Vincent

Depuis que vous parlez de planifications, je suppose que vous souhaitez créer une demande de traitement par lots de gestion et d'exécution d'emplois.

Vous pouvez vérifier Spring Batch Meta Data Design pour une implémentation de référence. Cependant, la conception exacte dépendrait de votre exigence. Ceci est juste un pointeur.

1
Husain Basrawala

Pour faciliter votre travail, vous pouvez utiliser un planificateur existant pour la partie de planification. In Java Il existe par exemple un quartz ou une bibliothèque que j'ai écrit moi-même, dB-planificateur .

db-scheduler est facilement embormeable et dispose d'une prise en charge hors de la boîte pour les tâches sur un calendrier récurrent (durée fixe, quotidiennement, etc.). Les temps d'exécution sont persistés dans une seule table de base de données, de sorte qu'il survit à redémarrer.

0
Gustav Karlsson