XML Native Database Sedna 3.0 Климов Евгений (Slach) Александр Календарев (Alexandre)

Содержание

Слайд 2

Сразу после phpConf2007, работаю в Start-Up'e ;) Есть приложение, в котором

Сразу после phpConf2007, работаю в Start-Up'e ;)
Есть приложение, в котором необходимо

получать из внешних БД (1С 7.7, 8.0 и 1C8.1, Axapta или любого другого источника) данные об ассортименте, складском остатке, ценовой и скидочной политике
Источников много и предполагается что одновременно большое кол-во данных будет заливаться в систему по расписанию или хаотично
100 источников = (~20-25 Gb данных + 6 Gb индексов) = 1 Shard,
хотим около 100 Шардов =)
Много трудностей при масштабировании:
PRIMARY KEY - GUID CHAR(36) vs ID auto_increment (сдох InnoDB)
тормозит ПОИСК+UPDATE (MyISAM table lock)
MySQL Cluser не годится потому что IN MEMORY, а у нас не так много серверов и денег ;)
Sphinx Fulltext search требует ID auto_increment Нельзя кешировать результаты поиска и т.п.
Видимо мы плохо знаем MySQL, ЧТО ДЕЛАТЬ?? ;-)

Вступительное слово

Слайд 3

Существующие XML- native DB: Apache XIndice (XML:DB XUpdate, JDCB, XML_RPC Работает

Существующие XML- native DB:

Apache XIndice (XML:DB XUpdate, JDCB, XML_RPC Работает под

с Apache Tomcat )
eXist (Реализована на Java )
MonetDB (API: ODBC, PHP, Phyton, XQuery processor поверх SQL )
MySQLDB (Работает поверх MySQL )
Sedna (ACID) API : C/C++, Perl, Java, PHP, Python mod_sedna (apache) XQuery triggers, updates, Tamino коммерч Россия, API все яз.
XStreamDB коммерч, Java
Слайд 4

Основные черты XML- native DB: Определена логическая модель XML документа XML

Основные черты XML- native DB:

Определена логическая модель XML документа
XML документ

– представлен, как фундаментальная часть хранилищ
для доступа к хранилищу информации должен использоваться язык запросов XQuery
Слайд 5

возможное применение XML- native DB : использование в Web-службах генерация суммарных

возможное применение XML- native DB :

использование в Web-службах
генерация суммарных отчетов данных

из XML
поиск релевантных документов в слабоструктурированных данных
публикация данных для WEB непосредственно в XHTML
формирование сводных XML документов
Слайд 6

Полноценная СУБД (а не надстройка над SQL), специально спроектированная для XML

Полноценная СУБД (а не надстройка над SQL), специально спроектированная для XML

представления данных и работы с ними на языке запросов XQuery
Аналоги: Oracle Berkeley XMLDB http://www.oracle.com/technology/tech/xml/xmldbАналоги: Oracle Berkeley XMLDB http://www.oracle.com/technology/tech/xml/xmldb, IMB DB2 PureXML http://www-306.ibm.com/software/data/db2/xml/, MSSQL XML тип данных
Субъективные преимущества Sedna перед аналогами
GNU GPL лицензия, win32 порт
php5 extension (в том числе для win32), Python, C++/Java Client API
СДЕЛАНО в России!! в ИСП РАН, релиз 0.1 в 2004 году, текущая версия 3.0.xx
Кардинальное отличие от SQL
Документы / Коллекции документов вместо таблиц – как следствие нет жесткой структуры данных и ее можно изменять на лету,
XML Узлы - вместо строк и столбцов таблицы
XQuery, XPath и XUpdate вместо SQL – перебор узлов вместо поиска пересечения множеств строк в SQL (очень грубое сравнение)
Мечта восторженного неофита – весь сайт в «одном XML файле» ;)
http://wikidb.dyndns.org/

Sedna XMLDB что это?

Слайд 7

транзакционные операции с данными (ACID модель); резервирование данных; авторизация и разделение

транзакционные операции с данными (ACID модель);
резервирование данных;
авторизация и

