powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Быстрый сложный поиск по большому дереву
39 сообщений из 39, показаны все 2 страниц
Быстрый сложный поиск по большому дереву
    #34654771
Sev_Reo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые коллеги!
Прошу Вас, многопытных, помочь мне в следующей задаче.
Есть такая структура данных:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table Node (
	ID int,
	ParentNodeID int,
	Name varchar( 10 ),
	Attribute1 varchar( 10 ),
	Attribute2 varchar( 10 ),
	...
	Attribute10 varchar( 10 )
)

create table NodeProperty (
	ID int,
	NodeID int,
	Name varchar( 10 ),
	Value varchar( 10 )
)

Думаю, здесь очевидно, что колонки ID - это PK, а NodeProperty.NodeID - это FK на Node.ID.

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

Предполагается, что таблицы Node и NodeProperty будут заполнятся с интенсивностью ~ 1M и 10M записей в день соответственно.

Внимание, вопрос! Что нужно сделать с приведенной структурой и/или какие подходы к реализации самого процесса поиска использовать, чтоб после месяца работы приложения пользователь смог все-таки дождаться ответа на свой вопрос?

Заранее спасибо.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34654781
Sev_Reo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл добавить, что когда в запросе поминается родитель, то он не обязательно непосредственный.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34654814
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sev_ReoЕсть непреодолимое желание делать запросы вида " Найти все ноды с именем таким-то И со значениями некоторых атрибутов такими-то И чтоб у этих нодов в родителях были ноды с такими-то именами, атрибутами и пропертями И чтоб у этих родителей были еще родители уже с другими именами, атрибутами и пропертями."
Можно предложить создать таблицу "Родители", в которой перечислить всех родителей этой ноды.
По ходу можно указать и уровень дальности родителя (-1, -2, -3 итп.).
Может понадобиться в условиях запросов, типра "среди всех родителей, которые не дальше 2-го поколения".

В таком случае ваши условия можно формулировать простым JOIN-ом
NODE - PARENTS - NODE.

Sev_ReoПредполагается, что таблицы Node и NodeProperty будут заполнятся с интенсивностью ~ 1M и 10M записей в день соответственно.При такой интенсивности заполнения вам придется посмотреть в какой размер вам встанет такая новая таблица и будет ли успевать ее заполнять сервер.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34654815
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sev_Reo, исходную задачу опишите.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34654852
parserrr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если подумать, то на SQL можно сделать. В Оракле для этого иерархические запросы есть.
А если не думать, выбираем данные в XML, натравливаем XSLT, получаем результат.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34655473
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bely Sev_ReoЕсть непреодолимое желание делать запросы вида " Найти все ноды с именем таким-то И со значениями некоторых атрибутов такими-то И чтоб у этих нодов в родителях были ноды с такими-то именами, атрибутами и пропертями И чтоб у этих родителей были еще родители уже с другими именами, атрибутами и пропертями."
Можно предложить создать таблицу "Родители", в которой перечислить всех родителей этой ноды.
По ходу можно указать и уровень дальности родителя (-1, -2, -3 итп.).
Может понадобиться в условиях запросов, типра "среди всех родителей, которые не дальше 2-го поколения".

В таком случае ваши условия можно формулировать простым JOIN-ом
NODE - PARENTS - NODE.

Sev_ReoПредполагается, что таблицы Node и NodeProperty будут заполнятся с интенсивностью ~ 1M и 10M записей в день соответственно.При такой интенсивности заполнения вам придется посмотреть в какой размер вам встанет такая новая таблица и будет ли успевать ее заполнять сервер.

Разумный подход для малых объёмов и/или для относительно плоских деревьев. В худшем случае требует N**2/2 записей в таблице пар предок-потомок, что приводит за месяц к 10**15 записей.

Кстати, Sev_Reo, может быть стоит использовать bigint вместо int? Иначе при указанных темпах через 8-16 месяцев у вас могут появится проблемы.

Если запросы являются относительно статическими можно заготовить несколько шаблонов joins, которые будут выполнять необходимую фильтрацию.

В случае динамических и/или глубоких запросов наверно предстоит генерировать нечто процедурное.

