¿Cómo implemento una base de datos / tabla como una pila?

11

Tengo una máquina de estado que necesita presionar / hacer estallar algunos nombres de archivo para diferentes usuarios. Tradicionalmente, usaría pilas como la elección de la estructura de datos, pero esto debe hacerse utilizando una base de datos, ya que no tengo una manera de retener la estructura de datos entre las solicitudes web entrantes.

Me preguntaba cuál sería una buena manera de implementar la funcionalidad de la pila utilizando bases de datos.

Necesito apoyar:

  • push (fileName, user): inserta un nombre de archivo para el usuario
  • pop (usuario): Pop el nombre de archivo más alto para el usuario

EDITAR :

Estoy creando prototipos de una idea, por lo que estoy usando sqlite3 con python.

¡Gracias!

brainydexter
fuente
¿Esperas que el mismo usuario tenga múltiples conexiones concurrentes? que volúmenes ¿Qué motor Db también por favor?
gbn
@gbn Eventualmente, el mismo usuario podría tener conexiones concurrentes. Pero por ahora, estoy creando un prototipo de una idea y supongo una conexión única por usuario
brainydexter
@brainydexter Me gustaría mucho saber qué estás tratando de hacer. Tengo la sensación de que puede estar creando la solución incorrecta a su problema. Es posible que desee considerar contarnos su problema y solicitar la mejor vía para resolverlo. Implementar una pila como una tabla de base de datos parece una mala idea.
xenoterracide
@xenoterracide: La intención general de lo que estoy tratando de hacer en SO: stackoverflow.com/questions/5145051/… Stack no funcionó por completo, por lo que todavía estoy buscando una solución para esto.
brainydexter
1
@brainydexter no está realmente sorprendido, SQL es un lenguaje horrible para implementar una pila, porque por definición relacional, un conjunto no está ordenado, por lo que su pila no tendrá orden, y tendrá que ordenarlo. Quizás parte de su problema es decirle a la gente cuál quiere que sea la respuesta y preguntar cómo. En lugar de decirles cuál es el problema y preguntar qué. Incluso su pregunta SO lleva la respuesta a algo específico. Intenta pedir la solución en la que no pensarás.
xenoterracide

Respuestas:

6

Si está preguntando qué base de datos usar, realmente depende de la preferencia personal y de lo que desea obtener de ella. Como solo estoy familiarizado con MySQL, responderé la otra parte de la pregunta suponiendo que MySQL:

querrá usarlo INNODBporque su tabla va a ser intensiva en escritura y para tablas grandes, el bloqueo de filas de INNODB será un salvavidas MyISAM.

En cuanto al diseño de la tabla, parece que realmente solo necesita una tabla:

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`;

Fui con una columna arbitraria de 'id' establecida AUTO_INCREMENTporque la clave principal se replica en cada entrada de cada índice. Por lo tanto, hacer una clave principal de (usuario, nombre de archivo) podría causar problemas de rendimiento si los nombres de archivo son extremadamente largos.

El tamaño de su columna 'id' depende de qué tan grande va a crecer su mesa. Unsint Smallint le dará 65k filas.

Los nombres de usuario y de archivo son varchar, porque supongo que variarán drásticamente en longitud.

Esta date_insertes solo una forma de ordenar sus resultados en función de cuándo se insertó (útil para su POP)

Derek Downey
fuente
Estaba pensando en hacer la combinación (id, usuario) como la clave principal, ya que me gustaría presionar o hacer estallar en función del usuario. Qué piensas ? Además, para la operación POP, ¿no sería mejor encontrar el registro para el usuario con la identificación máxima?
brainydexter
@brainydexter dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html tiene algunas restricciones en autoincrement (es bajar 'valores autoincrement en ciertos casos raros se re-uso). porque es una posibilidad fui con un campo date_insert. En cuanto a usar (id, user) como clave primaria, no tiene sentido excepto ocupar más espacio de almacenamiento. ID identifica de forma exclusiva la fila. solo 'usuario' por sí solo no identifica la fila, por lo que podría tener un índice no único en 'ID de usuario' en lugar de un único (usuario, nombre de archivo) si lo desea.
Derek Downey
6

Si está considerando una base de datos Oracle, debería considerar el uso de Advanced Queuing con un patrón de cola LIFO (último en entrar, primero en salir) .

En el nivel más básico de la cola, un productor pone en cola uno o más mensajes en una cola. Cada mensaje es retirado y procesado una vez por uno de los consumidores. Un mensaje permanece en la cola hasta que un consumidor lo retira o el mensaje caduca. Un productor puede estipular un retraso antes de que el mensaje esté disponible para ser consumido, y un tiempo después del cual el mensaje expira. Del mismo modo, un consumidor puede esperar al intentar retirar un mensaje si no hay ningún mensaje disponible. Un programa o aplicación de agente puede actuar como productor y consumidor.

Leigh Riffel
fuente
configuración clásica de productor / consumidor. Gracias por la información, lo tendré en cuenta.
brainydexter
Esperemos que MySQL obtenga alguna funcionalidad de Adance Queue ahora que Oracle "posee" mysql ...
Derek Downey
1
@DTest: por supuesto, también existe la clara posibilidad de que mySQL ahora sea menos propenso a obtener funciones avanzadas, por lo que Oracle puede diferenciar entre software libre y uno por el que tiene que pagar.
Joe
@ Joe gracias por arruinar mi fin de semana con ese pensamiento!
Derek Downey