lista vinculada en SQL y árboles

8

Aunque SQL está más afiliado a las operaciones tipo tabla y no tanto a las recursivas, digamos que nos gustaría implementar el concepto de lista vinculada (o doblemente vinculada) (como lo hemos hecho, por ejemplo, en C).
¿Hay alguna manera de hacer esto de manera eficiente, teniendo en cuenta que podemos tener elementos que se mueven de un lugar a otro en una lista vinculada?
¿Alguna solución usando CLR?
¿O es realmente algo que nunca debería llevarse a SQL Server?

Tenga en cuenta que esta pregunta también evolucionó en una lista enlazada VS árboles discusión

Aunque fijé SQL Server, esta es una pregunta académica, por lo que una solución en cualquier otra también es buena, incluso si llegamos a la conclusión de que esto es algo que nunca debería llevarse a la base de datos.

JoseTeixeira
fuente

Respuestas:

10

Una lista vinculada es solo un gráfico acíclico dirigido muy simple. No hay ninguna razón por la cual esto sea de alguna manera difícil o deba evitarse para el servidor sql.

Piénselo, las estructuras de árbol son más complejas que las listas vinculadas. Cada implementación de un foro en Internet que almacena datos en una base de datos relacional ha implementado los conceptos básicos de una lista vinculada. En esta misma página, las respuestas forman una lista vinculada. Se pueden agregar y eliminar. Se pueden mover en posición (es decir, clasificados por votos).

La representación particular que se utilizará depende solo de las compensaciones que desee realizar entre el mantenimiento de la lista (insertar, actualizar, eliminar) y la recuperación.

--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.

Actualización: la pregunta es sobre árboles frente a listas vinculadas en el servidor SQL

SQL Server tiene el tipo de datos HierarchyId que está diseñado para facilitar la implementación y la consulta de estructuras en forma de árbol.

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