Сохранение древовидных структур в базах данных - PullRequest
3 голосов
/ 19 мая 2010

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

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

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

Результаты микробенчмарка для создания новой ветви:

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

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

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

приветствует, ymene

Ответы [ 4 ]

2 голосов
/ 19 мая 2010

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

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

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

Также проверьте свойство «обратное» для детей. Если для дочерней таблицы значение true, это означает, что вы можете управлять дочерней сущностью отдельно. В противном случае вы должны сделать это, используя только родителей.

Google для обратного, это, безусловно, поможет вам.

спасибо.

1 голос
/ 19 мая 2010

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

1 голос
/ 19 мая 2010

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

1 голос
/ 19 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...