我正在尝试设计一个允许注册用户添加到队列中的移动应用程序。请求来自Web服务的号码,然后以存储的号码进行响应。下一个请求用户将获得连续的号码。
我使用C#作为服务器端语言,使用mySQL作为用户数据库。
客户端发送HTTP POST请求,其中“Authentication”标头为“username:password”,“x-action”自定义标头为“joinQueue”。并在队列中获取他的号码。稍后,他可以使用“checkQueueStatus”操作轮询网络服务,以查看他现在在队列中的位置。
服务器端执行以下操作:
作为网络服务的菜鸟,我不太清楚如何设计服务器端部分。 具体来说,使用以下信息创建不同的表,队列表是否有意义:
userID | placeInQueue
301452 1
444592 2
612712 3
042125 4
并且管理员 - 客户端现在可以使用“serviceFirstUser”操作发送HTTP请求,这会减少队列中每个人的placeInQueue吗?
这是一个看似合理的设计吗?
感谢。
答案 0 :(得分: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的一个对数)。