1

私のアプリケーションでは、ユーザーは利用可能な日付を定義できるはずです。つまり。ユーザーjoeは、彼が利用可能であると定義する場合があります
。-2009年1月9日から2009年11月15日まで、毎週月曜日、水曜日、日曜日の15:00から17:00まで。-2009年2月9日12:00から14:00など...

日付は最大1年先に定義される可能性があります。

ユーザーは、定義された日付を追加、編集、および削除できます。

他のユーザーは、利用可能なユーザーを検索できます。-利用可能なすべてのユーザーを2009年8月9日15時30分に検索

問題は、SQLテーブルを設計する方法です。これにより、循環日付の作成と編集、および効率的な検索が可能になります。

私はpostgresqlを使用していますが、ガイドラインを探しています。多分誰かが同様の問題の経験がありますか?

前もって感謝します

4

4 に答える 4

1

オプション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列に永続化することで保存されます。

次に、将来の定義された期間の日付/時刻を保存し、繰り返し定義の変更時にこれらを再計算することもできます。これは、スケジュールの数と将来の距離によっては、明らかに非常に大きな操作になる可能性があります。データを保存したい。

于 2009-09-02T11:08:25.320 に答える
1

以前にこのようなデータを扱ったことがあるときは、これに似た「ルール」アプローチを採用して、日ごとのスケジューリングとブロックスケジューリングに対応しています。

CREATE TABLE availability_rules (
  id SERIAL UNIQUE,
  user_id NOT NULL REFERENCES users(id),
  day_of_week INTEGER CONSTRAINT valid_day_of_week CHECK (day_of_week BETWEEN 0 and 6)
  start_time TIME,
  start_date DATE,
  end_time TIME,
  end_date DATE
);

注:end_date + end_time> = start_date + start_timeなどになるように、ルールテーブルに制約を追加する必要があります。

次に、「可用性」ビューを作成して、user_id、date、start_time、およびend_timeを使用して正規化されたスケジュールを生成できます。8.4を使用すると、これは新しいgenerate_series日時機能で簡単になります。(http://www.postgresql.org/docs/current/static/functions-srf.html)8.3以前を使用している場合は、同じことを行う関数を簡単に作成できます。

于 2009-09-02T11:18:00.417 に答える
0

データベース自体に複雑なロジックを含めるのではなく、ユーザーの可用性をデータベースに保存し、プログラミング言語を使用して可用性を確認することをお勧めします。ORMツールを使用すると、これが簡単になります。

ユーザーの可用性は、日時のペアのリストで構成されます。

于 2009-09-02T10:56:42.863 に答える
0

あなたができることは、次のデザインのテーブルを用意することです。

Availability
  - userId, Foreign key to user table
  - startDate, datetime
  - endDate, datetime
  - startTime, datetime
  - endTime, datetime
  - monday, bit
  - tuesday, bit
  - wednesday, bit
  - thursday, bit
  - friday, bit
  - saturday, bit
  - sunday, bit

これで、次の方法で特定の平日の可用性を確認できます(MSSQL yntax)

SELECT * FROM User u WHERE EXISTS(
    SELECT 1 FROM Availability WHERE userId = u.id AND
    @startDate >= startDate AND @endDate <= endDate AND
    @startTime >= startTime AND @endTime <= endTime AND
    (monday = 1 OR tuesday = 1)
)

これにより、月曜日の@startDateと@endDateの間、または@startTimeと@endTimeの間の火曜日に利用できるすべてのユーザーが得られます。

于 2009-09-02T11:55:06.503 に答える