Деревовидная структура БД
От: widjmak  
Дата: 09.10.07 12:26
Оценка:
Привет. Есть задача, составить структуру БД так, чтобы поиск можно было осувществить алгоритмами поиска вглубь\вширину\итеративным глубинным поиском. У кого какие идеи? СУБД: MSSQL 2005

09.10.07 16:30: Перенесено модератором из '.NET' — TK
Re: Деревовидная структура БД
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 09.10.07 12:33
Оценка:
Здравствуйте, widjmak, Вы писали:

W>Привет. Есть задача, составить структуру БД так, чтобы поиск можно было осувществить алгоритмами поиска вглубь\вширину\итеративным глубинным поиском. У кого какие идеи? СУБД: MSSQL 2005


Гуглить по "деревья в SQL"
<< Ни один дурак не жалуется на то, что он таковым является. Значит, не так уж у них все плохо. >>
Re: Деревовидная структура БД
От: adontz Грузия http://adontz.wordpress.com/
Дата: 09.10.07 12:40
Оценка:
Здравствуйте, widjmak, Вы писали:

W>Привет. Есть задача, составить структуру БД так, чтобы поиск можно было осувществить алгоритмами поиска вглубь\вширину\итеративным глубинным поиском. У кого какие идеи? СУБД: MSSQL 2005


http://www.rsdn.ru/article/db/Hierarchy.xml
Автор(ы): Михаил Голованов
Дата: 28.01.2002

http://www.rsdn.ru/article/db/Dewey.xml
Автор(ы): Глеб Земсков
Дата: 23.05.2006
Разработка иерархических справочников – достаточно часто встречающаяся задача в бизнес-приложениях. Существует достаточно много алгоритмов хранения дерева в реляционной модели. Но им свойственны те, или иные недостатки. Самый распространенный вариант, когда запись имеет ссылку на родительский ключ. Это один из наиболее неоптимальных алгоритмов, так как его сложно реализовать и он неоптимален по доступу. Единственный плюс, что некоторые БД поддерживают рекурсивные запросы, которые облегчают работу с такой схемой. Алгоритм Nested Set более оптимален, но обладает недостатком. Скорость вставки нелинейна, и затрагивает данные, которые не должны участвовать в транзакции. В то же время иерархические справочники можно сделать достаточно просто. Нужно просто воспользоваться классификатором.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Деревовидная структура БД
От: MasterZiv СССР  
Дата: 09.10.07 14:04
Оценка:
widjmak пишет:
> Привет. Есть задача,
...

Что вы конкретно понимаете под
"поиск можно было осувществить алгоритмами поиска
вглубь\вширину\итеративным глубинным поиском" ?
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Деревовидная структура БД
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 09.10.07 14:25
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Что вы конкретно понимаете под

MZ>"поиск можно было осувществить алгоритмами поиска
MZ>вглубь\вширину\итеративным глубинным поиском" ?

То и имеется в виду вестимо — вглубь по дереву, в пределах одного уровня, последовательный обход дерева в глубину.
<< Не присоединяйся к нашему миру наркоманов: нас много, а наркоты мало. >>
Re[3]: Деревовидная структура БД
От: MasterZiv СССР  
Дата: 09.10.07 18:43
Оценка:
Flamer пишет:

> То и имеется в виду вестимо — вглубь по дереву, в пределах одного

> уровня, последовательный обход дерева в глубину.

OK, а зачем вам тогда для этого какая-то особая структура БД ?
Просто берите данные нужные, и обходите в нужном порядке.
Обычного представления в виде таблицы со ссылкой самой на себя хватит.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Деревовидная структура БД
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 09.10.07 19:17
Оценка:
Здравствуйте, MasterZiv, Вы писали:

[]

MZ>OK, а зачем вам тогда для этого какая-то особая структура БД ?

MZ>Просто берите данные нужные, и обходите в нужном порядке.
MZ>Обычного представления в виде таблицы со ссылкой самой на себя хватит.

