C# web服务队列设计,带有DB

C# web服务队列设计,带有DB,c#,web-services,database-design,C#,Web Services,Database Design,我正在尝试设计一个移动应用程序,允许注册用户添加到队列中。从web服务请求一个号码,然后web服务用存储的号码进行响应。下一个请求用户将获得连续号码 我使用C作为服务器端语言,使用mySQL作为用户数据库 客户端发送一个HTTP POST请求,其中身份验证头是username:password,x-action自定义头是joinQueue。并在队列中获取他的号码。稍后,他可以使用checkQueueStatus操作轮询web服务,查看他现在在队列中的位置 服务器端执行以下操作: 访问用户数据库并

我正在尝试设计一个移动应用程序,允许注册用户添加到队列中。从web服务请求一个号码,然后web服务用存储的号码进行响应。下一个请求用户将获得连续号码

我使用C作为服务器端语言,使用mySQL作为用户数据库

客户端发送一个HTTP POST请求,其中身份验证头是username:password,x-action自定义头是joinQueue。并在队列中获取他的号码。稍后,他可以使用checkQueueStatus操作轮询web服务,查看他现在在队列中的位置

服务器端执行以下操作:

访问用户数据库并检查用户名:密码是否正确。 发送最后一个\u编号+1并更新HTTP响应正文。 在队列中存储用户ID 123123为31的信息。 在完成对队列中的第一个用户的服务后,更新所有用户的队列。 作为web服务的noob,我不太确定如何设计服务器端部分。 具体来说,使用以下信息创建不同的表(队列表)是否有意义:

userID  | placeInQueue 
301452        1 
444592        2 
612712        3
042125        4
管理员客户端现在可以通过serviceFirstUser操作发送HTTP请求,这将减少队列中每个人的placeInQueue

这是一个合理的设计吗


谢谢。

使用QueueTable是个好主意,但您不需要这样做:

在完成对队列中的第一个用户的服务后,更新所有用户的队列。 您可以只索引placeInQueue,然后获取max\u place-min\u 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
然后,您可以以对数复杂度获得用户的位置:

SELECT * FROM `queue` ORDER BY `placeInQueue` ASC LIMIT 1
SELECT * FROM `queue` WHERE `userID`='<user_id>' LIMIT 1
他的真正位置是他在第一个+1的队列中的位置


然后你不需要做线性更新。。。删除第一个可以在placeInQueue indexing的对数复杂度常数+userID的对数复杂度常数中完成。

除非您预计会有数百万用户,否则在您点击手指之前,队列将被处理