オプション1
3つの列で可用性を保存します(ユーザーを識別するために単一のID列を想定)
availability_start, availability_end, user_id
日時に基づいて検索すると、次のようになります。
select
user_id
from
availability
where
desired_datetime > availability_start
and
desired_datetime < availability_end
提供する機能によっては、過去の日付を削除することもできます。明らかに、人々の周期的な日付の定義に基づいて、日付を保存する将来の距離を決定する必要があります。
オプション2
個々の曜日とその日の時間を選択するのと同じくらい簡単な場合。周期的な日付を次のように保存できます
user_id, day_of_week, availability_time_start, availability_time_end
開始時刻と終了時刻には、日付コンポーネントは必要ありません。曜日と時間に基づいて検索すると、次のようになります。
select
user_id
from
availability
where
desired_day_of_week = day_of_week
and
desired_time > availability_time_start
and
desired_time < availability_time_end
余談ですが、このような繰り返しの日付パターンの作成を支援するライブラリがあります。私がこれを使用している場合(Java)、あなたに適した言語でRFC2445が実装されている可能性があります。
そのようなものを使用する場合、実際の日付は保存されませんが、問題を実際に解決するのに役立たない繰り返しパターンの詳細だけが保存されます。これらの詳細は、繰り返し定義から値を取得し、それらをdb1フィールドから1列に永続化することで保存されます。
次に、将来の定義された期間の日付/時刻を保存し、繰り返し定義の変更時にこれらを再計算することもできます。これは、スケジュールの数と将来の距離によっては、明らかに非常に大きな操作になる可能性があります。データを保存したい。