2012-01-29 1 views
0

特定のイベントのアラームを特定の日時に設定できるアプリケーションがあります。例えばのために: - :毎週日曜日、月曜日と水曜日午前7時と午後9時に発生する -データベースに格納されているユーザー定義のスケジュールでタスクを実行する次回の検索

イベントA は& Bと、これらのイベントは次のように行って、これらのイベントの週間スケジュールの特定の日に繰り返し発生イベントを紹介2があります。
イベントB - 午前6時および午後8時に日曜日と火曜日に発生します。
イベントC - 月曜日、水曜日、木曜日の午前8時9分に発生します。

ユーザは、選択したすべての日に同じ曜日を選択してタイミングを入力できるフォームが表示されます。必要な数のイベントを作成できます。

今のDBでは、日ごとに7列、タイミングの列が1つ作成されています。私はそれが不必要に複雑になるかもしれないことを知っています。上記のデータは、私は、イベントが例えばのために発生したときに次の最寄りの日と時間を見つけなければならないいくつかの理由で今

EventNAME SUN MON TUE WED THU FRI SAT Timings 
A   1 1 0 1 0 0 0 7,21 
B   1 0 1 0 0 0 0 6,20 
C   0 1 0 1 1 0 0 8,21 

として表される:今日は水曜日の朝6時であれば、私は次の最も近いイベントなどを取得する必要がありますイベントa - 朝7時。そして水曜日の午前8時に、次の最も近いイベントを午前8時にイベントCとして取得する必要があります。

このようなスキーマから次に近い日時を取得するにはどうすればよいですか?テーブルを設計する良い方法はありますか?スケジュール表にイベントを追加するたびに、(event_id, next_run_time)

それは火なければならない次の時間を計算する:

+0

ありがとう@Mat for editing – Rasmus

+0

これを正しく理解すれば、月曜日のリマインダを設定できません午前12時にのみ、午後4時には金曜日に同じことを通知します。 毎日と時間を単一の行に詰め込むのではなく、行+日+イベントIDを行ごとに取るようにデータベースを再設計します。 私がこれについてさらに展開したい場合は、おそらくいくつかのコード例が私に教えてくれます。 – Erik

+0

@Erikこれにもっと光を当てることができれば素晴らしいだろう。 – Rasmus

答えて

1

は、私は2つのcolumsを有する第2のテーブルを使用すると思います。そのための関数を作成します。ロジックは次のようになります。タスクは、今日実行する必要がある場合でない場合

  • は、それがトリガーする次の日を探し、
  • (今日のコラムは1で、タイミングの一つは、将来的にある)を参照してください。最初のタイミング。次に実行する必要があるものを考え出すことは(擬似-SQL)の単純な問題である

select (for update) event_id from next_run_times where next_run_time < now 

そして、あなたはタスクをトリガーするたび、あなたが構築され、同じ機能を使用して、その次の実行時刻を更新早く

注意:「スケジューラ」を同時に実行する場合、タスクが2回実行されないようにするには、何らかのロックが必要です。

「毎週水曜日にスケジュールされたジョブ」を特に照会する場合を除いて、各曜日の列を使用すると便利かどうかはわかりません。プログラミング言語や正確なクエリのニーズによっては、よりコンパクトなフォーマット(例:最後のタスクの場合は0101100のプレーンストリングのような)がより実用的です。 ((event_id, day_number, timing)(単なる「タイミング」)のテーブルを再設計することもあります。

+0

これは良いと思います。私はこれを試してみましょう..thanks – Rasmus

関連する問題