Если диалект позволяет построить индексы для XPATH запросов, следует исследовать производительность, IMHO.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34655479
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
parserrrЕсли подумать, то на SQL можно сделать. В Оракле для этого иерархические запросы есть.при большой вложенности JOIN побыстрее будет, пожалуй, чем CONNECT BY.
parserrrА если не думать, выбираем данные в XML, натравливаем XSLT, получаем результат.А если подумать, то на объемах в несколько млн. XML просто помрет.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34655504
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drevРазумный подход для малых объёмов и/или для относительно плоских деревьев. В худшем случае требует N**2/2 записей в таблице пар предок-потомок, что приводит за месяц к 10**15 записей.Если люди не боятся пополнения в млн. строк ежедневно , то бояться таблички в несколько млрд. строк, состоящей из двух чисел глупо.
Здесь надо смотреть на реальную глубину необходимого поиска.

drevВ случае динамических и/или глубоких запросов наверно предстоит генерировать нечто процедурное.процедурный поиск по нескольким млн. строк... и Вы полагаете это сможет работать за адекватное время? :)
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34655654
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bely drevРазумный подход для малых объёмов и/или для относительно плоских деревьев. В худшем случае требует N**2/2 записей в таблице пар предок-потомок, что приводит за месяц к 10**15 записей.Если люди не боятся пополнения в млн. строк ежедневно , то бояться таблички в несколько млрд. строк, состоящей из двух чисел глупо .
Здесь надо смотреть на реальную глубину необходимого поиска.

drevВ случае динамических и/или глубоких запросов наверно предстоит генерировать нечто процедурное.процедурный поиск по нескольким млн. строк... и Вы полагаете это сможет работать за адекватное время? :)

1. Нет, не поиска, а дерева .

За год при достачной глубине дерева табличка легко уйдёт в терабайты.

Поэтому глупо не просчитывать это заранее.

2. Безусловнo. При достаточной глубине поиска один селект просто не справится. Поэтому придется организовывать их цепочку с помощью процедуры.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34655716
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drev1. Нет, не поиска, а дерева .
За год при достачной глубине дерева табличка легко уйдёт в терабайты.
Поэтому глупо не просчитывать это заранее.Считать надо, не спорю.
Но не теоретически, с учетом пролета всех комет, а исходя из реальных предположений о будующих данных.

drev Belyпроцедурный поиск по нескольким млн. строк... и Вы полагаете это сможет работать за адекватное время? :)2. Безусловнo. При достаточной глубине поиска один селект просто не справится. Поэтому придется организовывать их цепочку с помощью процедуры.Ну вот вам примерные исходные данные.
Глубина дерева - от 1 до 50, средняя глубина - 10.

Первое условие (на сам узел) - возвращает примерно 1 млн строк.
Второе условие (на родителя 1) - выдаст результат 10 тыс. строк
Третье условие (на родителя родителя) - выдаст в результате 1000 строк

Можете "коротенько" набросать алгоритм процедурки, которая будет быстрее селекта?
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34655820
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
до кучи:
не забыть исследовать возможности покрывающего кластерного индекса (с интенсивностью ~ 1M и 10M записей в день, шансы пережить месяц для такого исследования наверное есть :))
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34655948
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bely drev1. Нет, не поиска, а дерева .
За год при достачной глубине дерева табличка легко уйдёт в терабайты.
Поэтому глупо не просчитывать это заранее.Считать надо, не спорю.
Но не теоретически, с учетом пролета всех комет, а исходя из реальных предположений о будующих данных.

drev Belyпроцедурный поиск по нескольким млн. строк... и Вы полагаете это сможет работать за адекватное время? :)2. Безусловнo. При достаточной глубине поиска один селект просто не справится. Поэтому придется организовывать их цепочку с помощью процедуры.Ну вот вам примерные исходные данные.
Глубина дерева - от 1 до 50, средняя глубина - 10.

Первое условие (на сам узел) - возвращает примерно 1 млн строк.
Второе условие (на родителя 1) - выдаст результат 10 тыс. строк
Третье условие (на родителя родителя) - выдаст в результате 1000 строк

Можете "коротенько" набросать алгоритм процедурки, которая будет быстрее селекта?

1. будующих - это красиво:)

2. Просчитать это может только спросивший. Данные у него. А Вы, с Вашими "несколькими миллиардами" ввели его в заблуждение.

3. Вы не умеете либо читать, либо считать.

Где Вы видите " При достаточной глубине поиска " ?

