В качестве альтернативы вы можете добавить Прослушиватель событий .
addEventListener vs onclick
Я ничего не знаю о средствах борьбы с наводнениями. Но я взял бы первое средство. И используйте временную таблицу и некоторое время цикл для генерации пути.
-- Pseudo Code TempTable (LastNode, CurrentNode, N)DECLARE @intN INT SET @intN = 1
INSERT INTO TempTable(LastNode, CurrentNode, N) -- Insert first item in list with no up stream items...call this initial condition SELECT LastNode, CurrentNode, @intN FROM your table WHERE node has nothing upstream
WHILE @intN <= 3500 BEGIN SEt @intN = @intN + 1 INSERT INTO TempTable(LastNode, CurrentNode, N) SELECT LastNode, CurrentNode, @intN FROM your table WHERE LastNode IN (SELECT CurrentNode FROM TempTable WHERE N = @intN-1)
IF @@ROWCOUNT = 0 BREAK
END
Если мы предполагаем, что каждый узел указывает одному ребенку. Затем это должно взять не более 3 500 повторений. Если несколько узлов будут иметь того же восходящего поставщика затем, то это возьмет меньше. Но что еще более важно, это позволяет Вам сделать это...
ВЫБЕРИТЕ LastNode, CurrentNode, N ОТ TempTable ORDER BY N
И это позволит Вам видеть, существуют ли какие-либо циклы или какие-либо другие проблемы с Вашим поставщиком. Случайно 3 500 строк не находятся так очень поэтому даже в худшем случае каждого поставщика, указывающего на различного восходящего поставщика, это не должно занимать у этого много времени.
Лучший способ сохранить графики состоит в том, чтобы, конечно, использовать собственный дб графика :-)
Смотрите на neo4j. Это реализовано в Java и имеет Python и привязку Ruby также.
Я описал две страницы Wiki с простыми примерами моделей предметной области, представленных как графики с помощью neo4j: блок и роли. Больше примеров найдено на домене, моделируя страницу галереи.
Традиционно графики или представлены матрицей или вектором. Матрица занимает больше места, но легче обработать (3500x3500 записи в Вашем случае); вектор занимает меньше места (3 500 записей, у каждого есть список того, кого они подключают с).
Это помогает Вам?
я думаю, что Ваша структура данных прекрасна (для SQL Server), но CTE не может быть наиболее эффективным решением для Ваших запросов. Вы могли бы попытаться делать хранимую процедуру, которая пересекает график с помощью временной таблицы в качестве очереди вместо этого, это должно быть более эффективно.
временная таблица может также использоваться для устранения циклов в графике, хотя не должно быть никого
Мой опыт с хранением чего-то как Вы описанный в базе данных SQL Server:
Я хранил матрицу расстояния, говоря, сколько времени занимает путешествовать из точки для указания на B. Я сделал наивное представление и сохранил их непосредственно в таблицу, названную расстояниями со столбцами A, B, расстоянием, время.
Это очень медленно на простом извлечении. Я нашел, что это - партия лучше для хранения моей целой матрицы как текста. Затем получите его в память перед вычислениями, создайте матрицу struxture в памяти и работайте с ним там.
Я мог предоставить некоторый код, но это будет C#.
Да (возможно). Ваш набор данных звучит относительно небольшим, Вы могли загрузить график в память, поскольку матрица смежности или смежность перечисляют и запрашивают график непосредственно - предположение, что Вы программируете.
До дискового формата ТОЧКА является довольно портативной/популярной среди других. Также кажется довольно распространенным сохранить список краев в формате плоского файла как:
vertex1 vertex2 {edge_label1}+
Где первая строка файла содержит количество вершин в графике, и каждая строка после этого описывает края. Направлены ли края или неориентированные, до конструктора. Если Вы хотите явные ориентированные ребра, то описываете их использующий ориентированные ребра как:
vertex1 vertex2
vertex2 vertex1