Pregunta

Cuál es la mejor manera de almacenar una lista enlazada en una base de datos mysql, de modo que las inserciones son simples (es decir,usted no tiene que volver a indexar un montón de cosas cada vez) y tal que la lista puede ser fácilmente retiró en orden.

¿Fue útil?

Solución

Almacenar un entero columna de la tabla llamada 'posición'.Grabar un 0 para el primer elemento en la lista, un 1 para el segundo elemento, etc.El índice de la columna en su base de datos, y cuando se quiere tirar de sus valores, ordenar por la columna.

 alter table linked_list add column position integer not null default 0;
 alter table linked_list add index position_index (position);
 select * from linked_list order by position;

Para insertar un valor en el índice 3, modificar las posiciones de las filas 3 y por encima de, y, a continuación, insertar:

 update linked_list set position = position + 1 where position >= 3;
 insert into linked_list (my_value, position) values ("new value", 3); 

Otros consejos

El uso de Adrián solución, pero en lugar de incrementar en 1, el incremento por 10 o incluso 100.A continuación, las inserciones se puede calcular en la mitad de la diferencia de lo que estamos insertando entre sin tener que actualizar todo por debajo de la inserción.Elija un número suficientemente grande como para manejar el promedio de número de inserciones - si es demasiado pequeño, entonces usted tendrá que caer de nuevo a la actualización de todas las filas con una posición más alta durante la inserción.

crear una tabla con dos referencias a columnas PreviousID y NextID.Si el elemento es el primero en la lista PreviousID será nulo, si es el último, NextID será nula.El SQL se verá algo como esto:

create table tblDummy
{
     PKColumn     int     not null, 
     PreviousID     int     null, 
     DataColumn1     varchar(50)     not null, 
     DataColumn2     varchar(50)     not null,  
     DataColumn3     varchar(50)     not null, 
     DataColumn4     varchar(50)     not null, 
     DataColumn5     varchar(50)     not null, 
     DataColumn6     varchar(50)     not null, 
     DataColumn7     varchar(50)     not null, 
     NextID     int     null
}

Una lista enlazada puede ser almacenado utilizando recursiva punteros en la tabla.Esta es la misma jerarquías son almacenados en Sql y esto es usando el recurrente patrón de asociación.

Usted puede aprender más sobre él aquí.

Espero que esto ayude.

La opción más sencilla sería la creación de una tabla con una fila por cada elemento de la lista, una columna para la posición del elemento, y columnas para otros datos en el artículo.A continuación, puede utilizar la ORDEN POR sobre la posición de la columna para recuperar en el orden deseado.

create table linked_list
(   list_id   integer not null
,   position  integer not null 
,   data      varchar(100) not null
);
alter table linked_list add primary key ( list_id, position );

Para manipular la lista de actualización de la posición y, a continuación, insertar/eliminar registros como sea necesario.Para insertar un elemento en la lista 1 en el índice 3:

begin transaction;

update linked_list set position = position + 1 where position >= 3 and list_id = 1;

insert into linked_list (list_id, position, data)
values (1, 3, "some data");

commit;

Ya que las operaciones en la lista puede requerir varios comandos (por ejemplo, una inserción requerirá una INSERCIÓN y una ACTUALIZACIÓN), asegúrese de que usted siempre realizar los comandos dentro de una transacción.

Una variación de esta sencilla opción es la posición de incremento por algún factor para cada elemento, digamos 100, de modo que cuando se realiza una INSERCIÓN no siempre se necesita para volver a numerar la posición de los siguientes elementos.Sin embargo, esto requiere un poco más de esfuerzo a trabajar cuando el incremento de los siguientes elementos, por lo que perder la sencillez, pero la ganancia de rendimiento si se tienen muchas inserciones.

Dependiendo de sus requerimientos otras opciones pueden apelación, tales como:

  • Si desea realizar muchas de las manipulaciones en la lista y no muchas recuperaciones usted puede preferir tener una columna de ID apuntando al siguiente elemento en la lista, en lugar de utilizar una columna de posición.Entonces usted necesita para iterativo lógica en la recuperación de la lista con el fin de obtener los elementos en orden.Esto puede ser relativamente fácil de implementar en un procedimiento almacenado.

  • Si usted tiene muchas listas, una forma rápida de serialise y deserialise tu lista de texto/binario, y sólo desea almacenar y recuperar toda la lista, a continuación, guardar la lista completa como un solo valor en una sola columna.Probablemente no es lo que estamos pidiendo aquí, sin embargo.

Este post es viejo, pero todavía va a dar a mi .02$.La actualización de la información de cada registro en una tabla o conjunto de registros que suena loco para resolver el pedido.la cantidad de indexación también loco, pero parece que la mayoría han aceptado.

Loco solución que se me ocurrió para reducir las actualizaciones y la indización es crear dos tablas (y en la mayoría de los casos de uso no es ordenar todos los registros en una tabla de todos modos).La tabla a mantener los registros de la lista se ordena y la tabla B al grupo y mantener un registro de la orden como una cadena.el orden de la cadena representa una matriz que puede ser utilizada para ordenar los registros seleccionados en el servidor web o el navegador de la capa de la página web de la aplicación.

Create Table A{
Id int primary key identity(1,1),
Data varchar(10) not null
B_Id int
}

Create Table B{
Id int primary key Identity(1,1),
GroupName varchat(10) not null,
Order varchar(max) null
}