В Вашем достаточно безграмотно поставленном примере глубина поиска равна 2. От внука до деда. Глубина дерева абсолютно не релевантна в поставленной Вами задаче.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34655998
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drev2. Просчитать это может только спросивший. Данные у него. А Вы, с Вашими "несколькими миллиардами" ввели его в заблуждение.Телепатическая экспертная оценка.
Зато вы его со своими теоретическим экспонентным ростом ввели в страх.

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

drev3. Вы не умеете либо читать, либо считать.
Где Вы видите " При достаточной глубине поиска " ?
В Вашем достаточно безграмотно поставленном примере глубина поиска равна 2. От внука до деда. Глубина дерева абсолютно не релевантна в поставленной Вами задаче.Это вы недочитали. Вот изначальное условие от автора:
авторЗабыл добавить, что когда в запросе поминается родитель, то он не обязательно непосредственный.Так что родитель я трактовал в этом ключе.
Или для вас глубина поиска до 50 - невелика?

Ответа насчет алгоритма процедурки - я так и не дождался... а было бы интересно посмотреть.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34656027
2b&2b
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table Node (
	ID int,
	ParentNodeID int,
	Name varchar( 10 ),
	Attribute1 varchar( 10 ),
	Attribute2 varchar( 10 ),
	...
	Attribute10 varchar( 10 )
)

Советовал бы
1) посмотреть на этом форуме сообщения по структуре хранения деревьев (поскольку
только внесение одного допольнительного поля в эту структуру CountNodeChilds позволяет
существенно (в разы) сократить затраты на обработку дерева)
2) Качнуть в вашу структуру "мусора" в количестве не менее 1 000 000 записей и потренироваться
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34656147
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bely drev2. Просчитать это может только спросивший. Данные у него. А Вы, с Вашими "несколькими миллиардами" ввели его в заблуждение.Телепатическая экспертная оценка.
Зато вы его со своими теоретическим экспонентным ростом ввели в страх.

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

drev3. Вы не умеете либо читать, либо считать.
Где Вы видите " При достаточной глубине поиска " ?
В Вашем достаточно безграмотно поставленном примере глубина поиска равна 2. От внука до деда. Глубина дерева абсолютно не релевантна в поставленной Вами задаче.Это вы недочитали. Вот изначальное условие от автора:
авторЗабыл добавить, что когда в запросе поминается родитель, то он не обязательно непосредственный.Так что родитель я трактовал в этом ключе.
Или для вас глубина поиска до 50 - невелика?

Ответа насчет алгоритма процедурки - я так и не дождался... а было бы интересно посмотреть.


1. " экспонентным " рассмешили:) У Вас N в квадрате - это экпонента?:) А не полином? :) Вас из какого класса средней школы выгнали?:)

2. Ок, объясняю для второгодников:) Судя по постановке задача очень похожа на сериализацию XML, где атрибуты есть наиболее часто встречающиеся из атрибутов элементов, а пропертиз - остальные. Соответственно, поиск, который он описывал выражается через xpath.

Слово "родитель" занято. Если вы меняете условие задачи (а условие, которое вы написали НЕ содержало никаких определений слова "родитель"), то следовало использовать слово "предок" (ancestor).

Если вы хотите поставить задачу нормально - опишите xpath (можно словами, если у вас получится) и приложите свой вариант селекта. А затем я напишу вам xpath посложнее и вы попробуете его выразить с помощью одного селекта, ок? После того, как у Вас не получится, я покажу, как это сделать с помощью процедуры.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34656180
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drevСлово "родитель" занято. Если вы меняете условие задачи (а условие, которое вы написали НЕ содержало никаких определений слова "родитель"), то следовало использовать слово "предок" (ancestor).

Если вы хотите поставить задачу нормально - опишите xpath (можно словами, если у вас получится) и приложите свой вариант селекта. А затем я напишу вам xpath посложнее и вы попробуете его выразить с помощью одного селекта, ок? После того, как у Вас не получится, я покажу, как это сделать с помощью процедуры.Неправильная трактовка родителя - у автора.
кто девушку кормит, тот ее и танцует. Поэтому я все и излагал в терминах автора.

Если не можете привести алгоритм процедурки - то так и признайтесь.
Смеятся не буду.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34656272
Sev_Reo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проясню ситуацию по данным: если создавать таблицу родителей, то ее размер будет где-то в 3-5 раз больше таблицы нодов. Т.е. порядка 90M - 150M записей через месяц работы... Не самый аппетитный вариант.

