如何将数据库/表实现为堆栈


11

我有一个状态机,需要为不同的用户推送/弹出一些文件名。传统上,我将使用堆栈作为数据结构的选择,但这需要使用数据库来完成,因为我没有办法在传入的Web请求之间保留数据结构。

我想知道使用数据库实现堆栈功能的好方法是什么?

我需要支持:

  • push(fileName,user):为用户推送一个文件名
  • pop(user):弹出用户最上面的文件名

编辑

我正在制作一个原型的原型,因此我将sqlite3与python一起使用。

谢谢!


您期望同一用户具有多个并发连接吗?什么卷?请问什么Db引擎呢?
gbn

@gbn最终,同一用户可能具有并发连接。但就目前而言,我正在制作一个原型原型,并假设每位用户使用单个连接
brainydexter 2011年

@brainydexter我非常想知道您正在尝试做什么。我感到您可能正在为问题创建错误的解决方案。您可能要考虑告诉我们您的问题,并寻求最佳解决方案。将堆栈实现为数据库表听起来是个坏主意。
xenoterracide

@xenoterracide:我想在SO上做的总体意图是:stackoverflow.com/questions/5145051/… 堆栈无法完全工作,因此我仍在寻找解决方案。
brainydexter 2011年

1
@brainydexter并不感到惊讶,SQL是实现堆栈的一种可怕的语言,因为根据关系定义,集合是无序的,因此您的堆栈将没有顺序,因此必须对其进行排序。问题的一部分可能是您正在告诉别人您想要的答案是什么,而您正在询问如何做。与其告诉问题是什么,然后问他们是什么。甚至您的SO问题也将答案引向特定的问题。尝试寻求您不会想到的解决方案。
xenoterracide 2011年

Answers:


6

如果您询问要使用哪个数据库,它实际上取决于个人喜好以及您想要从中获得什么。因为我只熟悉MySQL,所以假设MySQL,我将回答问题的另一部分:

您将要使用该INNODB表,因为您的表将要写大量数据,而对于大型表,INNODB的行锁将节省生命MyISAM

就表设计而言,似乎您只需要一个表:

CREATE TABLE `wordpress`.`<table_name>` (
`id` smallint(4) NOT NULL AUTO_INCREMENT UNSIGNED,
`user` varchar(30) NOT NULL,
`filename` varchar(255) NOT NULL,
`date_insert` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE `userFile`(user, filename)
) ENGINE=`InnoDB`;

我将一个任意的“ id”列设置为,AUTO_INCREMENT因为主键在每个索引的每个条目中都被复制。因此,如果您的文件名过长,那么执行(用户,文件名)的主键可能会导致性能问题。

您的“ id”列的大小取决于您的表将要增长多少。未签名的Smallint将给您65k行。

用户名和文件名是varchar,因为我认为它们的长度会发生很大变化。

date_insert只是根据插入时间排序结果的一种方法(对POP很有帮助)


我想将(id,user)组合作为主键,因为我想根据用户进行推送或弹出。你怎么看 ?另外,对于POP操作,为ID最大的用户查找记录是否更好?
brainydexter 2011年

@brainydexter dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html有自动增量(它会重新使用“下”在某些罕见的情况下自动增量值)一些限制。因为这是我使用date_insert字段的可能性。至于使用(id,user)作为主键,除了占用更多存储空间没有其他意义。ID唯一标识该行。只是'user'本身不能识别行,因此您可以根据需要在'userID'上使用非唯一索引,而不是唯一的(user,filename)。
德里克·唐尼

6

如果考虑使用Oracle数据库,则应考虑将高级队列LIFO(后进先出)出队模式一起使用

在最基本的排队级别,一个生产者将一个或多个消息排队到一个队列中。每个消息都由其中一个使用者出队并处理一次。消息将保留在队列中,直到使用者将其出队或消息到期为止。生产者可以规定消息可以被消费之前的延迟,以及消息到期之后的时间。同样,如果没有可用消息,则消费者可能在尝试使消息出队时等待。代理程序或应用程序既可以充当生产者,也可以充当消费者。


经典的生产者/消费者设置。感谢您提供的信息,我会牢记在心。
brainydexter 2011年

希望现在甲骨文“拥有” MySQL,MySQL将会获得一些Adance Queue功能……
Derek Downey

1
@DTest:当然,还有一种独特的可能性,那就是mySQL现在不太可能获得高级功能,因此Oracle可以区分免费软件和必须付费的软件。

@乔感谢您的想法破坏了我的周末!
德里克·唐尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.