0

登録ユーザーをキューに追加できるモバイル アプリケーションを設計しようとしています。Web サービスから番号を要求すると、Web サービスは格納された番号で応答します。次に要求したユーザーが連続番号を取得します。

サーバー側言語として C# を使用し、ユーザー データベースには mySQL を使用しています。

クライアント側は、"Authentication" ヘッダーが "username:password"、"x-action" カスタム ヘッダーが "joinQueue" である HTTP POST 要求を送信します。そして、キューで彼の番号を取得します。後で、「checkQueueStatus」アクションを使用して Web サービスをポーリングし、キューの現在の位置を確認できます。

サーバー側は次のことを行います。

  1. users DB にアクセスし、username:password が存在する (正しい) かどうかを確認します。
  2. last_number+1 を送信し、HTTP 応答本文を更新します。
  3. たとえば、userID 123123 がキューに 31 あるという情報を保存します。
  4. 最初のキューの処理が完了したら、すべてのユーザーのキューを更新します。

Webサービスの初心者として、サーバー側の部分を設計する方法がよくわかりません。具体的には、次の情報を使用して別のテーブル (キュー テーブル) を作成することは理にかなっていますか?

userID  | placeInQueue 
301452        1 
444592        2 
612712        3
042125        4

管理者クライアントは、 「serviceFirstUser」アクションを使用して HTTP 要求を送信できるようになりました。これにより、キュー内のすべてのユーザーの placeInQueue が減少しますか?

納得のいくデザインでしょうか。

ありがとう。

4

1 に答える 1

0

QueueTableを使用することは良い考えですが、それを行う必要はありません。

  • キューの最初のサービスが完了したら、すべてのユーザーのキューを更新します。

placeInQueueにインデックスを付けてから、max_place-min_placeを取得できます。

CREATE TABLE IF NOT EXISTS `queue`
(
    `userID` INT(9) PRIMARY KEY NOT NULL,
    `placeInQueue` BIGINT(16) AUTO_INCREMENT NOT NULL,
    INDEX(placeInQueue)
) ENGINE=MyISAM;

したがって、キュー内の最初のユーザーの場所を取得するだけです(一定の複雑さで):

SELECT * FROM `queue` ORDER BY `placeInQueue` ASC LIMIT 1

次に、対数の複雑さでユーザーの位置を取得できます。

SELECT * FROM `queue` WHERE `userID`='<user_id>' LIMIT 1

彼の実際の位置は(彼のplaceInQueue)-(最初のplaceInQueue)+1です。

次に、線形更新を行う必要はありません...最初の削除は対数の複雑さで行うことができます(placeInQueueインデックスの定数+ userIDの対数)。

于 2013-01-05T13:57:56.207 に答える