Во-первых, нужно это не мне. Во-вторых, в указанном вами примере невозможно одним запросом к базе вытащить всех детей нужного узла, всех родителей нужного узла, все узлы одного уровня с указанным узлом и еще много интересных вкусностей. Вместо этого придется извращаться с рекурсивными запросами.

Почитайте таки "Деревья в SQL" на досуге — интересная вещь. Я именно на них уже очень давно делаю иерархические структуры (например, каталоги товаров). Такая структура в случае необходимости произведения вложенного поиска (т.е. "искать товары в этой категории и дочерних категориях") позволяет сохранять прозрачность SQL, т.к. никаких особо извратных запросов не требует, зато очень легко позволяет обходить дерево по нужным критериям _одним_ запросом. Да, вставка и удаление сложнее и требуют перестройки дерева. Зато select всего дерева одним запросом . А структура связки ID->ParentID (о которой вы видимо и говорите) — для указанных топикстартером задач убогая сильно, и ей место разве что в структуре таблиц форумов и пр. вещей со связкой топик->родительский топик.

Честно сказать, у деревьев в SQL есть два существенных недостатка: 1) SQL не совсем прозрачен для понимания (ну да это лечится прочтением книги про структуры данных) и, 2) на очень больших таблицах построение дерева занимает ощутимое время (впрочем, эта информация могла устареть, т.к. последний раз я применял SQL-деревья в большой таблице лет 6-7 назад). Так что применять их надо с умом. И индексы настраивать.

Такой вот гон
<< Если ты не являешься частью решения, то ты являешься частью проблемы. >>
Re[5]: Деревовидная структура БД
От: Ромашка Украина  
Дата: 10.10.07 05:13
Оценка:
Flamer wrote:
> Почитайте таки "Деревья в SQL" на досуге — интересная вещь.

Вы бы ссылку давали, чтоли.

> Честно сказать, у деревьев в SQL есть два существенных недостатка: 1)

> SQL не совсем прозрачен для понимания (ну да это лечится прочтением
> книги про структуры данных) и,

Ну, боюсь что это неправда Ваша.

> 2) на очень больших таблицах построение

> дерева занимает ощутимое время (впрочем, эта информация могла устареть,
> т.к. последний раз я применял SQL-деревья в большой таблице лет 6-7
> назад). Так что применять их надо с умом. И индексы настраивать.

Это тоже неправда.

Вообще говоря, есть два, на мой взгляд, нормальных способа построения
деревьев -- "транзитивное замыкание" и "метод вложенных множеств" (в
кавычки взяты поисковые слова в гугле). Первый более технологичен,
второй в реализации намного сложнее (нормального описания в инете просто
нет), но позволяет эффективно работать с деревьями с большими уровнями
вложенности.
Posted via RSDN NNTP Server 2.1 beta


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[5]: Деревовидная структура БД
От: MasterZiv СССР  
Дата: 10.10.07 14:52
Оценка:
Flamer пишет:

> Во-первых, нужно это не мне. Во-вторых, в указанном вами примере

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

Возможно.

всех
> родителей нужного узла,

Ну добавь еще табличку-результат работы транзитивного замыкания.

все узлы одного уровня с указанным узлом и еще
> много интересных вкусностей.

Ну, можно еще табличку добавить.

Вместо этого придется извращаться с
> рекурсивными запросами.

Не, с этим лучше не надо.

> Почитайте таки "Деревья в SQL" на досуге — интересная вещь. Я именно на


Это мне читать ? Мне-то зачем ?

> книги про структуры данных) и, 2) на очень больших таблицах построение

> дерева занимает ощутимое время (впрочем, эта информация могла устареть,
> т.к. последний раз я применял SQL-деревья в большой таблице лет 6-7

Думаете что за 7 лет в РСУБД что-то существенно изменилось ?
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.