私たちは、クライアントの予定を管理するためのスケジューリング システムを構築しました。このシステムは、Prometric が試験をスケジュールするために使用するものと似ています。主な懸念事項は次のとおりです。オーバースケジュールがないことを保証し、1 か月あたり少なくとも 10 万件の予約をサポートし、テスト センターのキャパシティを簡単に増減できるようにします。
容量ベクトルに基づいて、次の設計を考案しました。各予定には少なくとも 5 分かかると仮定しました。ベクトルは 288 スロット (24 時間 * 1 時間あたり 12 スロット) で構成され、各スロットは 1 バイトで表されます。このベクトルにより、システムは 5 分ごとに最大 255 件の予定を表すことができます。使用される情報は、2 つのベクトルで構成されます。1 つはテスト センターの容量(NOMINAL CAPACITY)を格納するためのもので、もう 1 つは使用済みの容量 (USED CAPACITY)を格納するためのものです。現在の容量(CURRENT CAPACITY)を回復するために、システムはテストの NOMINAL CAPACITY を取得し、USED CAPACITY を差し引きます。
データベースの構造は次のとおりです。
公称容量
公称キャパシティは、稼働日 (月~金) のキャパシティを表します。
| TEST_CENTER_ID | NOMINAL_CAPACITY
| 1 | 0000001212121212....0000
| 2 | 0000005555555555....0000
...
| N | 0000000000010101....0000
使用容量
このテーブルには、各日/テスト センターの使用容量が格納されます。
| TEST_CENTER_ID | DATE | USED_CAPACITY
| 1 | 01/01/2010 | 0000001010101010...0000
| 1 | 01/02/2010 | 0000000202020202...0000
| 1 | 01/03/2010 | 0000001010101010...0000
...
| 2 | 01/01/2010 | 0000001010101010...0000
...
| N | 01/01/2010 | 0000000000000000...0000
クライアントがテスト センターと日付を選択すると、システムは次の計算を行って利用可能なスロットを提示します。例えば:
TEST_CENTER_ID 1
DATE 01/01/2010
NOMINAL_CAPACITY 0000001212121212...0000
USED_CAPACITY 0000001010101010...0000
AVAILABLE_CAPAC 0000000202020202...0000
クライアントが予定をスケジュールすることを決定した場合、システムは選択された日 (# USED CAPACITY テーブルの行) をロックし、対応するバイトを増やします。
現在、システムはうまく機能していますが、予約数が増えすぎると、競合の問題が発生することが予想されます。
この問題に対するより良い/別のモデル、またはそれを改善するための提案はありますか?
ベクトルの表現を時間単位でサブダイビングし、楽観的なロック戦略に変更することで、競合を回避することを考えました。例えば:
| TEST_CENTER_ID | DATE | USED_CAPACITY_0 | USED_CAPACITY_1 | ... | USED_CAPACITY_23
| 1 | 01/01/2010 | 000000101010 | 1010... | ... | ...0000
この方法では、行をロックして衝突イベントを減らす必要はありません。