Александр Календарев
XML native-базы данных на примере Sedna
Сегодня бытует мнение, что использование XML для хранения данных ресурсоемко и не выгодно в плане быстродействия. Однако современные технологии ушли вперед. Разработаны более быстрые модели доступа к данным DOM-модели, которые реализованы в современных XML-базах данных. Статья рассчитана на читателя, имеющего представление об DOM XML и Xpath.
Основные черты XML native DB
Понятие native XML Database было введено для отличия, что данный тип баз данных основан на использовании внутреннего представления XML в отличие от XML-надстроек над существующими реляционными базами данных (XML enabled DB), такими как Oracle, PosgreSQL, MS SQL Server, в которых реализована XML-надстройка (XML-SQL) в соответствии со стандартом доступа SQL-2003.
Основным требованием к XML native DB (NXD) является использование внутреннего представления (иногда употребляют – бинарное) DOM XML в БД. Определены следующие признаки XML native DB:
- Определена логическая модель XML-документа, в соответствии с которой осуществляется хранение документа. Минимальная модель включает: элементы, атрибуты, секции PCDATA и список документов.
- XML-документ представлен как фундаментальная часть хранилища (наподобие таблицы в RMDB).
- Для доступа к хранилищу информации XML native DB должен использоваться язык запросов XQuery.
Некоторые из направлений возможного применения NXD:
- использование в веб-службах;
- генерация суммарных отчетов данных из XML;
- поиск релевантных документов в слабоструктурированных данных;
- публикация данных для Web непосредственно в XHTML;
- объединение нескольких XML-документов, формирование сводных документов.
На сегодняшний день имеется более десятка XML native DB. В таблице представлены сравнительные характеристики некоторых из них.
Сравнительные характеристики различных XML native DB
Наименование
|
Лицензия
|
Поддержка
|
Примечание
|
Apache XIndice
|
Open Source, free
|
Eсть
|
XML:DB XUpdate, JDCB, XML_RPC. Работает под Apache Tomcat
|
eXist
|
Open Source, free
|
Eсть
|
Транзакции не поддерживаются (ACID).Реализована на Java
|
MonetDB/XQuery
|
Open Source, free
|
Eсть
|
API: ODBC, PHP, Phyton, XQuery processor поверх SQL
|
MyXMLDB
|
Open Source, free
|
Eсть
|
Работает поверх MySQL
|
OZONE
|
Open Source, free
|
Eсть
|
100% поддержка, включая транзакци (ACID)
|
Sedna
|
Open Source, free
|
Eсть
|
100% поддержка, включая транзакци (ACID) API : C/C++, Perl, Java, PHP, Python mod_sedna (apache) XQuery triggers, updates, recovery and security
|
Software AG's Tamino
|
Commercial
|
Частично
|
Первая промышленная NDB, использующая XQuery. Поддерживает update-блокировки API почти на все языки
|
Как видно, NXD Sedna обладает наиболее полным функционалом, даже более – данная разработка предлагает дополнительные сервисы, в частности, разработано расширение к языку запросов XQuery – модуль обновления XML xUpdate. Также NXD Sedna спроектирована с учетом политики разделяемого доступа: реализованы роли и привилегии.
Проект Sedna – это отечественная разработка группы MODIS (Management Of Data & Information Systems) Института системного программирования при Российской академии наук, который был реализован силами научных сотрудников и аспирантов под руководством Максима Гринева и Сегрея Кузнецова. Первый релиз Sedna 0.1 вышел в декабре 2004 года. И радует то, что проект постоянно развивается. Последний релиз 3.0 вышел 24 марта 2008 года и ориентирован на промышленное использование БД. Как утверждают разработчики, последний релиз вполне выдерживает объем данных долее 20 Гб без существенного снижения скорости доступа к данным. Проект Sedna распространяется под лицензией Apache License (Version 2.0, January 2004, http://www.apache.org/licenses).
Возможности XND Sedna
Разработчики NXD Sedna исходили из того, чтоб создать полнофункциональную NXD с нуля. NXD Sedna имеет весь необходимый функционал БД:
- транзакционные операции с данными;
- резервирование данных;
- авторизация и разделение доступа;
- оптимизация запросов;
- управление внешней памятью;
- индексирование документов;
- полнотекстовый поиск;
- возможность создания триггеров на определенные узлы XML-документа;
NXD Sedna поддерживает наиболее распространенные платформы:
- 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.
Для обеспечения обновления данных разработчики создали языковое расширение Xupdate, предложения по которому были переданы в рабочую группу W3C/XQuery.
В дистрибутиве можно найти библиотеки интерфейсов наиболее популярных языков: Java, C, а также поддерживается интерфейс на языке Schema и интерфейс ODCB. Помимо с сайта разработчиков можно загрузить интерфейсные библиотеки таких популярных языков, как PHP, Python и Perl.
NXD Sedna имеет UDF API, т.е. мы можем реализовывать собственные пользовательские функции, тем самым расширить возможности языка запросов XQuery.
Одна из интересных возможностей NXD Sedna – это SQL-соединения с RMDB, т.е. трансляция XQuery запросов в SQL-инструкции и выполнение их в RMDB, т.е. возможна тесная интеграция NXD и RMDB.
Первое знакомство
Загрузить DB Sedna можно на сайте http://modis.iisp.ru/sedna. На странице «Загрузить» традиционно представлены:
- исходные тексты;
- rpm-пакеты для Linux;
- бинарные файлы для Windows;
- бинарные файлы для Mac OS.
В комплект поставки входит довольно-таки полная документация в pdf-формате на английском языке и небольшой пример базы данных.
В директории SEDNA_ROOT/bin расположены бинарные файлы.
Дополнительно для версии Windows Энтони Скоттом (Anthony Scott) разработан удобным графическим интерфейс SDBAdmin. Также есть админ-интерфейс (SednaAdmin), реализованный на Java Карнелио Филхо (Heraldo J. A. Carneiro Filho).
Запустить сервер Sedna необходимо следующей командой:
>se_gov
При удачном запуске на терминал будет выдано следующее сообщение:
GOVERNOR has been started in the background mode |
Если вы запускаете сервер БД впервые, то необходимо создать базу данных. Также необходимо создавать БД при создании нового хранилища данных. Это осуществляется командой:
>se_cdb <имя БД >
В приложении к серверу BD Sedna предлагается использовать БД для примеров – auction. Для наглядности мы будем ее использовать. При удачном создании нового хранилища XML на терминал будет выдано следующее сообщение:
The database ’auction’ has been created successfully |
После создания БД необходимо запустить менеджер БД для каждого экземпляра данных:
>se_sm auction
Если экземпляр менеджера БД стартовал удачно, то на терминал будет выдано следующее сообщение:
SM has been started in the background mode |
Загрузить данные можно как из терминала, так и из DBAdmin.
На терминале выдать команду:
>se_term <load_filename> <имя БД>
Файл загрузки с именем <load_filename> должен содержать строчку:
LOAD <имя документа> <путь к XML-файлу данных>
При удачной загрузке на терминале появится сообщение:
UPDATE is executed successfully |
Теперь можно выполнить любой пример:
>se_term -file <query_filename> <имя БД >
Остановка сервера осуществляется командой:
>se_stop
Рисунок 1. Запуск БД Sedna
Административный интерфейс
Административный интерфейс SDBAdmin представлен на рис. 2.
Рисунок 2. Административный интерфейс SDBAdmin
Сам интерфейс интуитивно понятный и простой. Справа расположены навигационные окна по объектам БД. В большом верхнем окне набирается запрос или загружается из файла. Кнопка «Evalute» осуществляет его выполнение, а результаты отображаются в среднем окне.
Кто привык использовать «горячие клавиши», то выполнение запроса – это «^E» (одновременное нажатие клавиш <ctrl> и <E>»).
Нижнее окно предназначено для вывода служебной и отладочной информации.
NXB Sedna. Администрирование
NXD Sedna конфигурируется посредством конфигурационнного файла sednaconf.xml, расположенного в SEDNA_INSTALL\etc. Данный файл является необязательным, так как все значения задаются по умолчанию. Файл sednaconf.xml имеет следующую схему DTD:
<!ELEMENT sednaconf (sedna_data, os_primitives_id_min_bound, listener_port, ping_port)>
<!ELEMENT sedna_data (#PCDATA)>
<!ELEMENT os_primitives_id_min_bound (#PCDATA)>
<!ELEMENT listener_port (#PCDATA)>
<!ELEMENT ping_port (#PCDATA)>
Пример:
<sednaconf>
<sedna_data>/var/lib/sedna</sedna_data>
<os_primitives_id_min_bound>1500</os_primitives_id_min_bound>
<listener_port>5050</listener_port>
<ping_port>5151</ping_port>
</sednaconf>
Элемент <sedna_data> содержит путь к директории, где хранятся конфигурационные файлы БД.
Элемент <os_primitives_id_min_bound> содержит минимальное значение идентификаторов ресурсов ОС, используемых в Sedna (включая семафоры).
Элемент <listener_port> – порт, на который настроен «слушатель» БД.
Элемент <listener_ ping_port > – порт, на который настроен «слушатель» ping-сервера, необходим для внутренних процессов.
Каждая БД имеет свой собственный конфигурационный файл: <db_name>_cfg.xml. Для нашей БД файл расположен в каталоге >/var/lib/sedna:
<db> <name>auction</name> <bufs_num>1600</bufs_num> <max_trs_num>10</max_trs_num> <init_phys_log_size>100</init_phys_log_size> <phys_log_ext_portion>10</phys_log_ext_portion></db>
Элемент <bufs_num> определяет количество буферов памяти для менеджера памяти.
Элемент <max_trs_num> определяет максимальное кол-во одновременных транзакций.
Элементы <init_phys_log_size> и <phys_log_ext_portion> определяют физический начальный размер файла лога и размер его приращения.
Также в директории данных содержится файл event.log, в котором отражены все транзакционные изменения в Sedna.
Как и любая СУБД, Sedna имеет механизм разделения доступа к данным. Данный механизм можно посмотреть на примере конфигурационного файла sedna_root\share\sedna_auth_md.xml (но сами данные являются лишь экспортом из внутреннего представления данных, и их изменение не повлечет влияния на функционирование БД):
<db_security_data><users><user> <user_name>SYSTEM</user_name> <user_psw>MANAGER</user_psw> <user_creator>SYSTEM</user_creator> <privileges /> <role role_name="DBA" grantor="SYSTEM" /> <role role_name="PUBLIC" grantor="SYSTEM" /> </user> </users><roles><role> <role_name>DBA</role_name> <privileges /> </role><role> <role_name>PUBLIC</role_name> <privileges /> </role> </roles> </db_security_data>
Каждый пользователь (user) является сквозным для всех баз (документов). Каждая база имеет владельца – это тот пользователь, который ее создал. Существует два типа пользователей:
- Sedna database administrator (DBA user, аналог супер-пользователя root в MySQL);
- обыкновенный пользователь (user).
Каждому пользователю назначается роль. Формально DBA user использует роль DBA:
- привилегия на уничтожение любого объекта в БД;
- привилегия на уничтожение любого user в БД;
- может назначить/отменить любую привилегию любому пользователю для любой БД;
- может назначить роль «DBA» любому пользователю.
Пользователь имеет привилегии:
- может действовать в соответствии со своими привилегиями;
- может назначить/отменить любую привелегию любому пользователю для БД, владельцем которой он является;
- может уничтожить любой объект БД, владельцем которого является он или пользователь, которого он создал.
Для создания пользователя применяется команда:
CREATE USER "user-name" WITH PASSWORD "user-password"
После создания пользователя akalend с паролем 12345 в sedna_auth_md.xml добавится следующий элемент <user>:
<user> <user_name>akalend</user_name> <user_psw>12345</user_psw> <creator>SYSTEM</creator> <privileges /> <role role_name="PUBLIC" grantor="SYSTEM" /> </user>
Уничтожить пользователя можно командой:
DROP USER "user-name"
Изменить пароль командой:
ALTER USER "user-name" WITH PASSWORD "new-password"
БД Sedna после инициации имеет DBA user с именем «SYSTEM» и паролем «MANAGER». Рекомендуется пароль сразу после инсталляции сменить.
Существуют следующие привилегии:
- CREATE-USER – возможность создавать пользователей;
- CREATE-DOCUMENT – возможность создавать документы;
- CREATE-COLLECTION – возможность создавать коллекции;
- CREATE-INDEX – возможность создавать индексы в документах/коллекциях;
- LOAD-MODULE – возможность загружать модули в БД;
- LOAD – возможность загружать данные в БД/коллекции;
- DROP – возможность уничтожать документы/коллекции/индексы/модули;
- QUERY – возможность делать запросы в документах/коллекциях;
- INSERT – возможность вставлять данные в документы/коллекции;
- DELETE – возможность удалять данные в документы/коллекции;
- RENAME – возможность переименовывать документы/коллекции;
- RETRIEVE-METADATA – возможность создавать схемы данных.
Роль – это имя группы множества привилегий. С помощью ролей проще управлять привилегиями.
Роль создается оператором:
CREATE ROLE "role-name"
Назначение привилегий осуществляется командой:
GRANT "privilege" | ALL
ON [DOCUMENT|COLLECTION] "database-object-name"
TO "user-name|role-name" | PUBLIC
Ключ PUBLIC используется, когда данные привилегий должны быть назначены для всех пользователей, даже включая тех, которые будут созданы впоследствии. Если не указаны ключевые слова [DOCUMENT|COLLECTION], то считается, что привилегия назначается на весь документ БД. После выполнения команды:
GRANT ALL ON "auction" TO "akalend"
в конфигурационном файле в элементе <user><user_name>akalend</user_name> … </user> добавится элемент:
<privileges><privilege> <pr_name>ALL</pr_name> <database_obj type_obj="document">auction</database_obj> <grantor>SYSTEM</grantor> </privilege> </privileges>
После этого мы можем присоединиться к «auction» БД и производить над ней любые действия.
Отмена привилегий осуществляется командой:
REVOKE "privilege" | ALL
ON [DOCUMENT|COLLECTION] "database-object-name"
FROM "user-name|role-name" | PUBLIC
В одном из следующих выпусков будут продемонстрированы возможности языка XQuery.
- Особенности СУБД Sedna. XML-СУБД Sedna: технические особенности и варианты использования. //Открытые Системы, #8, 2004 г. – http://www.osp.ru/os/2004/08/185085/_p1.html.
- Материалы рабочей группы XQuery – http://w3c.org/xquery.
- Говард Кац. XQuery от экспертов. Кудиц-образ. М. 2005 г.