何かが 1 回、毎日、平日、毎週、何曜日、何日か、数値または記号 (毎月の最初の月曜日など) のいずれで発生するかを保存する必要があります。
推奨事項はありますか?確認するコード、データ構造、またはスキーマはありますか?
何かが 1 回、毎日、平日、毎週、何曜日、何日か、数値または記号 (毎月の最初の月曜日など) のいずれで発生するかを保存する必要があります。
推奨事項はありますか?確認するコード、データ構造、またはスキーマはありますか?
複雑な解決策と簡単な解決策があります。最も簡単な解決策は次の 2 つです。
一定数のインスタンスまで、または将来の一定の日付範囲まで、定期的なイベントをファンアウトします。繰り返しの説明を指す各インスタンスで FK recurrence_id を保存し、一括編集とキャンセルを可能にします。
事前に計算されたファン アウト アプローチの利点は、繰り返しの例外を非常に簡単に実装できることです。これは、ほぼ確実に最初の機能要求になるでしょう。
表示時間で計算します。コンピューターは高速です。データについて答えたい質問によっては、日付範囲内のすべての発生を簡単に計算できることがよくあります。賢く、再発の計算を行う前に日付範囲をすばやくまとめるか、開始日から総当たりにすることができます。
それ以上に必要なのは、繰り返しの計算に使用しているものと連携して機能する繰り返しルールを保存するためのソリューションだけです。(たとえば、iCalendar 有効化ライブラリを使用している場合、スキーマは RRULE 値を含む varchar(255) です)
独自の繰り返し計算機をロールバックする必要があり、それをシンプルに保ちたい場合は、繰り返しを毎日、毎週、毎月、または毎年に制限すると、最初の 80% のユース ケースがカバーされ、簡単に計算できます。
その時点で、潜在的な繰り返しスキーマは次のようになります。
id
recurrence_start
recurrence_end
type (daily|weekly|monthly|yearly)
day_of_week (for weekly)
month
day_of_month
そして率直に言って、複雑なソリューションはおそらく価値がありません:)
Martin Fowler は、これについて非常に優れた論文を書きました。彼が論じているのと同じアイデアが、時系列式を扱うための Ruby ライブラリであるruntにたくさんあります。
スケジュール機能を備えたオープン ソース プロジェクトを試してみませんか?
いくつかのスケジューリング インターフェイス/定義
https://www.rfc-editor.org/rfc/rfc4791
と
これは、Outlook などの「定期的なイベント」のように聞こえます。RecurrenceType という 1 つのテーブルを使用して、各期間 (毎日、毎週など) を格納します。Event という別のテーブルは、キーによって RecurrenceType を参照します。ほとんどの定期的なタイプの将来の日付は、標準の日付関数を使用して計算できます。
ここで説明するスキーマは、定期的な日付をキャプチャします
問題は、そのような間隔を指定する可能性が無限にあることです。たとえば、「日付が偶数であるが 4 ではなく、月が長い年の 2 月でない場合、隔月の最初の月曜日」。どこまで行きたいですか?最終的には、イベントが繰り返される日に TRUE と評価されるブール式をユーザーに入力させるだけで済みます。UIの観点からはあまり良くありません。
システムのいくつかの制限を決定する必要があります。それらがわかれば、残りは簡単です-または少なくともSOで答えられるはずです。:)
関連する有用な SO スレッドで言及されていますが、Ruby を使用している場合に積極的に管理されている、Runt の優れた代替手段はice_cubeです。ストレージ バックエンドの要件について言及していませんが、データベース スキーマについては、@kellan と前述のスレッドのいくつかが良いスタートです。