|
|
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Подскажите пожалуйста как лучше осуществлять поиск по дереву используя Hibernate. Есть например запрос "Беларусь Минск" и нужно в дереве найти все элементы которые соответствуют этому запросу. Причем например в дереве может быть связь Беларусь->Минская область->Минск, а пользователь вводит не точную. Подскажите пожалуйста как лучше делать поиск используя Hibernate, может быть в нем есть специальные инструменты для этого? Таблица древа: Tree ID PID name ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2013, 16:04:09 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
К Хибернейту это никакого отношения не имеет, он не для этого создан. Это надо либо хитрый нативный SQL писать (в ORACLE, например, для подобных задач есть CONNECT BY PRIOR), либо что-то с моделью данных делать (например, какая-нибудь промежуточная таблица, денормализация, и т.д.). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2013, 16:25:24 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Лучше возможностями базы пользоваться, в чистом SQL древовидные структуры неэффективно работают. В PostgreSQL, например, есть тип данных ltree, который легко подружить с Hibernate. И даже Native SQL не требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2013, 17:34:48 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
cdtyjv , большое спасибо за ответ. Я mysql использую и насколько знаю в ней нет такой возможности, и я так понимаю хитрый запрос можно создать только средствами Oracle? А в mysql придется довольствоваться лишь созданием дополнительной таблицы. Дополнительная таблицы: TreeTmp treeID (= ссылка на ID таблицы tree) name (= 'Беларусь, Минская область, Минск') Ну и соответственно искать полнотекстовым поиском. Тогда такой вопрос стоит ли переезжать на Oracle, знаю у них есть бесплатные версии или лучше использовать дополнительную таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2013, 17:37:25 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Локшин МаркПрочитайте, например, это . Это всего лишь костыли, чтобы хоть как-то запихать деревья в реляционную модель. Я уж молчу про то как несладко будет автору работать с этими структурами в Hibernate и с какой скоростью будут работать запросы к таким структурам. В современных базах есть более эффективные методы работы с деревьями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2013, 21:36:17 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
МужикЯ уж молчу про то как несладко будет автору работать с этими структурами в Hibernate Не вижу никаких принципиально неразрешимых сложностей. Мужик и с какой скоростью будут работать запросы к таким структурам. А со скоростью запросов-то что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2013, 21:54:42 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
МужикЛокшин МаркПрочитайте, например, это . Это всего лишь костыли, чтобы хоть как-то запихать деревья в реляционную модель. Я уж молчу про то как несладко будет автору работать с этими структурами в Hibernate и с какой скоростью будут работать запросы к таким структурам. В современных базах есть более эффективные методы работы с деревьями. Это не костыли. Это денормализация или матерализация (materialized views) для более быстрого доступа к древовидным структурам. Концептуально это используется не только для деревьев но и вообще для ЛЮБЫХ поисковых структур где search идёт медленно и его нужно ускорить. Тем более что в данном вопросе автор говорит о "нечётком" поиске а здесь без специальных дополнительных структур данных не удасться особо ничего ускорить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2013, 22:37:10 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
mayton , поддерживаю. Реляционная модель имеет всего лишь два преимущества: она предъявляет минимальные требования к размеру стораджа, и она проста в управлении (на уровне DDL). Но размер с текущей стоимостью памяти (как HDD/SSD, так и RAM), первое преимущество все больше теряет свою актуальность. А второе преимущество - простота - аукается тем, что реляционные отношения хорошо себя ведут только когда мы не выходим далеко за рамки обычных джоинов. Как только появляются какие-то заморочки вроде кубов, роллапов или деревьев, то сразу же начинаются проблемы. И всякие "костыли" вроде обратных индексов и прочей денормализации - это абсолютно нормальное решение этих проблем. Весь BI и репортинг на этих "костылях" построен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2013, 23:15:49 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Даже более того. К нормализации до 3НФ (хотя-бы) можно стремиться как до светлого будущего в самых лазурных мечтах писателей-утопистов. Нормальные формы Бойса-Кодда были созданы как теория. Как попытка внести ясность в дикий хаос денормализованных входных данных которые нужно как-то загрузить в БД и обрабатывать. И следовать им можно лишь так как мы следуем советам "не есть пола" и "надевать зимой шерстяные носки". Эти советы (или тезисы или постулаты) естественны и понятны любому нормальному челу с физ-мат образованием без всякого пафоса и театральности. 3НФ это просто советы. Или пожелания. Всё равно в любой крупной БД или системе есть staging tables, log tables, report tables в которых нормализация едва-ли тянет на 1НФ. Вы от этого никуда не денетесь. А что касается ваших файловых систем или хранилищь (к которым теоретически тоже можно предьявить определённые пожелания по НФ) так там "вообще - конь не валялся". Дубли. Версии одного и того-же файла. Копии файлов. Линки на файлы. Архивы с дублями e.t.c. И нас этот факт не беспокоит. А когда стоит задача - форсировать аналитику с OLAP или MatViews то здесь сам вендор предлагает тулзы чтобы вы красимо и изящно пнули старика Кодда в его старую задницу дескыть - "Прости старичелло, я теорию уважаю но перформанс страдает. Извини". Вот такая ботва. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2013, 23:57:21 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Локшин Марк , вы написали что не обязательно использовать полнотекстовый поиск. Дело в том что мне вообще нужно: 1. Получить все элементы дерева по не точному поиску (для всплывающих подсказок); 2. Получить самого 1 родителя по потомку. Поясню по 1 пункту. Вообще нужно для всплывающих подсказок при поиске. Структура: СНГ |_Беларусь |_Минская область |_Минск |_Солигорск Запрос пользователя (может быть и более точным): СНГ Минская область Результат: Минск, Минская область, Беларусь, СНГ Солигорск, Минская область, Беларусь, СНГ Какая будет логика поиска? А что если города повторяются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 17:51:01 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
В моноширном шрифте структура будет точнее. Код: java 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 18:42:19 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Придется пихать путь в узлы, в самом простом варианте NODES ID NAME PARENT PATH LEVEL1 Беларусь 0 Беларусь 02 Минская область 1 Беларусь->Минская область 13 Минск 2 Беларусь->Минская область->Минск 2 соответственно level и path надо поддерживать руками ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 19:00:48 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
z3r9, автор, нужны все кейсы запроса. Ты нарисовал "СНГ Минская область". А что еще пользователь может вводить? В каком порядке? Может ли он вводить сокращения (префиксный поиск), e.t.c. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 21:51:41 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
z3r9 Запрос пользователя (может быть и более точным): СНГ Минская область Результат: Минск, Минская область, Беларусь, СНГ Солигорск, Минская область, Беларусь, СНГ Какая будет логика поиска? Например такая: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. Если нужны только листья дерева, то это тоже несложно делается. Ну и индексы добавить. z3r9А что если города повторяются? А в чем проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 23:46:17 |
|
||
|
Hibernate и поиск по дереву
|
|||
|---|---|---|---|
|
#18+
Локшин Марк , спасибо большое за ответ, смысл понял, точно также можно и по не полному слову найти. Единственное заморочки с поддержкой такой структуры, в плане целостности и изменения. Спасибо большое всем за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2013, 19:23:47 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38427395&tid=2128406]: |
0ms |
get settings: |
4ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
193ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 183ms |
| total: | 438ms |

| 0 / 0 |
