0

私は現在、次のようなデータベースを設計しています。

1)次のようなタスクのリストがあります。

Clean the floor.
Wipe the sink.
Take swabs.

2)次のようなエリアのリストがあります。

Kitchen.
Servery.

3)タスクは、「毎時」、「毎日」、「毎週」、「毎月」、または「毎年」のいずれかとして、エリアに対してスケジュールされます。これをAreaTask(Area、Task、Frequency)と呼びます:-

Kitchen, Clean the floor, Daily

4)AreaTaskは、スケジュールに基づいて、営業日の開始時(日次、週次、月次、または年次の場合)、または時間単位の場合は時間の開始時に期限が切れます。たとえば、「床の掃除」が水曜日に「毎週」にスケジュールされている場合、毎週水曜日の開始時に期限になり、それが完了するまで(作業済み、サインオフなど)その日は期限のままになります-または一定時間を超えると延滞となります。

5)AreaTaskに対して作業が行われると、データベースに記録されます(Area、Task、User [作業を行った人]、DateTime [作業が行われた]):-

Kitchen, Clean the floor, Joe Bloggs, 2012-05-23 10:50:00

これが私が決定しようとしていることです:

すべてのデータが存在するため、クエリだけでいつでもAreaTaskのさまざまな状態を判断できます(つまり、AreaTaskが水曜日に期限になると判断でき、作業がなかった場合は期限が過ぎたと判断できます)設定された時間の前にそのAreaTaskに対して実行されます)。ただし、代わりに、おそらくCRONジョブまたはその他の手段によって入力されるAreaTaskDueテーブルが必要かどうか疑問に思っています。

このようにして、データベースにデータをクエリして保存するための正式なエントリがあります。たとえば、次のようになります。

ScheduledTask(Area、Task、ScheduledDateTime)キッチン、床を掃除、2012-05-23 06:00:00

これにより、必要に応じてタスクを手動でスケジュールすることもできます。

次に、ScheduledTaskに対して作業が行われると、ScheduledTask自体に対してログに記録できます。

ScheduledTaskWork(Area、Task、ScheduledDateTime、User、DateTime)キッチン、床を掃除、2012-05-23 06:00:00、Joe Bloggs、2012-05-23 11:30:00

それが理にかなっていることを願っています。

PSこれはRDBMSベースのデータベース用であり、OOではありません。私はビューを使用して、さまざまな視点からデータを表示する傾向があります。

ありがとう。

PSもおそらく、CRONジョブはScheduledTaskをそれを決定するのではなくOverDueとしてマークします。問題は、これらの正式な状態をデータベースに保存するか、決定するかということだと思います。それらを保存できる唯一の方法は、ある種のCRONジョブを実行することです(これは、より良い方法がないことがわかっている限り、問題ありません)。

編集:状態を導出することに反対する1つの議論は、スケジュールが変更される可能性があるということです-しかし、私はデータベースに履歴を保持しているので、それでも導出できます-しかし、それについて考えれば考えるほど、CRONジョブを使用してスケジュールすることに傾倒していますスケジュールに基づくタスク。

4

1 に答える 1

0

このモデルを見てください:

ここに画像の説明を入力

タスクが開始されるたびに、新しい行を WORK テーブルに挿入します。完了したら、WORK.COMPLETED_AT を設定します。

次のように、今日まだ完了していない毎日のタスク (およびその領域) を見つけることができます。

SELECT *
FROM SCHEDULE
WHERE
    FREQUENCY = 'daily'
    AND NOT EXIST (
        SELECT * FROM WORK
        WHERE
            SCHEDULE.AREA_ID = WORK.AREA_ID
            AND SCHEDULE.TASK_ID = WORK.TASK_ID
            AND DAY(COMPLETED_AT) = TODAY
    )

DAY と TODAY をデータベースに固有のものに置き換えます。おそらく、FREQUENCY には文字列ではなく整数を使用することをお勧めします。

他の頻度についても、同様のクエリを考案できます。

手動でスケジュールされたタスクは、SCHEDULE と同様のテーブルを使用してモデル化できますが、FREQUENCY は明示的な時間に置き換えられます。

于 2012-05-30T18:15:17.930 に答える