BelyЕсли люди не боятся пополнения в млн. строк ежедневно...
Люди боятся, еще как боятся! Но выбирать особо не приходится...


drevКстати, Sev_Reo, может быть стоит использовать bigint вместо int? Иначе при указанных темпах через 8-16 месяцев у вас могут появится проблемы.

Да, именно bigint я и использую, но поскольку для примера это не важно, решил не париться с подробностями.

Если запросы являются относительно статическими можно заготовить несколько шаблонов joins, которые будут выполнять необходимую фильтрацию.

Увы, не являются

В случае динамических и/или глубоких запросов наверно предстоит генерировать нечто процедурное.

Например? Просто обозначьте направление, пожалуйста...

Если диалект позволяет построить индексы для XPATH запросов, следует исследовать производительность, IMHO.

А просветите, пожалуйста, какие диалекты такое позволяют?

............

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

В точку! Респект!


Слово "родитель" занято. Если вы меняете условие задачи (а условие, которое вы написали НЕ содержало никаких определений слова "родитель"), то следовало использовать слово "предок" (ancestor).

OK. Виноват, исправлюсь.




LRдо кучи:
не забыть исследовать возможности покрывающего кластерного индекса (с интенсивностью ~ 1M и 10M записей в день, шансы пережить месяц для такого исследования наверное есть :))

А можно здесь подробнее?


2b&2bСоветовал бы
1) посмотреть на этом форуме сообщения по структуре хранения деревьев (поскольку
только внесение одного допольнительного поля в эту структуру CountNodeChilds позволяет
существенно (в разы) сократить затраты на обработку дерева)
2) Качнуть в вашу структуру "мусора" в количестве не менее 1 000 000 записей и потренироваться

Исключительно полезные советы! Большое человеческое спасибо! До новых встреч!
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34656476
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кусочек скрипта и упоминание о bigint дает основание подозревать mssql, и, если это mssql2005, то там эта идея(черпать запрашиваемые данные прямо из индекса) развита еще больше (на некластерные индексы), цитирую BOL:
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/973b128d-5114-4d48-8eab-52497b47611e.htmIn SQL Server 2005, a nonclustered index can be extended by including nonkey columns in addition to the index key columns. The nonkey columns are stored at the leaf level of the index b-tree.
...
Performance gains are achieved in select operations because the query optimizer can locate all the required column data within the index; the table or clustered index is not accessed. However, having too many included columns may increase the time that is required to perform insert, update, or delete operations to the underlying table or indexed view because of increased index maintenance.

то же в другом топике
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/d198648d-fea5-416d-9f30-f9d4aebbf4ec.htmAn index with included nonkey columns can significantly improve query performance when all columns in the query are included in the index either as key or nonkey columns. Performance gains are achieved because the query optimizer can locate all the column values within the index; table or clustered index data is not accessed resulting in fewer disk I/O operations.

Note:
When an index contains all the columns referenced by the query it is typically referred to as covering the query.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34656606
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRКусочек скрипта и упоминание о bigint дает основание подозревать mssql, и, если это mssql2005, то там эта идея(черпать запрашиваемые данные прямо из индекса) развита еще больше (на некластерные индексы), цитирую BOL:Судя по описанию, аналогичная структура в оракле называется IOT ( Index Organized Table ).
Это если рассматривается не только MS, а есть еще и другие БД.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34656776
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelyСудя по описанию, аналогичная структура в оракле называется IOT
Не совсем так, точнее, совсем не так. IOT - это структура, аналогичная кластерному индексу. Описанная LR фича прямого аналога в Oracle не имеет, впрочем, зачем она нужна, я честно говоря так и не понял - году в 2005-м, когда ее анонсировали, было большое обсуждение на эту тему, и тогда я так и не вынес реального примера, где она позволяет добиться чего-то вкусного.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34659877
Sev_ReoВнимание, вопрос! Что нужно сделать с приведенной структурой и/или какие подходы к реализации самого процесса поиска использовать, чтоб после месяца работы приложения пользователь смог все-таки дождаться ответа на свой вопрос?
Напрасно Вы проигнорировали пост:

