Дочерняя родительская проблема с базой данных и Jtree - PullRequest
0 голосов
/ 04 августа 2011

Я получил дерево с отложенной загрузкой и таблицу в БД под названием Папки, она содержит folderId и parentFolderId.

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

Select * from Folders where parentFolderId=?

достанет мне следующие узлы и так далее, все красиво.

ПРОБЛЕМА. Мое приложение предназначено для копирования структуры из таблицы в файловую систему. Если кто-то выберет узел, он расширит его непосредственных детей, но не внуков.

Запрос к каждой папке на предмет рекурсивности дочерних элементов был моей единственной идеей, но, учитывая, что в моей таблице 10000 строк, я делаю 10000 запросов ... это неправильно, как я могу сделать это правильно?

EDIT:

Я мог бы переформулировать это следующим образом: каков наилучший способ получить полное дерево с учетом родительского узла и всех папок в одной таблице, кроме рекурсивного запроса для детей, потому что в противном случае я запрашиваю БД 10000 раз

EDIT:

Как указано в этой статье http://threebit.net/tutorials/nestedset/tutorial1.html, моя ситуация такова:

Пользователь ищет все узлы под одним узлом.

Это большая проблема, так как большинство пользователей ожидают быстрого получения информации о поиске. Если вы используете какую-то систему EIS, где люди постоянно ищут глубоко вложенный набор реляционной информации, вас скоро уволят. Это означает, что мы должны найти алгоритм O (x) или более быстрый, или переосмыслить схему данных. Поскольку очень немногие администраторы баз данных могут позволить себе переписывать свои схемы по прихоти, вы должны придумать быстрый и простой способ улучшить производительность системы, не портя устаревшие компоненты. Вот почему вы хотите использовать модель вложенного набора.

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

Ваш подход подходит для небольших наборов данных;но если вы хотите увеличить размер, вам нужно взглянуть на модель вложенного множества для решения этой проблемы.На Mysql.com была хорошая статья, но сейчас ее нет.Вот альтернатива: http://www.sitepoint.com/hierarchical-data-database-2/

0 голосов
/ 04 августа 2011

Вот пример запроса с использованием MS SQL Server, который может вам помочь

With Folders As
(
    Select 1 as FolderId, NULL as ParentFolderId UNION
    Select  2, 1 UNION
    Select  3, 1 UNION
    Select  4, 2 UNION
    Select  5, 2
)
Select Folders.FolderId, ISNULL (Children.NumChildFolders, 0) NumChildFolders
From Folders
Left Join
(
    Select ParentFolderId, Count (*) NumChildFolders
    From Folders
    Group By ParentFolderId
) Children
On Folders.FolderId = Children.ParentFolderId
...