イベントとオカレンスを別々に処理する必要があります。
イベントワイズ:イベントの場合、繰り返しルール(rfc5545で指定されたようなrruleでも、rfc5545のrdateのような明示的な日付のセットでもかまいません)だけでなく、例外(rfc5545のexdateおよび場合によってはrfc2445のようなexruleを参照)を保存する必要があります。 。また、これらのルールの変更を追跡する必要があります。rdate、exdateの変更は、将来発生しても問題なく、過去の日付では無視されます。rruleの変更は、以前の発生に影響を与えるため、より注意が必要です。私の個人的な好みは、新旧のルールに特定のプロパティを追加して、それぞれの有効の開始日と終了日を指定することです。
イベントの期間が限られている場合(たとえば、COUNTまたはUNTILプロパティが存在する場合)、イベントのクエリを簡単に行えるように、開始と終了をテーブルに保存する必要があります(特に、事前に計算された時間枠外の発生を探す場合(以下を参照)。計算をやり直すイベントの数を減らすのに役立ちます)。
オカレンスワイズ:オカレンスの場合、インスタンスを現在の前後の事前定義されたウィンドウ内に保存し(たとえば、+ /-6か月または12か月で定期的に計算)、ユーザーがさらに確認したい場合に再計算できるように、これを記録する必要があります。将来(パフォーマンスの問題の場合)。次の発生を簡単に見つけられるように、インデックス(RECURRENCE-ID)の計算も検討する必要があります。
バックエンドではなくフロントエンドで、tzidの変更を追跡して、特定のtzidでスケジュールされたイベントが、現在のタイムゾーンにとどまる必要があるかどうかをユーザーに確認する必要があります。更新されました(国がこの日が存在しないと決定する前に2011年12月30日金曜日に会議をスケジュールしたサモア島の誰かを考えてください)、同様に、夏時間中に発生するイベントが「決してない」ことを意味するかどうかを尋ねることができます「起こる」または「2回起こる」(このトピックの詳細はこちら)
注:rfc5545で定義されている以上のサポートを繰り返しルールの観点から検討し、宗教的な繰り返しルールのサポートを追加することもできます(USNOのカレンダーの概要、またはE. Reingol and Nの印刷物「CalendricalCalculations」(第3版)を参照)。 。ダーショウィッツ)。
既存の実装について質問するので、sunbird(sqlite)またはAppleオープンソースカレンダーおよび連絡先サーバーのデータベーススキーマを簡単に確認できます。これは、caldavサーバーの既存のオープンソースプロジェクトのより完全なリストです(おそらく、あなたが探している)はここで利用可能です)