_____________________
С уважением , Андрей.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34659879
guest_20040621 Sev_Reo, исходную задачу опишите.
Иерархическая модель, мягко говоря, не самая эффективное решение для хранения исторических данных, если они таковыми являются.
_____________________
С уважением , Андрей.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34660135
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sev_ReoПроясню ситуацию по данным: если создавать таблицу родителей, то ее размер будет где-то в 3-5 раз больше таблицы нодов. Т.е. порядка 90M - 150M записей через месяц работы... Не самый аппетитный вариант.

BelyЕсли люди не боятся пополнения в млн. строк ежедневно...
Люди боятся, еще как боятся! Но выбирать особо не приходится...


drevКстати, Sev_Reo, может быть стоит использовать bigint вместо int? Иначе при указанных темпах через 8-16 месяцев у вас могут появится проблемы.

Да, именно bigint я и использую, но поскольку для примера это не важно, решил не париться с подробностями.

Если запросы являются относительно статическими можно заготовить несколько шаблонов joins, которые будут выполнять необходимую фильтрацию.

Увы, не являются

В случае динамических и/или глубоких запросов наверно предстоит генерировать нечто процедурное.

Например? Просто обозначьте направление, пожалуйста...

Если диалект позволяет построить индексы для XPATH запросов, следует исследовать производительность, IMHO.

А просветите, пожалуйста, какие диалекты такое позволяют?

............

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

В точку! Респект!


Слово "родитель" занято. Если вы меняете условие задачи (а условие, которое вы написали НЕ содержало никаких определений слова "родитель"), то следовало использовать слово "предок" (ancestor).

OK. Виноват, исправлюсь.




LRдо кучи:
не забыть исследовать возможности покрывающего кластерного индекса (с интенсивностью ~ 1M и 10M записей в день, шансы пережить месяц для такого исследования наверное есть :))

А можно здесь подробнее?


2b&2bСоветовал бы
1) посмотреть на этом форуме сообщения по структуре хранения деревьев (поскольку
только внесение одного допольнительного поля в эту структуру CountNodeChilds позволяет
существенно (в разы) сократить затраты на обработку дерева)
2) Качнуть в вашу структуру "мусора" в количестве не менее 1 000 000 записей и потренироваться

Исключительно полезные советы! Большое человеческое спасибо! До новых встреч!




Извините, что так долго не отвечал.

Отвечу в обратном порядке:

1. Судя по Вашим оценкам количества предком, рискну предположить, что у Вас сохраняются средних размеров XML документы, уровня 1000 элементов, более глубокие, чем широкие.

Я бы на вашем месте, если у Вас SQL Server 2005, попробовал бы сохранять документы целиком в поле XML type. Если я правильно оценил данные у вас останется одна таблица в 1000 строк в день.

Далее по полю XML type я бы попробовал создать от одного до нескольких индексов.

(посмотрите ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/f5c9209d-b3f3-4543-b30b-01365a5e7333.htm)

и проверил бы производительность на как минимум месячном объёме данных.


В этой ситуации Вам не придётся имитировать xpath функциональность.

Аналогичные средства есть в Oracle.

2. Если у вас нет подобной функциональности или по каким-то причинам вам она не подходит, Вам придётся эмулировать xpath вручную.

Подъём по дереву придётся делать при помощи joins или CTE.

Для сложных xpath один селект может оказаться слишком сложным.

вам придётся, скорее всего, делать его по частям, скажем вычитывать во временную таблицу и делать join с селектом, имплементирующим следующую часть условий.

Если у Вас есть такая возможность и я правило понял задачу - первый путь лучше.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34660830
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Иерархическая модель, мягко говоря, не самая эффективное решение для хранения
> исторических данных, если они таковыми являются.

И что должно следовать из Вашего глубокомысленного заключения? Задача-то где?
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34660929
guest_20040621И что должно следовать из Вашего глубокомысленного заключения? Задача-то где?
Не совсем понял, какая задача?
Sev_ReoЧто нужно сделать с приведенной структурой
Если ситуация позволяет изменить описанную структуру хранения, то, возможно, имеет смысл её пересмотреть, чтобы привести её к более реляционному виду. И ничего более.
Если свим постом изменил контекст Вашего, извините, не хотел.
_____________________
С уважением , Андрей.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34661230
Бред
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sev_ReoУважаемые коллеги!
Прошу Вас, многопытных, помочь мне в следующей задаче.
Есть такая структура данных:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table Node (
	ID int,
	ParentNodeID int,
	Name varchar( 10 ),
	Attribute1 varchar( 10 ),
	Attribute2 varchar( 10 ),
	...
	Attribute10 varchar( 10 )
)

