イベントの可能な繰り返しをすべて生成すると、(理論的には) ユーザーが決して見ることのないイベントでストレージがいっぱいになります (999,999,999,999,999,999,999 歳の誕生日おめでとうございます!)。
もう少し手間がかかりますが、解決策は基本的に、カレンダーを作成するときにカレンダーエントリをリンクする繰り返しルールのテーブル (または複数のテーブル) を保存することです。
「表示されている曜日ごとに、その日に繰り返されるイベントをチェックする」「表示されている月のすべての週について、その週に繰り返されるイベントをチェックする」「1 年の毎月について」など. .
これらのチェックを何回行う必要があるかは、必要な繰り返しの種類 (および期間) の数によって異なります。
イベントの抑制に関しては、抑制しなければならない日付/時刻のポイントをリストした別の表です。「月曜日を表示する場合、抑制テーブルにリストされているものを除いて、月に繰り返されるすべてのイベントを表示します」
コメントのフォローアップ:
コア情報を格納するために、標準のカレンダー エントリ テーブルが必要です。日付/時刻など...次に、繰り返し情報を格納するための少なくとも 2 つの他のテーブル。繰り返しルールを保存するもの。「毎週月曜日」、「月の最初の日」、「毎年」など...、およびカレンダー エントリとルールをリンクする 3 番目のテーブル
それで:
calendar entries table <---> link table <---> repeat rules table
クエリは、考慮している日付に対して適切なルールが出てきて、表示するカレンダーエントリの ID を提供するように構築することの問題です。渡した日付に基づいて適切なルールに動的にリンクする派手なクエリを実行すると、見苦しくなる可能性があります。