разделение доступа;
оптимизация запросов;
управление внешней памятью;
индексирование документов;
полнотекстовый поиск (сделан на основе dtSearch, планируется свой);
возможности создания триггеров на определенные узлы XML-документа;
возможности создания модулей с набором пользовательских ф-ций;

SednaXMLDB основные возможности

Слайд 8

SednaXMLDB - Поддерживаемые платформы: Linux x86 kernel version 2.4 or higher;

SednaXMLDB - Поддерживаемые платформы:

Linux x86 kernel version 2.4 or higher;
Windows 2000/XP/2003/Vista;
Mac

OS X 10.4 and higher (PPC/Intel);
PowerPC at IBM RS6000 running Debian Sarge.
Слайд 9

SednaXML – общая архитектура (1/3) Governer - регулятор, центральный компонент все

SednaXML – общая архитектура (1/3)

Governer - регулятор, центральный компонент все остальные

компоненты регистрируются у него, следит за выполнением транзакций
Listener - слушает сокеты, авторизует пользователя и создает Connection
Connection – получение XQuery запросов из сокета и отдача XML ответов, инициализация транзакций
Transaction – атомарная операция, locking данных на уровне Collection, Document или Nodeset’a, может быть несколько транзакций в рамках одного Connection, есть Rollback, нет вложенных транзакций? ;) состоит из нескольких компонентов, см. далее
Слайд 10

Компоненты, инкапсулированные в Transaction Parser – парсинг текстовых XQuery запросов в

Компоненты, инкапсулированные в Transaction
Parser – парсинг текстовых XQuery запросов в

логическое представление, которое является деревом операций
Optimizer – составляет план запроса на основе логического представления, создавая дерево низкоуровневых операций для манипуляции над физическими структурами данных
Executor – осуществляет выполнение низкоуровневых операций скармливая их Database Manager’у
Компоненты, инкапсулированные в Database Manager
Один Database manager на КАЖДУЮ базу данных, состоит из четырах компонентов
Buffer Manager - управление пулом буфферов как в RAM так и на диске, чем больше буфферов в RAM тем быстрее, Sedna прожорлива до памяти
Index Manager – управление обновлением и поиском по value и fulltext индексам
Transaction (Trigger) Manager – обеспечивает корректность обработки параллельных транзакций

SednaXML – общая архитектура (2/3)

Слайд 11

Рисунок (1) Структура Node Descriptor внутреннее представление узла Рисунок (2) Хранение

Рисунок (1) Структура Node Descriptor внутреннее
представление узла
Рисунок (2)
Хранение дексрипторов

узла в блоках «памяти»

SednaXML – общая архитектура (3/3)

Рисунок (3)
Общая схема работы buffer manager

Слайд 12

Где скачать - http://modis.ispras.ru/sedna/sedna_download_register.htmlГде скачать - http://modis.ispras.ru/sedna/sedna_download_register.html и http://modis.ispras.ru/FTPContent/ (тут много

Где скачать - http://modis.ispras.ru/sedna/sedna_download_register.htmlГде скачать - http://modis.ispras.ru/sedna/sedna_download_register.html и http://modis.ispras.ru/FTPContent/ (тут много

вкусного ;)
Как ставить – под win32 просто распаковать, под Linux \ MacOSX make clean, make install ;) внешних библиотек использует мало, отдельных пакетов под Debian и портов под FreeBSD пока нет
Структура папок и файлов
cd /[senda-install-dir]; ls –la
/bin/ - исполняемые файлы
/etc/ - файлы конфигурации всего Sedna сервера
/cfg/ - конфигурация БД в виде [имя_базы]_cfg.xml
/share/ - конфигурация пользователей, ролей и прав, метаданные по всему серверу
/data/[имя_базы]_files/ - файлы данных отдельной БД, содержит следующие файлы
[имя_базы].sedata – данные, текстовые значения из коллекций для узлов и атрибутов
[имя_базы].setmp – временные данные, используемые во время обработки XQuery запроса
[имя_базы].*.seph – файлы используемые для хранения узлов для документов и коллекций
[имя_базы].*llog – лог транзакций

SednaXML – установка и администрирование (1/2)

Слайд 13

Утилиты: se_gov \ se_stop – запуск\остановка самого сервера (Governer) se_rc –

