オンライン予約による患者キュー管理システムを開発したいと思います。
この場合、さまざまな部門のキュートークンを生成するオプションがあります。たとえば、部門AにはA1、A2、A3などのトークンがあり、部門BにはB1、B2、B3などのトークンがあります。
患者がいない場合にトークンを呼び出すときに、次の3つのトークンの後にそのトークンを追加する必要があります。
これ以外に、患者が特定の時間枠を予約できるオンラインモジュールがあります。オンラインで予約されたトークンは、特定の時間に通常のトークンの間に挿入する必要があります。
これらすべての要件を考慮すると、誰でもより良い解決策を提案できます。 C#キューはより良い解決策になりますか?または他のアイデア/提案?
編集
私はSQLテーブルを使用してオンサイト予約に行きます。
保留中のトークンがある場合にシーケンスを管理する簡単な方法はありますか?例えば
BookingID SeqNo
A1 1
A2 2
A3 3
A4 4
A5 5
A6 6
トークンA3を保留にしたとき、3つのトークンの後に彼を置きたいと思います。その後、テーブルになります
BookingID SeqNo
A1 1
A2 2
A3 6
A4 3
A5 4
A6 5
ありがとうございました
実際には、ルールが異なる2つの非常に異なる予約プロセスがあります。
両方を1つのキューに混在させるのは危険です。固定時間の予定を挿入すると、キューのダイナミクスを無視する予測を行う必要があるためです。
例えば:
t0
_の時間で、定時の予定が_t1
_にある場合は、定時の予定をtrunc((t1-t0)/t)
の位置に挿入する必要があります。t
は平均です。予定の期間。t
分早く呼び出されます。彼がそこにいない場合、彼のチケットがキューから選ばれると、それはノーショーであり、彼は後で3チケットをプッシュバックされます。彼が最終的に到着するとき、彼は_2t
_を待たなければならず、事前の予約とタイムリーな到着にもかかわらず、彼は待たなければならなかったので怒ります。 t
が20分である場合、それは本当に迷惑になる可能性があります。より堅牢なアプローチは、ルールに従って各プロセスを管理するようにソフトウェアを設計することです。私は2つの主要なアプローチを見ています:
これで、選択したデザインに関係なく、少なくとも1つの「キュー」があり、それを実装するには次の可能性があります。
queue<ticket>
_を使用することもできます。このアプローチにはいくつかの実用的な問題があります:データベースのアプローチは私にとってより安全に思えます。インメモリアプローチを採用する場合は、非表示ポリシーに対処するために、キューよりも柔軟なコンテナーを探すことをお勧めします。
まず、この回答とあなたの選択についてのフィードバックに感謝します。選択したDBアプローチの実装に関する質問に今後回答します。
最も簡単なアプローチは、使用するDBMSの autoincrement 機能を使用することです。この機能により、DBはテーブルの一意のシーケンシャルIDを生成できます。問題は、この機能はテーブルごとに1つのシーケンスしか管理できず、接頭辞がないことです。このアプローチを採用すると、テーブルは次のようになります。
_BookingId QueueId SeqNo
1 A 1
2 A 2
3 A 3
4 B 1 // You need to select by QueueId
5 A 4
6 A 5
7 A 6
_
DBがIDの増分を処理するため、これが最も簡単な実装です。不便な点は、チケット番号がすべてのキューで連続していることです。これは、チケット4のユーザーは、自分がBキューの最初であることを知らないことを意味します。ただし、キューごとにエントリを選択し、関連するキューと相対的に順序を管理できるため、これは実際の問題ではありません。
このシナリオでは、説明するキューイングテーブルに加えて、シーケンステーブルを使用します。
_QueueId NextCounter
A 7
B 3
C 125
_
この場合、チケットを追加するときに、カウンターを使用して更新し、チケットA7を作成します。残念ながら、複数のプロセスがデータベースを共有している場合、これは非常にトリッキーです。なぜなら、いくつかのプロセスが新しいシーケンス番号を計算して、同じ(一意でない)結果を取得しようとし、一部の挿入が失敗する可能性があるためです。この種の問題については、こことSO)にたくさんの質問があります。トランザクション管理をマスターすることはできますが、注意が必要です。
それでも、QueueId
とBookingId
を2つの異なるフィールド(プライマリkeuとして機能するように組み合わせる)に保持する方が安全であることに注意してください。
もう1つのアプローチは、バックエンドプロセスのメモリにマップまたは配列を格納することです。プロセスが開始されると、マップが初期化されます。DBは、各キューの最大のBookingId
を検索されます。メモリ内の各キューのシーケンスを管理します。
これは、独自のバックエンドプロセスがある場合にのみ機能します。
可能な他のいくつかの選択肢/組み合わせがあります。必要に応じて、ここを参照して(関連する質問はすでに見たと思います)、必要に応じて、より専門的な新しい質問をしてください。