Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / NoSQL, Big Data Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как построить дерево  [new]
kixiro
Member

Откуда:
Сообщений: 84
Как проще построить взаимосвязь с объектами в noSQL? Требуется хранить данные, связанные между собой по древовидной структуре. Каждый узелок такой структуры хранит несколько параметров(у каждого узелка свой набор), т.е. каждый параметр это свой key - value. Есть ли базы, в которых построение взаимосвязей уже продуманно и это не требуется реализовывать самому? Дерево должно бесконечно расширяться во все направления.
1 дек 10, 22:22    [9872242]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
dexsu
Member

Откуда:
Сообщений: 108
kixiro
Как проще построить взаимосвязь с объектами в noSQL? Требуется хранить данные, связанные между собой по древовидной структуре. Каждый узелок такой структуры хранит несколько параметров(у каждого узелка свой набор), т.е. каждый параметр это свой key - value. Есть ли базы, в которых построение взаимосвязей уже продуманно и это не требуется реализовывать самому? Дерево должно бесконечно расширяться во все направления.

Все предельно просто - каждый "узелок" хранит ссылку на родителя.
2 дек 10, 01:44    [9872756]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
an0nym
Member

Откуда:
Сообщений: 7076
kixiro,

готовы ли вы под это дерево выделить отдельную базу (насколько это большой и важный кусок приложения)?

Почитайте http://habrahabr.ru/blogs/nosql/77909/ . Сам не пробовал, но возможно Neo4J или нечто подобное вам идеально подойдет.
2 дек 10, 03:08    [9872789]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
kixiro
Как проще построить взаимосвязь с объектами в noSQL? Требуется хранить данные, связанные между собой по древовидной структуре. Каждый узелок такой структуры хранит несколько параметров(у каждого узелка свой набор), т.е. каждый параметр это свой key - value. Есть ли базы, в которых построение взаимосвязей уже продуманно и это не требуется реализовывать самому? Дерево должно бесконечно расширяться во все направления.


есть, реляционные базы.
Раньше были иерархические.

Но вопрос: может надо определиться вам нужна носкл база или релаяционная и работать с ней.
Не совсем понятно как вы будете эти связи использовать, даже если реализуете, механизм запросов скуден в носкл базах...
2 дек 10, 11:51    [9873993]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
an0nym
Member

Откуда:
Сообщений: 7076
Winnipuh
kixiro
Как проще построить взаимосвязь с объектами в noSQL? Требуется хранить данные, связанные между собой по древовидной структуре. Каждый узелок такой структуры хранит несколько параметров(у каждого узелка свой набор), т.е. каждый параметр это свой key - value. Есть ли базы, в которых построение взаимосвязей уже продуманно и это не требуется реализовывать самому? Дерево должно бесконечно расширяться во все направления.


есть, реляционные базы.
Раньше были иерархические.

Но вопрос: может надо определиться вам нужна носкл база или релаяционная и работать с ней.
Не совсем понятно как вы будете эти связи использовать, даже если реализуете, механизм запросов скуден в носкл базах...

А еще есть базы на графах, документо-ориентированные базы... nosql - это больше, чем key-value. Почитайте выше ссылку, советую.
2 дек 10, 11:52    [9874007]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
an0nym
Winnipuh
пропущено...


есть, реляционные базы.
Раньше были иерархические.

Но вопрос: может надо определиться вам нужна носкл база или релаяционная и работать с ней.
Не совсем понятно как вы будете эти связи использовать, даже если реализуете, механизм запросов скуден в носкл базах...

А еще есть базы на графах, документо-ориентированные базы... nosql - это больше, чем key-value. Почитайте выше ссылку, советую.


честно говоря не увидел чего-то такого... чудес не бывает

Система ключ/значения сама по себе простая, и не сложная для реализации, но не эффективна, если вы заинтересованы только в запросе или обновлении части данных. Так же трудно реализовать сложные структуры поверх распределенных систем.

Кроме того, зачем автору темы хранить иерархию? чтобы выбирать записи одну за другой?
тогда - да.
Если же он хочте делать сложные выборки множеств, учитывая иерархические связи то я я не вижу как это реализовать на носкл базах.
Расскажите...
2 дек 10, 13:16    [9874875]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
an0nym
Member

Откуда:
Сообщений: 7076
Winnipuh
an0nym
пропущено...

А еще есть базы на графах, документо-ориентированные базы... nosql - это больше, чем key-value. Почитайте выше ссылку, советую.


честно говоря не увидел чего-то такого... чудес не бывает

Система ключ/значения сама по себе простая, и не сложная для реализации, но не эффективна, если вы заинтересованы только в запросе или обновлении части данных. Так же трудно реализовать сложные структуры поверх распределенных систем.

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