El formato de la orden de la picadura debe de identificación, posición y algunos separador de split() de su cadena.en el caso de jQuery UI los .sortable (serialize') las salidas de función de un fin de cadena para la que es POST amigable que incluye la identificación y la posición de cada registro de la lista.

La verdadera magia es la manera que usted elija para reordenar la lista de seleccionados utilizando el guardado el pedido de cadena.esto dependerá de la aplicación que estamos construyendo.aquí está un ejemplo de jQuery para reordenar la lista de elementos: http://ovisdevelopment.com/oramincite/?p=155

https://dba.stackexchange.com/questions/46238/linked-list-in-sql-and-trees sugiere un truco de usar de punto flotante de la posición de la columna para una rápida inserta y los pedidos.

También menciona especializados de SQL Server de 2014 hierarchyid la característica.

Hay un par de métodos que pueden pensar de la derecha, cada uno con diferentes niveles de complejidad y flexibilidad.Estoy asumiendo que su objetivo es preservar un orden en la recuperación, en lugar de requerir el almacenamiento como una lista enlazada.

El método más simple sería la de asignar un valor ordinal para cada registro en la tabla (por ejemplo,1, 2, 3, ...).Luego, a la hora de recuperar los registros, especificar un orden en el ordinal columna para obtener de vuelta en orden.

Este enfoque también permite recuperar los registros sin sentido a la pertenencia a una lista, pero permite que la membresía en sólo una lista, y puede requerir un "identificador de lista" en la columna para indicar que la lista de los récord pertenece.

Un poco más elaborado, pero también más flexible enfoque sería para almacenar información acerca de la membresía en una lista o listas en una tabla separada.La tabla de 3 columnas:El identificador de lista, el valor ordinal, y una clave externa puntero al registro de datos.Bajo este enfoque, los datos subyacentes no sabe nada acerca de sus miembros en las listas, y puede ser fácilmente incluido en varias listas.

Creo que es mucho más simple adición de una columna de Datetime el tipo y la posición de la columna de int, por lo que ahora usted puede tener la duplicación de las posiciones, en la instrucción select utilice el order by posición, creado desc opción y la lista va a ser recuperados en orden.

Esto es algo que he estado tratando de averiguar por un tiempo a mí mismo.La mejor manera que he encontrado hasta ahora es crear una sola tabla para la lista enlazada utilizando el siguiente formato (esto es pseudo código):

LinkedList(

  • key1,
  • información,
  • key2

)

key1 es el punto de partida.Key2 es una clave externa de la vinculación a sí mismo en la siguiente columna.Así que su columna se enlace algo vínculo algo como esto

col1

  • key1 = 0,
  • información= 'hola'
  • key2 = 1

Key1 es la clave primaria de col1.key2 es una clave externa que conduce a la key1 de col2

col2

  • key1 = 1,
  • información= 'żqué pasa'
  • key2 = null

key2 de col2 se establece en null porque no apuntan a nada

Cuando se introduce una columna en la tabla, usted necesita para asegurarse de que key2 se establece en null o obtendrá un error.Después de entrar en la segunda columna, usted puede ir de un conjunto de key2 de la primera columna de la clave primaria de la segunda columna.

Esto hace que el mejor método para entrar en muchas entradas en un momento, y luego ir a establecer el extranjero claves en consecuencia (o construir una interfaz gráfica de usuario que hace que para usted)

Aquí un poco de código real que he preparado (todo el código real trabajado en MSSQL.Puede que desee hacer un poco de investigación para la versión de SQL está utilizando!):

createtable.sql

create table linkedlist00 (

key1 int primary key not null identity(1,1),

info varchar(10),

key2 int

)

register_foreign_key.sql

alter table dbo.linkedlist00

add foreign key (key2) references dbo.linkedlist00(key1)

*Los puse en dos archivos separados, debido a que se tiene que hacer en dos pasos.MSSQL no le deja hacer en un solo paso, ya que la tabla no existe, sin embargo de la clave externa de referencia.

Lista enlazada es especialmente potente en uno-a-muchos relaciones.Así que si alguna vez has querido hacer una matriz de claves foráneas?Bien, esta es una manera de hacerlo!Usted puede hacer una tabla principal que apunta a la primera columna en los enlaces de la lista de la tabla y, a continuación, en lugar de la "información" de campo, puede utilizar una clave externa a la información que desee de la tabla.

Ejemplo:

Digamos que usted tiene una Burocracia que mantiene las formas.

Supongamos que tiene una tabla llamada gabinete de archivo

FileCabinet(

  • Gabinete ID (pk)
  • Los archivos de IDENTIFICADOR (fk) )

cada columna contiene una clave principal para el gabinete y una clave externa de los archivos.Estos archivos pueden ser formularios de impuestos, la salud de los papeles del seguro, viaje de campo de los permisos de resbalones, etc

Archivos(

  • Los archivos de ID (pk)

  • Archivo de ID (fk)

  • La próxima IDENTIFICADOR de Archivo (fk)

)

esto sirve como un contenedor de los Archivos

Archivo(

  • Archivo de ID (pk)

  • Información sobre el archivo

)

este es el archivo específico

Puede haber mejores maneras de hacer esto, y hay, dependiendo de sus necesidades específicas.El ejemplo ilustra el posible uso.

Una lista puede ser almacenado por tener una columna contiene el offset (índice de la lista posición) -- una inserción en el medio hay, a continuación, el incremento por encima de todos los nuevos padres y, a continuación, hacer un insert.

Incremento de la SERIE 'índice' por 100, pero agregar manualmente los valores intermedios con un 'índice' igual a la Anterior+Siguiente / 2.Si alguna vez saturar el 100 filas, reordenar el índice volver a 100s.

Esto debe mantener la secuencia con el índice principal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top