liste liée dans SQL et les arbres

8

Bien que SQL soit plus affilié à des opérations de type table et pas tant à des opérations récursives, disons que nous aimerions implémenter le concept de liste liée (ou double liée) (comme nous l'avons par exemple en C).
Y a-t-il un moyen de le faire efficacement, étant donné que nous pouvons déplacer des éléments d'un endroit à un autre sur une liste chaînée?
Une solution en utilisant CLR?
Ou est-ce vraiment quelque chose qui ne devrait jamais être apporté à SQL Server?

Notez que cette question a également évolué en une discussion de listes liées d'arbres VS

Bien que j'aie épinglé SQL Server, il s'agit d'une question de type universitaire, donc une solution dans n'importe quelle autre est également bonne, même si nous arrivons à la conclusion que c'est quelque chose qui ne devrait jamais être apporté à la base de données.

JoseTeixeira
la source

Réponses:

10

Une liste chaînée n'est qu'un graphique acyclique dirigé très simple. Il n'y a aucune raison pour que cela soit difficile, ou devrait être évité pour le serveur SQL.

Pensez-y, les structures arborescentes sont plus complexes que les listes chaînées. Chaque implémentation d'un forum sur Internet qui stocke des données dans une base de données relationnelle a implémenté les bases d'une liste chaînée. Sur cette même page, les réponses forment une liste chaînée. Ils peuvent être ajoutés et supprimés. Ils peuvent être déplacés en position (aka, classés par votes).

La représentation particulière à utiliser ne dépend que des compromis que vous souhaitez faire entre le maintien de la liste (insertion, mise à jour, suppression) et la récupération.

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

Mise à jour: la question concerne les arbres par rapport aux listes liées dans SQL Server

SQL Server possède le type de données HierarchyId qui est conçu pour faciliter l'implémentation et l'interrogation des structures arborescentes.

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