Утилиты:
se_gov \ se_stop – запуск\остановка самого сервера (Governer)
se_rc – просмотр списка

запущенных компонентов
se_cdb \ se_ddb [имя бд] – создание\удаление БД (конфигурация БД записывается в /sedna/cfg/имя_бд.xml), есть очень много параметров тонкой настройки как размера БД, так и менеджера буфферов
se_sm \ se_smsd – запуск\остановка менеджера БД (по умолчанию СРАЗУ выделяется 100Mb RAM, но надо больше, зато потом потребление не сильно растет ;)
se_term – терминал для исполнения XQuery команд и *.xq файлов
se_exp – экспорт\импорт\бекап данных в Sedna в чистом XML (!!!) формате
Создание пользователей и раздача прав:
se_term –name SYSTEM –pswd MANAGER [имя_базы]
CREATE USER "test" WITH PASSWORD "test“ & GRANT ALL ON DATABASE TO "test” &
GRANT ALL ON COLLECTION “westtorg” TO "test” &
&\n – разделитель команд в se_term Остальное смотрим в [sedna-install-dir]/doc/AdminGuide.pdf ;-)

SednaXML – установка и администрирование (2/2)

Слайд 14

Где скачать - http://modis.ispras.ru/FTPContent/api/ Как поставить Win32: добавить в php.ini extension=php_sedna.5.2.2.dll

Где скачать - http://modis.ispras.ru/FTPContent/api/
Как поставить
Win32: добавить в php.ini extension=php_sedna.5.2.2.dll (работает

под 5.2.3),
Linux \ OSX \ FreeBSD: ./configure --with-sedna=shared,${PATH-TO-SEDNA}; make
отдельных пакетов под Debian и портов под FreeBSD пока нет
Простейший пример остальное см. документацию идущую с модулем
or die('Sedna error:'.sedna_error().' '.sedna_ercls()); //указываем sedna что узлы в результате не должны идти в том же порядке, 
// как они идут в исходном документе, часто это ускоряет выборки $query = 'declare ordering unordered;'."\n\n"; //выполнение простейшего XQuery запроса к Sedna $query .= 'collection("westtorg")/WT_DOCUMENT/WT_BODY/WT_GOODS/ROW'; $q = sedna_execute($query) or die(‘Error:'.sedna_error().' '.sedna_ercls()); //фетчинг Nodeset, данные сериализуются на сервере в строку и бьются в массив по корневым узлам while($q && $node=sedna_result_array()) var_dump($node); sedna_close($sedna) or die('Sedna error:'.sedna_error().' '.sedna_ercls()); ?>

Использование Sedna PHP Extension

Слайд 15

XQuery - язык, который полезен для работы со структурированной и мало

XQuery - язык, который

полезен для работы со структурированной и мало

структурированной информацией
независим от платформы
строго типизированный
совместим со стандартами:
W3C NameSpace, XML Schema,
XML 1.1 , Xpath 1.0
Слайд 16

W3C Спецификации XQuery XML Path Language (XPath) 2.0 XQuery and XPath

W3C Спецификации XQuery

XML Path Language (XPath) 2.0
XQuery and XPath Data

Model
XQuery and XPath Functions and Operators
XQuery Formal Semantics
XML Query Requirements
XML Query Use Cases
XSLT and XQuery Serialization
XML Syntax for XQuery (XQueryX)
XQuery and XPath Full-Text Requirements
XQuery and XPath Full-Text Use Cases
Слайд 17

SednaXML возможности XQuery Выборка элементов или атрибутов из документов, коллекций и

SednaXML возможности XQuery

Выборка элементов или атрибутов из документов, коллекций и последовательностей

узлов;
Объединение данных из документов, коллекций и последовательностей узлов;
Добавление новых элементов или атрибутов в результирующий набор узлов;
Группировка и сортировка результирующего набора узлов в выборке;
Слайд 18

Язык XQuery рекомендован W3C Консорциумом, как язык запросов для доступа к

Язык XQuery рекомендован W3C Консорциумом, как язык запросов для доступа к