Neo4J обладает поистине уникальной моделью данных, храня объекты и связи в качестве узлов и ребер графа. Для запросов, которые соответствуют этой модели (например, иерархических данных) они могут быть в тысячу раз быстрее, чем альтернативные варианты.
2 дек 10, 13:17    [9874885]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6330
В объектных базах есть поля типа "массив" и даже можно получить "массив объектов".

Проектировать надо по другому, с учетом таких возможностей.
2 дек 10, 18:35    [9877588]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
private
Member

Откуда:
Сообщений: 1899
автор
Дерево должно бесконечно расширяться во все направления.
никак, если операции по нему должны быть эффективными. Но можно реализовать для часных случаев.

автор
Если же он хочте делать сложные выборки множеств, учитывая иерархические связи то я я не вижу как это реализовать на носкл базах.
Можно подумать это можно эффективно реализовать на реляионных базах, боль менее сложная база, и такие запросы положат сервер.
В реляционных точно-также это также можно сделать только для часных случаев.

Типовой граф в документной бд (на пример в mongodb) делается просто, каждый узел содержит список всех парентов, в результате одним запросом вы можете вытащить всю ветку графа, запросом в два слова
branch = db.nodes.find({parents: 'branch_root_id'});

Кто-то может привести пример SQL чтобы также вытащить всю ветку в реляционной базе одним запросом (не используя нестандартных фич типа оракловских рекурсий)?
2 дек 10, 18:39    [9877606]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
private
Member

Откуда:
Сообщений: 1899
автор
никак, если операции по нему должны быть эффективными
в смысле никак в обычных документо-ориентированных, в специальных для графов может можно.
2 дек 10, 19:21    [9877800]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
kixiro
Member

Откуда:
Сообщений: 84
Спасибо всем за ответы. Обзор на Хабре хороший, про Neo4j ещё не слышал, буду разбираться. Мало знаний как в SQL так и в NOSQL, пойду читать мат. часть, чтобы понять что мне больше подойдет. Не думаю, что в моем проекте данные резко зашкалят за терабайт...... :) но просто та структура данных, которую я задумал, как мне кажется просто не удобно хранить в обычных таблицах, в то же время остановившись на самой простой noSQL базе ( мне первой попалась KyotoCabinet ) можно изобрести ещё один неудобный велосипед...... так что пойду учить... учить... и ещё раз учить.... для прояснения всего спектра возможностей современных баз данных....
2 дек 10, 20:59    [9878162]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
an0nym
Member

Откуда:
Сообщений: 7076
private
Типовой граф в документной бд (на пример в mongodb) делается просто, каждый узел содержит список всех парентов, в результате одним запросом вы можете вытащить всю ветку графа, запросом в два слова
branch = db.nodes.find({parents: 'branch_root_id'});

Кто-то может привести пример SQL чтобы также вытащить всю ветку в реляционной базе одним запросом (не используя нестандартных фич типа оракловских рекурсий)?

Вы будете очень-очень сильно удивлены - в SQL поступают также.
2 дек 10, 21:51    [9878341]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
private
Member

Откуда:
Сообщений: 1899
где пример СКЛ кода, как вы запишите всех парентов в одну строчку табицы?
2 дек 10, 22:54    [9878567]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
private
Member

Откуда:
Сообщений: 1899
(без использования nested set)
2 дек 10, 23:12    [9878606]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
an0nym
Member

Откуда:
Сообщений: 7076
private,

а откуда вы знаете, что mongodb пишет тоже в одну строчку? :)
2 дек 10, 23:44    [9878648]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
private
Member

Откуда:
Сообщений: 1899
в обектной базе нет строчек, он "пишет" в один из аттрибутов документа (представляющего собой массив), при желании можно также задать индекс и весь граф будет доставаться мгновенно.

потому что я так делал :)
3 дек 10, 02:22    [9878795]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
private
где пример СКЛ кода, как вы запишите всех парентов в одну строчку табицы?


например, можно делать так, я так делал:

1. писать в поле хмл, со всеми парентами
Это в любой реляционной субд и бд.

2. писать массивом, это в некоторых, имеющих такой тип, например в постгресе

Кроме всего эти типы индексируются.

Потом, что означает фраза
"Кто-то может привести пример SQL чтобы также вытащить всю ветку в реляционной базе одним запросом (не используя нестандартных фич типа оракловских рекурсий)?"



в SQL Server тоже есть рекурсии, в постгресе тоже можно красиво оформить выбор.
А то, что вы привели один запрос для выбора всех парентов... вы же помнимаете,
это не аргумент, ну один, а что внутри?
Напишите процедуру в рсубд и вот вам один вызов.
Или используйте возмложности запросов типа with ()..
3 дек 10, 11:45    [9880335]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
private
Member

Откуда:
Сообщений: 1899
автор
1. писать в поле хмл, со всеми парентами
Это в любой реляционной субд и бд.
и субд будет парсить хмл и индексировать то что написано внутри? :)

