связанный список в SQL и деревьях

8

Хотя SQL больше связан с табличными операциями, а не с рекурсивными, скажем, мы хотели бы реализовать концепцию связанного (или двойного связывания) списка (как, например, в C).
Есть ли способ сделать это эффективно, учитывая, что у нас могут быть элементы, перемещающиеся из любого места в любое место в связанном списке?
Какое-то решение с использованием CLR?
Или это действительно то, что никогда не следует переносить на SQL Server?

Обратите внимание, что этот вопрос также превратился в обсуждение связанных списков VS деревьев.

Несмотря на то, что я прикрепил SQL Server, это академический вопрос, поэтому решение в любом другом случае также хорошо, даже если мы просто приходим к выводу, что это то, что никогда не должно передаваться в базу данных.

JoseTeixeira
источник

Ответы:

10

Связанный список - это просто очень простой ориентированный ациклический граф. Нет никаких причин, почему это каким-либо образом сложно, или его следует избегать для сервера sql.

Подумайте об этом, древовидные структуры сложнее, чем связанные списки. Каждая реализация форума в Интернете, который хранит данные в реляционной базе данных, реализовала основы связанного списка. На этой же странице ответы образуют связанный список. Их можно добавлять и удалять. Они могут быть перемещены в позиции (иначе, ранжируются по голосам).

Конкретное представление, которое будет использоваться, зависит только от компромиссов, которые вы хотите сделать между ведением списка (вставка, обновление, удаление) и поиском.

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

Обновление: Вопрос о деревьях и связанных списках в SQL-сервере

SQL Server имеет тип данных HierarchyId, который предназначен для упрощения реализации и запросов древовидных структур.

CREATE TABLE Item (id int identity, NodeId HierarchyId)
StrayCatDBA
источник