2010-05-19 3 views
3

Я использую Hibernate/Spring и базу данных MySQL для управления данными.Сохранение древовидных структур в Базах данных

В настоящее время я отображаю древовидную структуру в JTable. Дерево может иметь несколько ветвей, в свою очередь, ветка может иметь несколько ветвей (до девяти уровней) снова или иметь листья. В последнее время у меня есть проблемы с производительностью, как только я хочу создавать новые ветки на более глубоких уровнях.

В это время филиал имеет внешний ключ для своего родителя. Объект domainobject имеет доступ к его родительскому объекту, вызывая getParent(), который возвращает родительскую ветвь. Чем глубже уровень, тем больше времени требуется для создания новой ветки.

результаты Microbenchmark для создания новой отрасли, как:

Уровень 1: 32 мс. Уровень 3: 80 мс. Уровень 9: 232 мс.

Очевидно, что за это отвечает уровень (что означает количество родителей). Поэтому я хотел спросить, есть ли какие-либо придатки для решения этой проблемы. Я не понимаю, почему Hibernate должен знать обо всем дереве объектов (все родители до корня) при создании новой ветви. Но насколько я знаю, это может быть единственной причиной задержки при создании новой ветви, потому что ветка не имеет каких-либо других отношений с другими объектами.

Я был бы очень благодарен за любые обходные пути или предложения.

здоровается, ymene

+0

, наконец, моя регистрация openId работала. Я буду информировать вас, какое решение лучше всего подходит для меня, и оценил u для вашей помощи. Большое спасибо всем. – crusam

ответ

2

В принципе, у вас есть некоторая структура отношений от нескольких до одного? В спящем режиме все зависит от отображения. Измените свое сопоставление, используйте отношения «один ко многим» от родителя к ребенку, используя java.util.Set.

Не используйте ArrayList. Список заказа упорядочен, поэтому hibernate добавит дополнительную колонку только для этого заказа.

Также проверьте свое ленивое имущество. Если вы загрузите родителя, и вы установили lazy = "false" в свой дочерний набор, то все его дети будут загружены из БД, что может повлиять на производительность.

Также проверьте свойство 'inverse' для детей. Если в дочерней таблице верно обратное, это означает, что вы можете управлять дочерним объектом отдельно. В противном случае вы должны сделать это, используя только родительский.

google around for inverse, он обязательно поможет вам.

спасибо.

+0

благодарю вас за подробный ответ. U правы, отношения объявляются «один-ко-многим» и таким образом с использованием наборов. Прежде всего, старайтесь сосредоточиться на моем картографировании. Так что спасибо за ваши намеки. Я проверю все свойства, о которых говорят. – crusam

+0

спасибо, я надеюсь, что он должен сработать для вас. hibernate всегда сложно, и смущает нас ... :) – Parth

1

Я не знаю, как Hibernate обрабатывает это внутренне. Однако существуют разные способы хранения древовидных структур в базе данных. Тот, который достаточно эффективен для многих запросов, выполненных на дереве, использует подход «nested set», но это в основном приведет к проблемам производительности, которые вы видите (например, дорогостоящей вставке). Если вам нужна быстрая вставка или удаление, я бы пошел с тем, что у вас есть, например. простой родительский идентификатор и попытаться увидеть, что Hibernate делает все это время.

+0

Я также читал о вложенных наборах. К сожалению, мне нужна способность быстро менять структуру, поэтому я перестала сосредоточиться на ней, так как вложенные наборы, такие как u, уже говорили, делают структуру изменений дорогой, но отлично подходят для чтения команд. Ваша идея использовать только идентификаторы вместо объектов интересна. Мне это кажется неправильным, но, возможно, стоит попробовать, так как hibernate не сможет решить всю иерархию. Так что спасибо за это! – crusam

1

Если вам не нужно сообщать о своих данных в SQL, вы можете просто преобразовать JTable в базу данных (возможно, используя что-то вроде XStream). Таким образом, вам не придется беспокоиться о дорогих запросах базы данных, связанных с деревьями.

+0

Это было бы дорого для больших деревьев, так как вам нужно было бы сериализовать всю вещь при каждом обновлении и получить все, даже если бы вы хотели только узлы первого уровня. – tster

+0

К сожалению, я должен много сообщать, поэтому я не могу его использовать. – crusam

1

Одна вещь, которую вы можете сделать, это использовать поддержку XML в MySQL.Это даст вам возможность поддерживать иерархию. Я никогда не пользовался поддержкой XML в MySQL, поэтому я не знаю, насколько это полнофункционально, как другие СУБД (SQL Server и DB2, которые я знаю, имеют большую поддержку, возможно, Oracle тоже я бы догадался).
Обратите внимание, что я никогда не использовал спящий режим, поэтому я не знаю, можно ли с ним взаимодействовать, или если вам придется писать свой собственный код БД в этом случае (думаю, вы собираетесь писать ваши собственные запросы).

+0

Я бы предпочел остаться независимым в моей системе управления базами данных, но если я не увижу другого шанса, я попытаюсь исследовать и этот момент. Никогда об этом не слышал, но очень интересный намек. Идти об исследованиях! Спасибо! – crusam

Смежные вопросы