繰り返しカレンダータスクをデータベースに保存する方法


14

これは、マイクロ管理のための小規模な個人プロジェクト用です。基本的に、次のようなSQLite3データベースにタスクを保存します。

    id INTEGER PRIMARY KEY AUTOINCREMENT
    label TEXT
    deadline INTEGER

そのため、各タスクには、Unixタイムスタンプとして保存される期日(期限)があります。これまでのところ、「明日:おばあちゃんを訪問」などのエントリを作成し、「おばあちゃんを訪問」というラベルを付けて新しい行を作成し、明日を期限のUNIX時間として変換します。

次に、新しいタイプのタスクを入力します:ルーチン-「毎日:クリーンキッチン」のような時間パターンで繰り返されるタスク。そのようなタスクをどのように保存またはモデル化できますか?

とりあえず、毎日実行する必要があるタスクの場合、同じラベルを持つ新しい行をテーブルに生成し、期限フィールドを1日増やします。この場合、将来的に制限を修正する必要があります。たとえば、毎日のルーチンを作成すると、残りの年の毎日の新しい行が作成されます。

これを行う簡単な方法はありますか?明らかなデータベース設計の原則が欠けていますか?


3
はい。さらに別のジョブスケジューラを考案する代わりに、適切なスケジューラツールを使用します。SOPA抗議が終了したらen.wikipedia.org/wiki/Open_Source_Job_Schedulerをお読みください。これは既に何度も解決されています。
S.Lott

ありがとう、ロット!はい、私はこのためのエレガントな解決策があると疑っていました!SOPAが終了するのを待つか、他のウィキペディアの国に翻訳があるかどうかを確認します編集:実際には、HTMLソースがウィキペディアUSでまだ利用可能であることに気づきました。ブラックアウト画面はCSSトリックのようなものです小さなグリースモンキースクリプトの方法:)
フランソワッベスパ

1
一般的な注意:以下の投稿のほとんどは、データが実際にどのように保存されているかという質問を考慮していません。毎週月曜日に2年間繰り返されるタスクを考えると、何行をディスクに書き込む必要がありますか?
-NoChance

または、この回答を参照してください。
クリスハーパー

@ root45いいですね、実際にはコマンドラインからlynxを使用していますが、もっと簡単です:)
フランソワッベスパÊ12年

回答:


7

再発するために別のテーブルを作成できます。しかし、正直なところ、Type Fieldを使用して同じテーブルにそれを配置します。

このようなもの:

ID - Int Pk

TaskDescription - TEXT

Type - Text - (Re-Occurring, or Single Occurrence) 

Due- TimeStamp - for Single Occurrence is the Date time

LastTimeCompleted - Time Stamp

ReoccurringUnit - Text - "Days", Weeks, Month, Ext

ReoccurringEveryX - Int - Reoccurring interval 

興味深いのは、私が実際にこの1に類似の可能な解決策を模索しています、私はまだ私のSQL関数を働いて成功した場合、私は投稿します
フランソワッベスパت

興味深いことに、定期的なタスクと非定期的なタスクの両方を取得して、期日で並べ替えることができるクエリを考えています。どんな手掛かり?
ハーシャルパティル

2

S.Lottからのコメントに加えて、Martin Fowler-Calendarsの繰り返しイベント PDFが役立つ場合があります(少し難しいことがわかりました)。

また、いくつかのUIツールが、簡単なタスクモデル(簡単なタスクモデルを使用)で説明している機能を提供することに注意してください。このようなツールがなければ、この問題をデータベース設計の問題を解決するのは難しいと思います。


1

私の見解では、2つのオプションがあります:

  • 繰り返し発生するアイテムに対して同じ行を大量に格納しますが、それらは終了する必要があり(終了日または有限数のアイテム)、繰り返し発生アイテムとしてマークする必要があります。イベントを変更する場合、それらをすべて更新する必要がありますが、一度逸脱したい場合は、1つのイベント間の接続を単に「切断」して、通常のイベントにすることができます。
  • 特定の繰り返しスキームを使用して、イベントを繰り返しアイテムとして保存し、指定された日付に対して、指定された日付の繰り返しアイテムの期限を計算します。これにより、無限の繰り返しが可能になります。

それは私もそれを見る方法です
フランソワッヴェスパÊ12年

1

これが個人的なプロジェクトであり、タスクを保存する方法が必要な場合は、TaskCoachをお勧めします。これは、デスクトップアプリケーション、マルチプラットフォーム、オープンソースであり、使いやすく、優れた機能を備えています。