create table NodeProperty (
	ID int,
	NodeID int,
	Name varchar( 10 ),
	Value varchar( 10 )
)

Думаю, здесь очевидно, что колонки ID - это PK, а NodeProperty.NodeID - это FK на Node.ID.

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

Предполагается, что таблицы Node и NodeProperty будут заполнятся с интенсивностью ~ 1M и 10M записей в день соответственно.

Внимание, вопрос! Что нужно сделать с приведенной структурой и/или какие подходы к реализации самого процесса поиска использовать, чтоб после месяца работы приложения пользователь смог все-таки дождаться ответа на свой вопрос?

Заранее спасибо.

Наверное, можно попробовать Cache. Но творчески, а не как реляционный сервер.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34661245
Sev_Reo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To guest_20040621 & Васильев Андрей :
Да с задачей все просто. Есть XML документы, которые надо хранить в базе и делать по ним различные поиски. This is it. Если вы желаете еще подробностей - спрашивайте.

To drev :
Спасибо за сцылку на хелп - обязательно вникну. Поддержка MSSQL2005 у нас случилась совсем недавно, так что XML data type не был еще достаточно изучен. Кстати, если Вам не составит труда, сориентируйте пожалуйста меня на оракловские аналоги - они тоже пригодятся, а опыта с ним (с ораклом) у меня тоже почти нет.
Специфика приложения такова, что оно должно поддерживать работу с MSSQL2005 и с Ораклом (молюсь, чтоб к этому не добавились всякие DB2, Информиксы и прочие монстры). Естественно, что, чем меньше различий будет в имплементации, тем лучше.
Что касается структуры данных. XML документы содержат ветки глубиной 3-7 уровней. Примерно такой структуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
A
+-B
  +-C
    +-D
      +-E
      +-E
      ...
      +-E
Проблема в том, что узлов Е в документе может быть от 1 до десятков/сотен тысяч. С определенной долей вероятности можно предсказать, что большинство узлов будет приходиться на документы, в которых большое количество листьев на одну ветку. Но количество документов с одним листом на одну ветку тоже может быть весьма значительным - тысячи/десятки тысяч (в день).
Насколько, по Вашему мнению, в этих условиях будет эффективно применение XML data type?
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34661302
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Есть XML документы, которые надо хранить в базе и делать по ним различные поиски.

Незачем хранить XML документы - и файлы вообще - в базе данных (за исключением очень специфичных случаев, о которых речь в данном случае не идет).
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34661322
Sev_Reo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_20040621> Есть XML документы, которые надо хранить в базе и делать по ним различные поиски.

Незачем хранить XML документы - и файлы вообще - в базе данных (за исключением очень специфичных случаев, о которых речь в данном случае не идет).

Растроган. Плачу.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34661398
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sev_ReoTo guest_20040621 & Васильев Андрей :
Да с задачей все просто. Есть XML документы, которые надо хранить в базе и делать по ним различные поиски. This is it. Если вы желаете еще подробностей - спрашивайте.Какие данные в этих XML?
Можете показать примеры?
А также примеры поиска - не абстрактные, а более реальные.

Sev_ReoСпецифика приложения такова, что оно должно поддерживать работу с MSSQL2005 и с Ораклом (молюсь, чтоб к этому не добавились всякие DB2, Информиксы и прочие монстры). Естественно, что, чем меньше различий будет в имплементации, тем лучше.при таком раскладе, вам скорее всего не удасться избежать спкцифики БД.
В обработке XML - уж точно.


Sev_Reo guest_20040621> Есть XML документы, которые надо хранить в базе и делать по ним различные поиски.

Незачем хранить XML документы - и файлы вообще - в базе данных (за исключением очень специфичных случаев, о которых речь в данном случае не идет). Растроган. Плачу.Побольшей части гость прав - хранить лучше не файлы, а данные из файлов.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34661443
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sev_Reo пишет:
> Есть непреодолимое желание делать запросы вида "/Найти все ноды с именем
> таким-то *И* со значениями некоторых атрибутов такими-то *И* чтоб у этих
> нодов в родителях были ноды с такими-то именами, атрибутами и пропертями
> *И* чтоб у этих родителей были еще родители уже с другими именами,
> атрибутами и пропертями."/

