Pergunta

Qual é a melhor maneira de armazenar uma lista ligada em um banco de dados mysql para que insere são simples (i.e.você não tem para reindexar um monte de coisas de cada vez) e de tal forma que a lista pode ser facilmente retirado em ordem.

Foi útil?

Solução

Armazenar um número inteiro coluna na sua tabela chamada 'posição'.Gravar um 0 para o primeiro item na sua lista, 1 para o segundo item, etc.Índice de coluna em seu banco de dados, e quando você quer puxar seu valores, de ordenação por coluna.

 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 inserir um valor no índice 3, modificar as posições das linhas 3 e acima e, em seguida, insira:

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

Outras dicas

Usando Adrian solução, mas em vez de incrementar por 1, o incremento de 10 ou até 100.Em seguida, as inserções podem ser calculados à metade da diferença do que você está inserindo entre sem ter para actualizar tudo abaixo da inserção.Escolha um número grande o suficiente para lidar com a sua média de número de inserções - se ele for muito pequena, você terá que cair de volta para a atualização de todas as linhas com uma posição mais alta durante uma inserção.

criar uma tabela com dois auto referenciar colunas PreviousID e NextID.Se o item é a primeira coisa na lista PreviousID será nulo, se for o último, NextID será nulo.O SQL será parecido com este:

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
}

Uma lista ligada pode ser armazenado usando recursiva ponteiros na tabela.Este é quase o mesmo que as hierarquias são armazenados no Sql e isso é usando o recursiva de associação padrão.

Você pode saber mais sobre ele aqui.

Espero que isso ajude.

A opção mais simples seria criar uma tabela com uma linha por item de lista, uma coluna para o item posição, e colunas para outros dados do item.Em seguida, você pode usar ORDER BY na posição da coluna para recuperar na ordem desejada.

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 a lista de apenas atualizar a posição e, em seguida, inserir/excluir registros, conforme necessário.Para inserir um item em uma lista 1 no índice de 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;

Desde que as operações sobre a lista pode exigir vários comandos (por exemplo, um insert vai exigir uma INSERÇÃO e de uma ATUALIZAÇÃO), certifique-se de sempre executar os comandos dentro de uma transação.

Uma variação desta opção simples é ter posição incrementando a algum fator para cada item, digamos que 100, de modo que, quando você executar um INSERT nem sempre você precisa renumerar a posição dos elementos seguintes.No entanto, isso requer um pouco mais de esforço para trabalhar fora quando incrementar os seguintes elementos, assim, você perde a simplicidade, mas o ganho de desempenho se você vai ter muitas pastilhas.

Dependendo de suas necessidades outras opções podem recurso, tais como:

  • Se você deseja executar muitas manipulações na lista e não muitas recuperações, se você preferir, uma coluna de ID apontando para o próximo item na lista, em vez de usar uma coluna de posição.Em seguida, você precisa iterativo lógica na obtenção da lista, a fim de obter os itens em ordem.Isto pode ser relativamente facilmente implementado em um procedimento armazenado.

  • Se você tem muitas listas, uma forma rápida para serialise e deserialise sua lista de texto ou texto/binário, e você só deseja armazenar e recuperar toda a lista e, em seguida, armazenar a lista inteira como um único valor em uma única coluna.Provavelmente não é o que você está fazendo por aqui.

Este post é antigo, mas ainda vou dar a minha .02$.Atualizando a cada registro em uma tabela ou conjunto de registros de sons louco para resolver a encomenda.a quantidade de indexação também louco, mas parece que a maioria tem aceitado.

Louco solução que eu vim com a reduzir as atualizações e indexação é criar duas tabelas (e na maioria dos casos de uso, você não é classificar todos os registros em apenas uma tabela de qualquer maneira).Tabela para armazenar os registros da lista a ser ordenada e a tabela B para o grupo e manter um registo da ordem como uma seqüência de caracteres.a ordem de seqüência de caracteres representa uma matriz que pode ser usada para ordenar os registros selecionados no servidor web ou browser de camada de aplicativo de uma página da web.

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
}

O formato da ordem picada deve ser de identificação, posição e alguns separador para split() sua cadeia.no caso do jQuery UI .classificável('serializar') função gera uma ordem de seqüência de caracteres para você que é PÓS amigável, que inclui a identificação e a posição de cada registro na lista.

A verdadeira magia é o caminho que você escolher para reordenar a lista de selecionados usando a salvo pedido de seqüência de caracteres.isso vai depender do aplicativo que você está construindo.aqui está um exemplo da jQuery para reordenar a lista de itens: http://ovisdevelopment.com/oramincite/?p=155

https://dba.stackexchange.com/questions/46238/linked-list-in-sql-and-trees sugere um truque de usar ponto flutuante coluna de posição para uma rápida insere e o pedido.

Ele também menciona especializada SQL Server 2014 o tipo de dados hierarchyid recurso.