XML данным в XML ориентированных базах данных и является такой же неотъемлемой частью, как SQL в реляционных СУБД.
Отличие XQuery от XSLT в том что XQuery не является XML языком и служит именно для выборки и отображения, а не для трансформации, это язык формирующий XML, во много построенных на принципах XPath
XQuery много использует XPath выражения и функции, дополняя их своими конструкциями языка
XQuery может работать со строгой типизацией
XQuery умеет работать с датами
XQuery поддерживает работу с агрегирующими функциями
Для формирования выходного XML в XQuery активно используются конструкторы элементов
{ expression }
фигурные скобки отделяют XQuery выражение от конструктора элементов и аналогичны вставке Xpath выражений в XSLT

SednaXML – основы XQuery (1/3)

Слайд 19

Основные конструкции – FLWOR (for, let, where, order, return) (: комментарий,

Основные конструкции – FLWOR (for, let, where, order, return)
(: комментарий, записывается

так :)
for $n1 in Expression1,$n2 in Expression2
let $v2 := Expression3, $v3 in Expression4
where WhereExpression1, WhereExpression2
order by SortExpression
return Expression
(: частный случай FLWR :)
let $varname := Expression
Для последовательности выбранных узлов существуют операции комбинирования - intersect, except, union (можно заменить на XPath | )

{ collection(“westtorg")//WT_GOODS/ROW[CODE=1000]
intersect
collection(“westtorg")//WT_GOODS/ROW[contains(NAME,”пиво”)] }

Важно помнить о том, что intersect и except бессмысленно использовать для комбинирования узлов разных документов, поскольку узлы в разных документах никогда не могут быть идентичными.

SednaXML – основы XQuery (2/3)

Слайд 20

Условное выражение IF Требуется наличие всех трех условий (if, then и

Условное выражение IF
Требуется наличие всех трех условий (if, then и else),

а выражение в условии if должно быть заключено в скобки.

{
for $p in $westtorg/WT_PRICE/ROW
if ($p/@discounted)
then $p/BASE_PRICE
else $p/RETAIL_PRICE
}

Кванторные выражения
some $n in (5,7,9,11) satisfies $n > 10
every $n in (5,7,9,11) satisfies $n > 10

SednaXML – основы XQuery (3/3)

Слайд 21

Вставка узлов в заданное место UPDATE insert Expr1 (into|preceding|following) Expr2 Пример

Вставка узлов в заданное место
UPDATE insert Expr1 (into|preceding|following) Expr2
Пример
Добавляем ROW

в WT_GOODS перед строкой ROW для которой тег CODE=180
UPDATE insert
preceeding collection(“westtorg")//WT_GOODS/ROW[CODE=180]
Удаление узлов в заданном месте
UPDATE delete|delete_undeep Expr
delete_undeep удаляет только узел, а его потомков добавляет к родительскому узлу
Пример
Удаляем строку из WT_GOOS для которой тег CODE=180
UPDATE delete collection(“westtorg")//WT_GOODS/ROW[CODE=180]

SednaXML – основы XUpdate (1/2)

Слайд 22

Замена узлов UPDATE replace $var [as type] in Expr1 with Expr2($var)

Замена узлов
UPDATE replace $var [as type] in Expr1 with Expr2($var)
Удвоение

остатка для списка товаров
UPDATE replace
$g in collection(“westtorg")/WT_GOODS_AMOUNT/ROW[CODE=(100,180,220)]
with

{
(
$g/@*,
$g/node()[not(self::AMOUNT)],
for $a in $g/AMOUNT
return {$a*2}
)
}

Переименование узла
UPDATE rename Expr on NewNodeName
UPDATE raname collection(“westtorg”)//WT_GOODS/ROW on NEW_ROW

SednaXML – основы XUpdate (2/2)

Слайд 23

Создание VALUED индекса CREATE INDEX “goods_by_code” ON collection(“westtorg”)/WT_DOCUMENT/WT_BODY/WT_GOODS/ROW BY CODE AS

Создание VALUED индекса
CREATE INDEX “goods_by_code”
ON collection(“westtorg”)/WT_DOCUMENT/WT_BODY/WT_GOODS/ROW
BY CODE AS xs:integer
Удаление
DROP INDEX

“goods_by_code”
Выборка с использованием индекса
for $i in index-scan(“goods_by_code”,54888,EQ|LT|GT|GE|LE)
return parent::ROW
Выборка с использованием индекса по диапозону
for $i in index-scan-between(“goods_by_code”,54888,113856,EQ|LT|GT|GE|LE)
return parent::ROW

SednaXML – работа с индексами (1/2)

Слайд 24

Создание FULL-TEXT Indexes используется с dtSearch CREATE FULL-TEXT INDEX “goods_name_fulltext” ON

Создание FULL-TEXT Indexes используется с dtSearch
CREATE FULL-TEXT INDEX “goods_name_fulltext”
ON collection(“westtorg”)/WT_DOCUMENT/WT_BODY/WT_GOODS/ROW/NAME
AS

“string-value”
Полнотекстовое сканирование fulltext индекса
ftindex-scan(
collection(“westtorg") /WT_DOCUMENT/WT_BODY/WT_GOODS/ROW/NAME, «пиво and not балтика»)/parent::ROW
Полнотекстовое сканирование raw XML, без использования индекса, но с использованием dtSearch
ftscan(
collection(“westtorg") /WT_DOCUMENT/WT_BODY/WT_GOODS/ROW/NAME, “пиво and not балтика”,
“xml")/parent::ROW

SednaXML – работа с индексами (2/2)

Слайд 25

Модули представляют собой текстовые файлы с набором ф-ций под определенным namespace

Модули представляют собой текстовые файлы с набором ф-ций под определенным namespace

например - wt.xqlib
module namespace wt = "http://www.host.ru";
declare ordering unordered;
declare function wt:search_group_by_seller($query as xs:string) {
{ XQuery код ф-ции пропущен }
};
Загрузка и использование модуля очень просты
LOAD OR REPLACE MODULE "wt.xqlib"
import module namespace wt = "http://www.host.ru";
wt:search_group_by_seller("test")
Удаление модуля
DROP MODULE “http://www.host.ru”

SednaXML – модули и функции

Слайд 26

Общий вид выражения для создания триггера CREATE TRIGGERtrigger-name (BEFORE|AFTER)(INSERT|DELETE|REPLACE) ON XpathExpression

Общий вид выражения для создания триггера
CREATE TRIGGERtrigger-name
(BEFORE|AFTER)(INSERT|DELETE|REPLACE)
ON XpathExpression
(FOR EACH

NODE|FOR EACH STATEMENT)
DO
{
Update-statement($NEW,$OLD,$WHERE);
...
Update-statement($NEW,$OLD,$WHERE);
XQuery-statement($NEW,$OLD,$WHERE);
}
$NEW,$OLD,$WHERE используются только для триггеров узла (each node)

SednaXML – триггеры (1/2)

Слайд 27

Таблица условий при которых стартует триггер SednaXML – триггеры (2/2)

Таблица условий при которых стартует триггер

SednaXML – триггеры (2/2)

Слайд 28

Как сейчас: SQL схема для поиска и импорта данных 18 таблиц,

Как сейчас: SQL схема для поиска и импорта данных
18 таблиц, по

8-9 столбцов в каждой
Основных таблиц 5
Кол-во строк приведено для 1 из 100 компаний соответственно в реальности будут таблички по миллиону строк
Большая длинна записей, много CHAR полей
Связи через комбинацию полей GUID CHAR(36) + company_id (int)

SednaXML – практическое использование (1/7)

Слайд 29

Как сейчас: Типичный SQL запрос для поиска SELECT SQL_CALC_FOUND_ROWS o.company_id,o.guid, o.name,

Как сейчас: Типичный SQL запрос для поиска
SELECT SQL_CALC_FOUND_ROWS
o.company_id,o.guid, o.name, MIN(p.price)

AS min_price, COUNT(DISTINCT go.guid) AS goods_count
FROM wt_goods AS g
INNER JOIN wt_goods_into_organization AS go
ON (g.guid=go.goods_guid AND g.company_id = go.company_id AND (go.availability=1))
INNER JOIN wt_price AS p
ON ( go.goods_guid=p.goods_guid AND go.company_id = p.company_id AND go.goods_characteristic_guid=p.goods_characteristic_guid )
INNER JOIN wt_price_type AS pt
ON (pt.guid=p.price_type_guid AND p.company_id = pt.company_id AND pt.is_default=1)
INNER JOIN wt_organization AS o
ON ( o.guid=go.organization_guid AND o.company_id = g.company_id )
WHERE ((((g.name LIKE '%пиво%' OR g.fullname LIKE '%пиво%') AND (g.name LIKE '%туборг%' OR g.fullname LIKE '%туборг%'))) AND g.company_id IN (2) AND g.is_group=0)
GROUP BY o.guid, o.company_id
ORDER BY min_price ASC LIMIT 0, 20;
EXPLAIN Выдает все select_type=SIMPLE, и type=ref, er_req, но при этом using temporary и using filesort
тут 5 JOIN и этот запрос отрабатывается около 1-1.5 sec всего на 40 тысячах в wt_goods, а что будет когда их станет 400 тысяч записей? Что делать с Update?

SednaXML – практическое использование (2/7)

Слайд 30

Как могло бы быть: Переделка запроса под XQuery { let $goods

Как могло бы быть: Переделка запроса под XQuery
{
let $goods

:= (ftindex-scan("goods_fullname_fulltext", "пиво туборг")/parent::ROW
union ftindex-scan("goods_name_fulltext", "пиво туборг")/parent::ROW),     $organization_guid := distinct-values(
$goods/WT_GOODS_INTO_ORGANIZATION/ROW/ORGANIZATION_GUID )     for $og in $organization_guid     let $org_name := distinct-values($goods/WT_GOODS_INTO_ORGANIZATION/ROW[ORGANIZATION_GUID eq $og]/ORGANIZATION_NAME),         $go := for $i in $goods/WT_GOODS_INTO_ORGANIZATION/ROW where ($i/ORGANIZATION_GUID eq $og) and ($i/GOODS_GUID = $goods/GUID) return $i,         $p := for $i in $go return $i/../../WT_PRICE/ROW     return                { $og }         { $org_name }         { count($go) }         { min($p/PRICE) }         
} выполняется 0.2-0.6 sec!! , но надо переделать XML структуру документа

SednaXML – практическое использование (3/7)

Слайд 31

Как сейчас: схема импорта данных SednaXML – практическое использование (4/7) Как

Как сейчас: схема импорта данных

SednaXML – практическое использование (4/7)

Как есть: схема

импорта данных в MySQL с использованием LOAD DATA IN FILE – table lock для всех Engine, на Slave SELECT выстраиваются в очередь
Слайд 32

Как можно сделать: схема импорта данных в Sedna с использованием BULK

Как можно сделать: схема импорта данных в Sedna с использованием BULK

LOAD
При BULK LOAD не блокируются транзакции на чтение, если сделают LOAD OR REPLACE то будет еще надежнее

SednaXML – практическое использование (5/7)

Слайд 33

Хочется: схема кластерного поиска в MySQL с использованием MySQL Proxy SednaXML – практическое использование (6/7)

Хочется: схема кластерного поиска в MySQL с использованием MySQL Proxy

SednaXML –

практическое использование (6/7)
Слайд 34

Хочется: схема кластерного поиска в Sedna с использованием Hadoop SednaXML – практическое использование (7/7)

Хочется: схема кластерного поиска в Sedna с использованием Hadoop

SednaXML – практическое

использование (7/7)
Слайд 35

Шаблоны проектирования XML -данных Базовые соглашения Отношение иерархии Отношение один ко многим Отношение многие ко многим

Шаблоны проектирования XML -данных

Базовые соглашения
Отношение иерархии
Отношение один ко

многим
Отношение многие ко многим
Слайд 36

Шаблоны проектирования XML –данных Базовые соглашения Каждая таблица – это отдельный

Шаблоны проектирования XML –данных Базовые соглашения

Каждая таблица – это отдельный документ
Имя таблицы

– имя root элемента в мн. числе
Строка – имя тбл. в ед числе
Имя столбца – имя аттрибута, если короткие данные
Исключение: колонки типа VARCHAR/TEXT
Которые имеют длинное текстовое значение
Лучше представлять в качестве вложенного тега. Имя колонки – имя тега, значение колонки – текстовое содержание тега.
Слайд 37

Шаблоны проектирования XML –данных Базовые соглашения - пример Пример:

Шаблоны проектирования XML –данных Базовые соглашения - пример

Пример:

Слайд 38

Шаблоны проектирования XML -данных Отношение иерархии

Шаблоны проектирования XML -данных

Отношение иерархии

Слайд 39

Шаблоны проектирования XML -данных Отношение один ко многим

Шаблоны проектирования XML -данных

Отношение один ко многим

Слайд 40

Шаблоны проектирования XML -данных Отношение многие ко многим

Шаблоны проектирования XML -данных

Отношение многие ко многим

Слайд 41

Нет нормальных инструментов написания, отладки и профилирования XQuery запросов, необходимо существенно

Нет нормальных инструментов написания, отладки и профилирования XQuery запросов, необходимо

существенно перестраивать сознание разработчика для того чтобы он мыслил не множествами а узалми
Пока можно писать и отлаживать на Stylus Studio + Saxon XQuery, Oxygen XML Editor собирается со следующей версии поддерживать Sedna
Полнотекстовый поиск в текущей реализации сделан на dtSearch – платная (~1000$ на один Linux сервер), летом 2008 планируется выпуск собственной реализации full-text индексов
Отсутствие возможности валидации XML данных через XMLSchema и DTD, отсутствие поддержки CDATA (планируется реализовать)
Высокий коэффициент роста дискового пространства относительно сырых XML данных (600Mb sedna vs 100Mb pureXML)
IMHO пока что очень слабые предпосылки для scale-out масштабирования и кластеризации

SednaXML – текущие недостатки

Слайд 42

~ 1,5 млн – предложений 600 магазинов 700 категорий товаров Коротко о проекте

~ 1,5 млн – предложений
600 магазинов
700 категорий товаров

Коротко

о проекте
Слайд 43

Проект – изнутри (1/3)

Проект – изнутри (1/3)

Слайд 44

Проект – изнутри (2/3)

Проект – изнутри (2/3)

Слайд 45

Проект – изнутри (3/3)

Проект – изнутри (3/3)

Слайд 46

как могло бы быть:

как могло бы быть:

Слайд 47

где использовать SednaXML в проекте Прием и хранение XML Документов Обобщение

где использовать SednaXML в проекте

Прием и хранение XML Документов
Обобщение и

обработка XML Документов
Публикация
Поиск Информации
Слайд 48

Поиск информации Выбор шаблона поиска Выбор информации по шаблону

Поиск информации
Выбор шаблона поиска
Выбор информации по шаблону

Слайд 49

Шаблоны поиска Категория Брэнд Модель Свойства

Шаблоны поиска

Категория
Брэнд
Модель
Свойства

Слайд 50

Шаблоны поиска

Шаблоны поиска

<Категория> <Брэнд> <Модель>
<Категория>
<Категория> <Брэнд>
<Категория> <Модель>
<Брэнд>

<Модель>
<Модель>
<части модели>
<Модель> <свойство>
<Категория> <свойство>
Слайд 51

Структура данных

Структура данных

Слайд 52

Запросы XPath для шаблона : Brand[@name=“Canon”]/model[@name=“Povershort S80” and @category=“ ”]/offer XQuery:

Запросы

XPath для шаблона <Категория> <Брэнд> <Модель>:
Brand[@name=“Canon”]/model[@name=“Povershort S80” and @category=“”]/offer
XQuery:
let $model :=

doc(“good”)/Brand[@name=“Canon”]/model;
for $m in $model
where @name=“Povershort S80” and @category=“
{
return

{$m/offer/@price}

}
Слайд 53

Запросы (продолжение) XQuery: let $сat_id := doc(“catalog”)/ Category[ @name=“фотоаппарат”]/@id; let $model

Запросы (продолжение)

XQuery:
let $сat_id := doc(“catalog”)/ Category[ @name=“фотоаппарат”]/@id;
let $model := doc(“good”)/ Brand[@name=“Canon”]/model;
for

$m in $model
where @name=“Povershort S80” and @category=$cat_d
{
return

{$m/offer/@price}

}
Слайд 54

Проблемы Составные имена модели Морфология Ошибки ввода

Проблемы

Составные имена модели
Морфология
Ошибки ввода