30

決まった日付に基づいて実行し、毎日繰り返し、特定の曜日に繰り返し、特定の月に繰り返し、毎年特定の日付に繰り返し、次の場所で繰り返すことができるスケジュールを作成できるようにしたいと考えています。 1日の特定の時間。

この問題のデータベーステーブルを作成するにはどうすればよいですか?

編集#1

基本的に、私はユーザーが事前設定された挨拶をさまざまな事前設定された時間に送信するようにスケジュールできるようにするアプリケーションを書いています。スケジュールに関する情報(例:クリスマス、マーケティングワン、... |およびスケジュールの実行時期)を格納するテーブルが必要なことはわかっています。次に、実行されたスケジュール、送信された挨拶、誰に、どの電子メールを記録するための別のテーブル。基本的にトランザクションテーブル。

私の問題は、スケジュールテーブルの設計です。これは、ユーザーが特定の日付、特定の曜日(定期的)、毎月特定の曜日、毎日特定の時間にスケジュールを実行できるようにするためです。毎年特定の日/月(例:25/12)。

これらの入力を柔軟に処理するスケジュール用のテーブルのセットを作成するにはどうすればよいですか?

4

5 に答える 5

28

これは私が思いついたテーブル構造です。

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
于 2012-09-12T10:37:26.477 に答える
28

Microsoft SQL Serverの設計は効率的で柔軟です:https ://msdn.microsoft.com/en-us/library/ms178644.aspx

于 2015-05-14T14:00:04.083 に答える
10

受け入れられた答えは、必要以上に複雑だと思います。これは、次のような単一のテーブルで実行できます。

Schedules

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

Frequencytypeは、次のいずれかの値になります

  • 'O'=1回
  • 'D'=毎日
  • 'W'=毎週
  • 'M'=毎月
  • 'A'=毎年

Frequencyintervalは数値であり、値の意味はfrequencytypeの値によって異なります。

  • type ='Once'の場合、value = 0(間隔なし)のスケジュールは開始日に実行されます
  • type ='Daily'の場合、value =#日間隔
  • type ='Weekly'の場合、曜日は1から7
  • type ='Monthly'の場合、その月の日は1から31まで
  • type ='Annually'の場合、その年の日は1から365
于 2019-10-23T22:17:44.373 に答える
6

上記の回答を読みましたが、多くのことが不要だと思います。間違っている場合は訂正してください。

これが私がすべきだと思うことです:

スケジュール


  • Id

  • タイプ(日次、月次、週次、固定、年次)-列挙型

  • 頻度(1〜7 [曜日]、1〜30(または28)[月]、1〜365 [曜日]、またはnull(日、固定の場合)-ArrayField(intの)-[ 1、7] OR [23] OR [235] OR null

  • 時間(UTCでの時刻)-ArrayField(文字列の-['9:00'、'13:30']

  • 日付(固定タイプの場合)-日時-2009-03-21

  • is_active(boolean)-スケジュールを有効または無効にするため

  • name(CharField)-スケジュールに名前を付ける場合

残りのフィールドには、構築しているものへのコンテキストが必要です。

さて、これのために私は実行する必要があるこのテーブルからスケジュールをフィルタリングするスクリプト(私の場合はdjango管理コマンド)を実行する30分ごとにcronjobを実行することを考えています(私は30分で区切られた時間入力を取っています):

クエリは次のようになります。

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)
于 2019-04-24T10:07:49.297 に答える
0

スケジュールを保存するための次の汎用スキーマ(PostgreSQL)を含む単純なテーブルから始めることができます。「ジョブ」と呼ばれるスケジュール実行のすべてのインスタンスを検討してください。

CREATE TABLE Schedule (
    id SERIAL UNIQUE,                      -- unique identifier for the job
    name varchar(64) NOT NULL,             -- human readable name for the job
    description text,                      -- details about the job
    schedule varchar(64) NOT NULL,         -- valid CRON expression for the job schedule
    handler varchar(64) NOT NULL,          -- string representing handler for the job
    args text NOT NULL,                    -- arguments for the job handler
    enabled boolean NOT NULL DEFAULT TRUE, -- whether the job should be run
    created_at timestamp NOT NULL,         -- when was the job created
    updated_at timestamp NOT NULL,         -- when was the job updated
    start_date timestamp,                  -- job should not run until this time
    end_date timestamp,                    -- job should not run after this time
    last_triggered_at timestamp,           -- when was the job last triggered
    meta json                              -- additional metadata for the job 
);
于 2020-03-25T06:16:33.920 に答える