lista vinculada em SQL e árvores

8

Embora o SQL seja mais afiliado a operações do tipo tabela e não tanto ao recursivo, digamos que gostaríamos de implementar o conceito de lista vinculada (ou com link duplo) (como temos, por exemplo, em C).
Existe alguma maneira de fazer isso com eficiência, considerando que podemos ter itens que se deslocam de qualquer lugar para qualquer lugar em uma lista vinculada?
Alguma solução usando CLR?
Ou é realmente algo que nunca deve ser trazido para o SQL Server?

Observe que essa questão também evoluiu para uma discussão em listas vinculadas VS árvores

Embora eu tenha marcado o SQL Server, essa é uma questão acadêmica, portanto, uma solução em qualquer outra também é boa, mesmo se chegarmos à conclusão de que isso é algo que nunca deve ser trazido para o banco de dados.

JoseTeixeira
fonte

Respostas:

10

Uma lista vinculada é apenas um gráfico acíclico direcionado muito simples. Não há razão para que isso seja de alguma forma difícil ou deva ser evitado no servidor sql.

Pense nisso: as estruturas em árvore são mais complexas que as listas vinculadas. Toda implementação de um fórum na internet que armazena dados em um banco de dados relacional implementou o básico de uma lista vinculada. Nesta página, as respostas formam uma lista vinculada. Eles podem ser adicionados e excluídos. Eles podem ser movidos na posição (aka, classificados por votos).

A representação específica a ser usada depende apenas das compensações que você deseja fazer entre manter a lista (inserir, atualizar, excluir) e recuperar.

--Works great for INS/UPD/DEL, In order retrieval isn't the best.
CREATE TABLE Item (id int identity, next int, prev int) 

--makes in order retrieval fast, deletes are a problem, inserts may require re-numbering.    
CREATE TABLE Item (id int identity, position  int ) 

--Works great for in-order retrieval, and allow cheap insertion/deletion, 
--certain edge cases might be tricky to handle.
CREATE TABLE (id int identity, position Decimal(24,12 )  ) 
--for inserts, use the average of the before and after, for deletes, just delete.

Atualização: A pergunta é sobre árvores versus listas vinculadas no SQL server

O SQL Server possui o tipo de dados HierarchyId, projetado para facilitar a implementação e a consulta de estruturas em forma de árvore.

CREATE TABLE Item (id int identity, NodeId HierarchyId)
StrayCatDBA
fonte