Я, наверное, стормозил, когда привёл свой ФОК, но не показал примеров запросов.
Вот примерчик - пусть у меня есть карточки товаров следующего вида:
<карточка_детали>
<аэродинамика>
<спойлер>
<для_переднего_бампера/>
</спойлер>
<комплектация_сеткой/>
</аэродинамика>
<геом>
<ширина decimal="10.5"/><высота decimal="5.6"/>
</геом>
</карточка_детали>
И я хочу отобрать из всех деталей спойлеры для переднего бампера, укомплектованные сеткой, с определёнными ограничениями на размеры (< и > записаны как le и ge).
Вот запрос:
for $det in collection("details")
let $w as xs:decimal := xs:decimal($det/геом/ширина/@decimal), $h as xs:decimal := xs:decimal($det/геом/высота/@decimal),
where exists($det/аэродинамика/спойлер/для_переднего_бампера) and exists($det/аэродинамика/спойлер/комплектация_сеткой) and ($w le 11) and ($h le 6)
return $det
Как это выплняется? Например, "Седна" не имеет априорной схемы данных, она поддерживает дескриптивную ("де-факто") схему. Т.е. у неё есть схема данных - это дерево всех-всех узлов, которые вообще есть в данных.
Если хотите, автоматически поддерживаемый "справочник".
Сам узел данных, таким образом, содержит не имена тегов, всего лишь id узлов из дескриптивной схемы - ну и содержание атрибутов тегов (="значение").
У каждого узла дескриптивной схемы есть списки обратных ссылок на соответствующие узлы данных.
Т.е. при выполнении моего запроса будут найдены узлы в схеме ../для_переднего_бампера, ../комплектация_сеткой, затем выполнено объединение их списков ссылок - ну и уже отбор по значению атрибутов. А ведь мы ещё даже не задействовали механизм индексов - только лишь схему данных...
Давайте посмотрим, как всё это будет выглядеть на SQL?