Existem algumas abordagens que eu posso pensar direito, cada um com diferentes níveis de complexidade e flexibilidade.Eu estou supondo que seu objetivo é o de preservar uma ordem de recuperação, em vez de exigir de armazenamento, como um da lista ligada.

O método mais simples seria a de atribuir um valor ordinal para cada registro na tabela (por exemplo,1, 2, 3, ...).Então, quando você recupera os registros, especificar uma ordem sobre o ordinal da coluna para levá-los de volta em ordem.

Essa abordagem também permite que você para recuperar os registros sem levar em conta a participação em uma lista, mas permite a associação em apenas uma lista, e podem exigir uma "lista" id de coluna para indicar para qual lista o registro pertence.

Um pouco mais elaboradas, mas também mais flexível abordagem seria para armazenar informações sobre os membros de uma lista ou listas em uma tabela separada.A tabela vai precisar de 3 colunas:A identificação da lista, o valor ordinal, e uma chave estrangeira ponteiro para o registro de dados.Segundo esta abordagem, os dados subjacentes não sabe nada sobre sua participação em listas, e pode facilmente ser incluído em várias listas.

Eu acho que é muito mais simples de adicionar um criado coluna de Datetime o tipo e a posição da coluna de int, e agora você pode ter duplicado posições, na instrução select utilizar o order by posição, criado desc opção e a sua lista irá ser obtida em ordem.

Isso é algo que eu venho tentando descobrir por um tempo a mim mesmo.A melhor maneira que encontrei até o momento é criar uma única tabela para a lista ligada usando o seguinte formato (este é o pseudo-código):

LinkedList(

  • key1,
  • informações
  • key2

)

key1 é o ponto de partida.Key2 é uma chave estrangeira ligando para si na próxima coluna.Assim, as suas colunas serão link de algo link de algo como isto

col1

  • key1 = 0,
  • informações= 'hello'
  • key2 = 1

Key1 é chave primária de col1.key2 é uma chave estrangeira, levando para o key1 de col2

col2

  • key1 = 1,
  • informações= 'wassup'
  • key2 = null

key2 col2 é definido como nulo, pois não apontam para nada

Quando você insere uma coluna para a tabela, você precisará certifique-se de key2 é definido como null ou você obterá um erro.Depois de entrar na segunda coluna, você pode voltar e definir key2 da primeira coluna da chave primária da segunda coluna.

Isso torna o melhor método para introduzir o número de entradas em um momento, e então voltar e definir a chaves estrangeiras em conformidade (ou a construção de uma interface gráfica que só faz isso para você)

Veja aqui algumas código real que eu tenho preparado (todos do código real trabalhou em MSSQL.Você pode querer fazer alguma pesquisa para a versão do SQL que você está usando!):

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)

*Eu colocá-los em duas separar arquivos, porque ele tem que ser feito em duas etapas.MSSQL não deixá-lo fazer isso em um passo, porque a tabela não existe ainda para a chave estrangeira referência.

Lista ligada é especialmente eficiente em um-para-muitos relacionamentos.Então, se você sempre quis fazer uma matriz de chaves estrangeiras?Bem, esta é uma maneira de o fazer!Você pode fazer uma tabela principal que aponta para a primeira coluna na lista ligada de tabela e, em seguida, em vez de "informações" do campo, você pode usar uma chave estrangeira para a informação desejada tabela.

Exemplo:

Digamos que você tenha uma Burocracia que mantém formas.

Vamos dizer que eles têm uma tabela chamada arquivo de gabinete

FileCabinet(

  • Gabinete ID (pk)
  • Arquivos de ID (fk) )

cada coluna contém uma chave primária para o gabinete e uma chave estrangeira para os arquivos.Esses arquivos podem ser formulários de impostos, seguro de saúde papéis, viagem de campo permissões de deslizamentos etc

Arquivos(

  • Arquivos de ID (pk)

  • IDENTIFICAÇÃO do arquivo (fk)

  • Próximo Arquivo de IDENTIFICAÇÃO (fk)

)

isto serve como um container para os Arquivos

Arquivo(

  • Arquivo de ID (pk)

  • Informações sobre o arquivo

)

este é o arquivo específico

Pode haver melhores maneiras de fazer isso e existem, de acordo com suas necessidades específicas.O exemplo ilustra apenas de uso possíveis.

Uma lista pode ser armazenado por ter uma coluna contêm o deslocamento (lista posição de índice) -- uma inserção no meio é, então, o incremento de todos os acima, o novo pai e, em seguida, fazer um insert.

Incrementar a SÉRIE 'index' por 100, mas adicionar manualmente os valores intermédios com um 'índice' igual a Anterior+ao lado / 2.Se você já saturar a 100 linhas, reordenar o índice de volta para 100s.

Isso deve manter a sequência com índice primário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top