タスクアプリケーションを開発している場合、最も可能性の高い方法は、定期的なタスクごとに新しい行を追加することです。ロジックは、各タスクはそれ自体が個別のエンティティであり、同じタスクを翌日に開始する前に完了する必要があるということです。インクリメントするだけでは、タスクの履歴をキャプチャできません。

いくつかのタスクが完了していない場合は大きなリストが表示されると思われる場合は、繰り返しタスクが完了したらイベントをトリガーして、タスクが完了したときにのみ新しいタスクが新しい行として生成されるようにすることができます完了としてマークされています。Moronsによって提案されているように、元のテーブルの繰り返しタスク用のフラグを持つ個別のテーブルを繰り返しのデータ(日、週、繰り返し時間)と一緒に使用して、単純なスクリプトを作成して、日付または条件またはラベル。

ただし、タスクが変更のない確かに反復的なタスク(毎日のブラシなど)であり、広範な追跡を必要としない場合は、次の構造を試すことができます。

  • 繰り返しフラグ-タスクが繰り返し行われていることを示します
  • 繰り返し期間-日、週、月
  • 作成されたタスクの数-これにより、再帰期間に基づいてタスクが増加します。したがって、タスクが今日から開始され、1日の繰り返し期間がある場合、明日は1ずつ増加します。
  • 完了したタスクの数-タスクが完了すると増加します

ロジックは、完了したタスクと作成されたタスクの違いであり、タスクが常に完了している場合、作成されたタスクは常に再帰期間である必要があります。したがって、日数の差を反復期間で割ると、タスクが保留されている期間がわかります。

これを指摘してくれたカリームに感謝

私見、タスクアプリケーションは一般の人々のために構築することは困難です。


建設的な答えをありがとう!これは楽しみのためのプロジェクトで、「水曜日以外の場合は4日ごとに繰り返す」などのクエリを使用して、可能な限り柔軟にしたいと考えています。
FrançoisッVespaت

1

最も頻繁に行われる操作は、ある期間に発生するすべてのイベントをリストすることです。簡単なSQLクエリで質問に答えられるように、データを最適化します。2つのテーブルを作成します。

CREATE TABLE events(start TIMESTAMP, end TIMESTAMP, name TEXT, user_id LONG,
                    recurrence_id LONG, ...);
CREATE TABLE recurrences(id LONG, start TIMESTAMP, end TIMESTAMP, name TEXT, 
                         frequency ...);

開始時刻と終了時刻でイベントテーブルのインデックスを作成します。その後、イベントテーブルからすべてのクエリに非常に迅速に回答できます。繰り返しが編集されたら、対応するすべてのイベントを削除して再作成します。

このアドバイスは、トム・カイトの本から恥知らずに繰り返されています。


1

繰り返されるタスクには、開始日と終了日が必要です。単一の日付タスクの場合、それらは同じ日付になります。

ニーズの開始から必要に応じて将来まで関連があると思われる日ごとに1つのレコードを持つ「日付」テーブルを作成します。たとえば、12/31/2100をフォーマットに変換します。

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

Select 
  t.id
  , t.label
  , d.UnixDate
from Tasks as t
inner join Dates as d
on d.UnixDate >= t.StartDate
  and d.UnixDate <= t.EndDate
where t.id = [ID Param]

0

同様のことを何年か前にWindowsタスクスケジューラなどのインターフェイスを実装しました。基本的に、タスクをスケジュールする必要がある曜日を含むStartDate、EndDate(nullの場合もあります)、StartTime、RecurringDaysがあります。


それは面白い。いくつかの設計上の制限、つまり実行できなかったクエリ(「毎週繰り返す」など)はありましたか?
フランソワッベスパÊ12年

0

2つのテーブルを使用できます。1つはタスクの説明用、もう1つはステータス(完了/未完了、およびその他の情報:経過時間、終了ステータス、ログファイルの場所など)用です。説明テーブルには、タスクの名前、およびタスクを実行する日付または頻度:タスクごとに1行のみです。毎日、プロセスは、説明テーブルから今日実行するタスクのステータステーブルを作成します(1週間または1か月前に作成できます)。

ステータステーブルをプログラムで生成すると、頻度に必要なすべての柔軟性が得られます(たとえば、「X国の銀行休業日を除くすべての平日」-文字列として保存することもできます)。ステータステーブルを使用すると、タスクが失敗するかどうか、または失敗する頻度を確認できます(たとえば、「毎日実行するはずだった:実行する時間がありましたか?」)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.