ConcurrentHashMap или ConcurrentLinkedQueue или ConcurrentSkipListMap может быть другой опцией, потому что они никогда не будут бросать любое ConcurrentModificationException, даже если вы удалите или добавите элемент.
Существует несколько способов сделать то, в чем Вы нуждаетесь в PostgreSQL.
, Если можно установить модули, посмотрите на tablefunc contrib. Это имеет connectby () функция, которая обрабатывает пересекающие деревья. http://www.postgresql.org/docs/8.3/interactive/tablefunc.html
Также проверяет ltree contrib, который Вы могли адаптировать свою таблицу для использования: http://www.postgresql.org/docs/8.3/interactive/ltree.html
Или можно пересечь дерево сами с функцией PL/PGSQL.
Что-то вроде этого:
create or replace function example_subtree (integer)
returns setof example as
'declare results record;
child record;
begin
select into results * from example where parent_id = $1;
if found then
return next results;
for child in select id from example
where parent_id = $1
loop
for temp in select * from example_subtree(child.id)
loop
return next temp;
end loop;
end loop;
end if;
return null;
end;' language 'plpgsql';
select sum(value) as value_sum
from example_subtree(1234);
Если необходимо сохранить произвольные графики, не только иерархии, Вы могли бы продвинуть Пост-ГРЭС стороне и попробовать базу данных графика такой как AllegroGraph:
Все в базе данных графика хранится как тройное (исходный узел, край, целевой узел), и это оказывает Вам поддержку первого класса управления структурой графика и запросов его с помощью SQL как язык.
Это не интегрируется хорошо с чем-то, любят, в спящем режиме или Django ORM, но если Вы серьезно относитесь к структурам графика (не только, иерархии как модель Nested Set дают Вам), проверяют его.
я также полагаю, что Oracle наконец добавила поддержку реальных Графиков в их последних продуктах, но я поражен, что она заняла много времени, много проблем могло извлечь выгоду из этой модели.
Я думаю, что это легче в SQL 2008 с HierarchyID
Так же, как резюме в стороне, хотя на вопрос ответили очень хорошо, нужно отметить это, если мы рассматриваем это как a:
универсальный вопрос о SQL
тогда реализация SQL довольно проста, поскольку SQL '99 позволяет линейную рекурсию в спецификации (хотя я полагаю, что никакие RDBMSs не реализуют стандарт полностью), через WITH RECURSIVE
оператор. Таким образом с теоретической точки зрения мы можем сделать это прямо сейчас.
этот SQL Server? Разве Вы не могли записать хранимую процедуру TSQL что циклы через и объединения результаты вместе?
мне также интересно, если существует способ только для SQL сделать это все же. От битов я помню от своего географического класса баз данных, должно быть.
Oracle имеет, "ЗАПУСКАЮТСЯ С" и "ПОДКЛЮЧЕНИЕ"
select
lpad(' ',2*(level-1)) || to_char(child) s
from
test_connect_by
start with parent is null
connect by prior child = parent;
Следующие компиляции кода и это протестировали OK.
create or replace function subtree (bigint) returns setof example as $ declare results record; entry record; recs record; begin select into results * from example where parent = $1; if found then for entry in select child from example where parent = $1 and child parent loop for recs in select * from subtree(entry.child) loop return next recs; end loop; end loop; end if; return next results; end; $ language 'plpgsql';
условие "дочерний <> родитель" необходим в моем случае, потому что узлы указывают себе.
Весело проводят время :)
Если Ваш SQL Server использования 2005, существует действительно прохладный способ сделать эту использующую Общую Таблицу Выражения.
Это вынимает все gruntwork из составления временной таблицы, и basicly позволяет Вам делать все это только с С и ОБЪЕДИНЕНИЕ.
Вот хорошее учебное руководство:
http://searchwindevelopment.techtarget.com/tip/0,289483,sid8_gci1278207,00.html
Если Вы захотите портативное решение, которое будет работать над любым ANSI SQL-92 RDBMS, необходимо будет добавить новый столбец к таблице.
Joe Celko является исходным автором Вложенные Наборы подход к хранению иерархий в SQL. Вы можете, Google "вложил наборы" иерархия для понимания больше о фоне.
Или можно просто переименовать порожденный к leftid и добавить , исправился .
Вот моя попытка суммировать Вложенные Наборы, которые горестно потерпят неудачу, потому что я не Joe Celko: SQL является основанным на наборе языком, и модель смежности (хранящий родительский идентификатор) НЕ является основанным на наборе представлением иерархии. Поэтому нет никакого чистого основанного на наборе метода для запросов схемы смежности.
Однако , большинство основных платформ представило расширения в последние годы для контакта с этой точной проблемой. Таким образом, если кто-то отвечает с Определенным для пост-ГРЭС решением, используйте это любой ценой.
Начиная с версии 8.4 PostgreSQL имеет поддержка рекурсивного запроса для общих выражений таблицы с помощью стандарта SQL WITH
синтаксис.
используйте , общий май выражения .
таблицы хочет указать, что это - SQL Server 2005 или выше только. Dale Ragan
вот статья о рекурсии SqlTeam без общих выражений таблицы.