Хранить еще и результат транзитивного замыкания дерева в отдельной таблице.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34661468
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Растроган. Плачу.

Обрыдайтесь, - мне никогда не было жаль буратин.
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34661509
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Imho, при таких объемах, рано или поздно, так или иначе, задача сведется к построению/настройке "правильных" индексов. Могут ли индексы на xml-типе в mssql2005 быть "правильными" - х.з., для меня этот вопрос остается открытым...
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34662888
drev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sev_ReoTo guest_20040621 & Васильев Андрей :
Да с задачей все просто. Есть XML документы, которые надо хранить в базе и делать по ним различные поиски. This is it. Если вы желаете еще подробностей - спрашивайте.

To drev :
Спасибо за сцылку на хелп - обязательно вникну. Поддержка MSSQL2005 у нас случилась совсем недавно, так что XML data type не был еще достаточно изучен. Кстати, если Вам не составит труда, сориентируйте пожалуйста меня на оракловские аналоги - они тоже пригодятся, а опыта с ним (с ораклом) у меня тоже почти нет.
Специфика приложения такова, что оно должно поддерживать работу с MSSQL2005 и с Ораклом (молюсь, чтоб к этому не добавились всякие DB2, Информиксы и прочие монстры). Естественно, что, чем меньше различий будет в имплементации, тем лучше.
Что касается структуры данных. XML документы содержат ветки глубиной 3-7 уровней. Примерно такой структуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
A
+-B
  +-C
    +-D
      +-E
      +-E
      ...
      +-E
Проблема в том, что узлов Е в документе может быть от 1 до десятков/сотен тысяч. С определенной долей вероятности можно предсказать, что большинство узлов будет приходиться на документы, в которых большое количество листьев на одну ветку. Но количество документов с одним листом на одну ветку тоже может быть весьма значительным - тысячи/десятки тысяч (в день).
Насколько, по Вашему мнению, в этих условиях будет эффективно применение XML data type?


вроде, должно сработать... попробуйте

в случае Оракла - начните отсюда http://www.oracle.com/technology/tech/xml/index.html
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34663304
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drevв случае Оракла - начните отсюда http://www.oracle.com/technology/tech/xml/index.htmlЭто очень далеко копать.
здесь ближе.
Searching XML Data Stored in CLOBs Using Oracle Text .
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34724948
Sev_Reo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем участникам за идеи.
Увы, native xml оказался слишком тяжелым в плане производительности и объема...
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34725027
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sev_ReoСпасибо всем участникам за идеи.
Увы, native xml оказался слишком тяжелым в плане производительности и объема...

Может то поможет
Akzhan's Developer Corner - Home (Russian)



статья
нам потребуется оптимизировать обработку иерархии счетов с помощью дополнительной функциональности. Воспользуемся шаблоном "Реализация древовидных структур данных" Анатолия Тенцера.

Нам потребуется в физической модели ввести новую таблицу "Наследование счёта", которая связана идентифицирующими отношениями с сущностями "Счёт" и "Счёт-папка". Для каждого счёта в этой таблице будет перечислены все его владельцы (прямой владелец счёта, владелец владельца и так далее). Немного подумав о получающихся запросах, мы можем придти к выводу, что помимо владельцев данного счёта, мы можем хранить в ней ещё и сам счёт. Тогда, правда, нам придётся несколько изменить определение таблицы, которая теперь будет дважды связана идентифицирующими отношениями с таблицей "Произвольный счёт" (не стоит забывать, что мы не установили ограничение на то, что конечный счёт всегда должен быть подсчётом).
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34726938
mdrg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если по мотивам Celco? т.е. добавить к каждому узлу 2 поля min,max так что все id наследников лежат между min и max. все равно записи только добавляются и все равно пакетами.
т.е. имеем лес деревьев, в который добавляем по 1 дереву.
и тогда проверки (забудем пока NodeProperty) будут выглядеть например след образом

Код: plaintext
1.
2.
3.
4.
5.
select
from Node parent
join Node Child1 (on Child1.id between parent.min and parent.max and child1< ПРОВЕРКИ>)
join Node Child2 (on Child2.id between Child1.min and Child1.max and child2< ПРОВЕРКИ>)
where Parent<Проверки>
...
Рейтинг: 0 / 0
Быстрый сложный поиск по большому дереву
    #34760742
Фотография Alexandr Nikolaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Быстрый сложный поиск по большому дереву
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]