多分あなたは3つのテーブルが必要です
- イベントベース
- イベント_インスタンス
- 繰り返し発生するイベントの実際のインスタンスについて
- ユーザーがその月/週/日などを表示しようとしたときにのみインスタンスを作成します。
- その日にインスタンスが存在しない場合にのみインスタンスを作成する
- 元の日付と現在の日付がある (このインスタンスを移動できる場合)
- event_reoccurrence テーブル
- 終了日フィールド付き。終了日が null の場合、終了日はありません。
サンプルの event_instance テーブル スキーマを次に示します。
- event_base_id
- event_reoccurrence_id (再発がない場合は null) イベントを作成したルール。
- Original_created_for_date (ユーザーがインスタンスを移動した場合、元の日付に再度追加されることはありません)
- current_date (カレンダーに表示される日付
- location_override
- duration_override
- その他のオーバーライドなど
サンプルの event_reoccurrence テーブル スキーマ (再発ルール) を次に示します。
- event_reoccurrence_id
- event_base_id (unsigned int)
- day_of_week varchar(20)
- day_of_month varchar(20)
- day_of_year varchar(20)
- week_of_month varchar(20)
- year_of_year varchar(20)
- months_of_year varchar(20)
- 年varchar(20)
- lastdate_of_reoccurrence日付
#2 から #8 の値は、単一の数字、範囲 "2-6"、コンマで区切られた数字、または null にすることができます。
- null は無関係を意味します (この値に関係なくイベントが発生する可能性があります)
- some number: イベントは、その日付が数字と一致する日に発生します
- weekday: 5 = 金曜日以外の日はイベントが発生しません
- コンマで区切られた数字: いずれかの数字が一致するとイベントが発生します
- month: 2, 4, 5 = イベントは 2 月、4 月、5 月に発生する可能性があります
- range: イベントは range 間で発生します
- 日: 1-12 = イベントは毎月 1 日から 12 日に発生する可能性があります
- null 以外のすべてのフィールドが一致する場合、その日にイベントが発生する日付。
したがって、日付をチェックして、すべてのフィールドが null であるか、その日付と一致する場合、イベントはその日付に発生します。おそらく、複雑なパターンを構築するために、イベントごとに複数のエントリを持つことができます。
月の週は、最初の日曜日ではなく、最初の 7 日間になります。week_of_month が 3 で曜日が 2 で、イベント ID 以外のすべてが null の場合、毎月第 3 火曜日のようになります。
次に、その人がカレンダーを表示すると、その月の各日に対してすべての定期的なイベントを要求し、一致する各イベントに対して実際のイベントを作成します