6

この種の問題を数回見たことがありますが、重複しない方法で範囲を保存する最善の方法を決定しようとしています。たとえば、一度に 1 人だけが使用できるある種のリソースをスケジュールする場合などです。私が見た主なものは、次のようなものです。

PERSON          ROOM        START_TIME      END_TIME
Col. Mustard    Library     08:00           10:00
Prof. Plum      Library     10:00           12:00
  1. たとえば、ミス・スカーレットが図書館を 11:00 から 11:30 まで予約したい場合など、新しいエントリが既存のスケジュールと重複しないようにする最善の方法は何ですか? インライン制約は機能しません。トリガーでこれを簡単に実行できるとは思いません。テーブル内の既存の競合を最初に検索するすべての挿入を処理する手順は?

  2. 次に、同時実行の問題を処理する最善の方法は何ですか? ミス・スカーレットが 13:00 から 15:00 まで図書館を希望し、ミセス・ホワイトが 14:00 から 16:00 まで図書館を希望しているとします。(1) の手順では、これらのスケジュールはどちらも受け入れ可能であることがわかりますが、明らかにまとめて考えると、そうではありません。私が考えることができる唯一のことは、テーブルまたはある種のミューテックスの手動ロックです。

  3. 上記のテーブル (room, start_time) の適切な主キーは何ですか?

4

1 に答える 1

5

時間範囲が固定されている場合の迅速な作業方法は、すべての範囲を別のテーブルに保存してから、それを「予約」テーブルにリンクするだけです。固定範囲のトリックを実行できます。たとえば、ライブラリを 30 分間隔でのみ予約でき、勤務時間は午前 8 時から午後 8 時までで、必要なレコード数は 24 だけです。

--Person table---------------
ID   PERSON         ROOM
1    Col. Mustart   Library
2    Proof. Plum    Library

--Timeshift table------------
ID   START_TIME   END_TIME
1    08:00        08:30
2    08:30        09:00
....
24   19:30        20:00

--Occupy table----
DATE            TIMESHIFT    PERSON
TRUNC(SYSDATE)   TS_ID        P_ID
08/12/2012         4           1
08/12/2012         5           1
08/12/2012         9           2 
08/12/2012         10          2 

これで PK または UK になり、データベース主導のチェックの準備が整いました。データのオーバーヘッドがほとんどなく、高速です。ただし、毎秒同じルーチンを使用しても効果的ではありません。

より普遍的で複雑な方法は、いくつかの手順 (またはトリガー) をチェックさせ、範囲が占有されているかどうかを確認し、現在のすべての記録を確認する必要があることです。

于 2012-08-11T02:18:50.217 に答える