verknüpfte Liste in SQL und Bäumen

8

Obwohl SQL eher mit tabellenähnlichen Operationen und weniger mit rekursiven Operationen verbunden ist, möchten wir beispielsweise das Konzept der verknüpften (oder doppelt verknüpften) Liste implementieren (wie wir es beispielsweise in C getan haben).
Gibt es eine Möglichkeit, dies effizient zu tun, wenn man bedenkt, dass Elemente von einem beliebigen Ort an einen beliebigen Ort auf einer verknüpften Liste verschoben werden können?
Eine Lösung mit CLR?
Oder ist es wirklich etwas, das niemals zu SQL Server gebracht werden sollte?

Beachten Sie, dass sich diese Frage auch zu einer Diskussion über verknüpfte Listen und VS-Bäume entwickelt hat

Obwohl ich SQL Server angeheftet habe, ist dies eine akademische Frage, daher ist eine Lösung in jeder anderen auch gut, selbst wenn wir nur zu dem Schluss kommen, dass dies etwas ist, das niemals in die Datenbank aufgenommen werden sollte.

JoseTeixeira
quelle

Antworten:

10

Eine verknüpfte Liste ist nur ein sehr einfacher gerichteter azyklischer Graph. Es gibt keinen Grund, warum dies in irgendeiner Weise schwierig ist oder für SQL Server vermieden werden sollte.

Denken Sie darüber nach, Baumstrukturen sind komplexer als verknüpfte Listen. Bei jeder Implementierung eines Forums im Internet, in dem Daten in einer relationalen Datenbank gespeichert werden, wurden die Grundlagen einer verknüpften Liste implementiert. Auf dieser Seite bilden die Antworten eine verknüpfte Liste. Sie können hinzugefügt und gelöscht werden. Sie können in Position gebracht werden (auch bekannt als Stimmen).

Die zu verwendende Darstellung hängt nur von den Kompromissen ab, die Sie zwischen der Pflege der Liste (Einfügen, Aktualisieren, Löschen) und dem Abrufen eingehen möchten.

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

Update: Die Frage bezieht sich auf Bäume und verknüpfte Listen in SQL Server

SQL Server verfügt über den Datentyp HierarchyId, der die Implementierung und Abfrage von baumartigen Strukturen vereinfacht.

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