ну понятно что извернуться и написать процедуру или рекурсию типа With можно. Я этим примером хотел показать не то что это невозможно в принципе, а что делается это все через жопу, поскольку реляционная схема плохо подходит для моделирования таких структур (я собств и ждал когда-же кто-то предложит написание процедуры, для этого простого вобщем-то случая связей).

поэтому не нужно писать что "реляционные универсальны", они не уверсальны, просто все привыкли и смирились с их геморроем, поскольку долгое время ничего другого не было. (и не только что касается графов, чего стоят одни только потуги смоделировать наследование, все эти STI и т.п.)
3 дек 10, 14:02    [9881956]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
private
автор
1. писать в поле хмл, со всеми парентами
Это в любой реляционной субд и бд.
и субд будет парсить хмл и индексировать то что написано внутри? :)

ну понятно что извернуться и написать процедуру или рекурсию типа With можно. Я этим примером хотел показать не то что это невозможно в принципе, а что делается это все через жопу, поскольку реляционная схема плохо подходит для моделирования таких структур (я собств и ждал когда-же кто-то предложит написание процедуры, для этого простого вобщем-то случая связей).

поэтому не нужно писать что "реляционные универсальны", они не уверсальны, просто все привыкли и смирились с их геморроем, поскольку долгое время ничего другого не было. (и не только что касается графов, чего стоят одни только потуги смоделировать наследование, все эти STI и т.п.)


1. если я написал где-то, что рсубд универсальны - покажите. нет, я требую (с)
2. зато я написал что все зависит от задачи, и даже от того, какое дерево будет, т.е количество узлов и т.д.. и предожил варианты навскидку.
Есть еще методы Целко

3. а в чем проблема, если хмл будут индексироваться? я делал эксперименты на деревьях с сотнями тыщ узлов...
3 дек 10, 17:38    [9883888]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
и еще одно, ну почему вы думаете, что если это один вызов, то все так просто и хорошо?

branch = db.nodes.find({parents: 'branch_root_id'});

и что? а вставка поддерева в дерево? а удаление? а нахождение по имени?
а апдейт?
3 дек 10, 17:39    [9883903]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
michaeln
Member

Откуда: Оттуда
Сообщений: 108
Winnipuh
kixiro
Как проще построить взаимосвязь с объектами в noSQL? Требуется хранить данные, связанные между собой по древовидной структуре. Каждый узелок такой структуры хранит несколько параметров(у каждого узелка свой набор), т.е. каждый параметр это свой key - value. Есть ли базы, в которых построение взаимосвязей уже продуманно и это не требуется реализовывать самому? Дерево должно бесконечно расширяться во все направления.


есть, реляционные базы.
Раньше были иерархические.

Но вопрос: может надо определиться вам нужна носкл база или релаяционная и работать с ней.
Не совсем понятно как вы будете эти связи использовать, даже если реализуете, механизм запросов скуден в носкл базах...

А чем это Hive поверх Hbase скуден?
5 дек 10, 14:33    [9888578]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
michaeln
Member

Откуда: Оттуда
Сообщений: 108
kixiro
Как проще построить взаимосвязь с объектами в noSQL? Требуется хранить данные, связанные между собой по древовидной структуре. Каждый узелок такой структуры хранит несколько параметров(у каждого узелка свой набор), т.е. каждый параметр это свой key - value. Есть ли базы, в которых построение взаимосвязей уже продуманно и это не требуется реализовывать самому? Дерево должно бесконечно расширяться во все направления.


Могу послать документ постройки иерархии в Hbase
5 дек 10, 14:42    [9888593]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
kixiro
Member

Откуда:
Сообщений: 84
michaeln, буду очень рад любым примерам :) ( если можно на почту kixiro@gmail.com )
лучше ведь посмотреть как у других это получилось, а потом свое делать....
8 дек 10, 21:26    [9907757]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
kixiro
Member

Откуда:
Сообщений: 84
Я и не думал, что мой вопрос вызовет такой резонанс.... Наверное выбор между SQL и NOSQL можно делать только после оценки на конкретных объемах и на критичность выполнения трудоемких задач. Системы SQL очень развиты по сравнению NOSQL, но ведь исходя из элементарной логики структуру вида дерева неудобно хранить в таблице :)
8 дек 10, 21:30    [9907768]     Ответить | Цитировать Сообщить модератору
 Re: Как построить дерево  [new]
Multy
Member [заблокирован]

Откуда:
Сообщений: 420
kixiro,

В MS SQL 2008 есть тип hierarchyid специально для хранения деревьев http://habrahabr.ru/blogs/sql/27774/

Возможностей вроде как не мало...
13 дек 10, 11:55    [9927969]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / NoSQL, Big Data Ответить