BaseX. Неизвестная NoSQL Вселенная

в 21:26, , рубрики: data mining, database, java, nosql, XML, xpath, xquery, метки: , , , , ,

BaseX. Неизвестная NoSQL Вселенная
Далеко-далеко, где-то на краю Галактики, я обнаружил весьма впечатляющее NoSQL решение…

Любовь, апатия, ненависть, восхищение, гордость, гнев, радость — именно такие эмоции были у меня целый год. Чем больше я изучал этот продукт, тем сильнее были чувства.

Маркетинговая затравка от авторов звучит примерно так:

BaseX является очень легковесной, высокопроизводительной и масштабируемой XML базой данных с XPath/XQuery 3.0 процессором, который имеет полную поддержку W3C Update и Full Text спецификаций. Интерактивный и дружественный графический интерфейс позволяет легко изучать ваши XML документы

Звучит весьма вкусно, но реальность, как всегда, больно-больно ударяет по самым незащищенным местам

Что внутри

BaseX — программный продукт с открытыми исходными кодами, написанный на Java, распространяемый под BSD лицензией. Из коробки мы получаем утилиту с графическим интерфейсом (управление, анализ, редактирование кода с подсветкой синтаксиса), сервер, клиент, веб-сервер. В реальности мы получаем еще больше, но обо всем по порядку.

Хранилище

Команда BaseX разработала свое собственное хранилище, которому посвящена даже научная работа. Хоть внутри данные все равно хранятся в «разобранном» виде, это не мешает ей быть чистой документо-ориентированной базой данных без фиксированной структуры. Да и само понятие базы данных тут несколько специфическое.

В BaseX базой данных называется папка, в которой хранятся некие ресурсы. Ресурсом может выступать как обыкновенный файл, так и XML-документ. Файлы хранятся в исходном виде в файловой системе, а XML-документы трансформируются во внутреннее представление. База может хранить как XML документы, так и прочие ресурсы одновременно. Такой способ хранения данных позволяет легко переносить базы простым копированием.

Привычные для реляционной модели таблицы отсутствуюь как класс. Зато есть XML-документы и их коллекции. Ну а что еще может быть в XML базе данных? :)

Индексы

BaseX умеет индексировать структуру XML, атрибуты, текст, и даже делать полнотекстовый индекс (для ограниченного количества языков). Бочка дегтя заключается в том, что один из типов индексов статичен, т.е. обновление данных приводит к инвалидации индекса, а второй, динамический, — медленный. Деградация по скорости на операциях вставки данных достигает порядка.

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

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

Транзакции

Понятия транзакции, к которому все привыкли в мире реляционных СУБД, в BaseX нет. Нельзя явно начать транзакцию, выполнить несколько действий, а потом завершить. Транзакцией считается команда сервера или выполняемый скрипт. BaseX не мультиверсионник и транзакции записи блокируют базу. С версии 7.6 управление блокировками было перенесено на уровень сервера, а не файловой системы, что существенно ускорило выполнение запросов.

Из всего вышесказанного можно сделать весьма простой вывод — BaseX не любит запись. Интенсивная нагрузка на запись приводит к росту латентности запросов. Зато в чтении он проявляет себя весьма и весьма.

Резервные копии

Резервирование делается из коробки, но это больше решение в лоб, чем элегантный механизм. Как мы уже знаем, база представляет собой обыкновенную директорию. BaseX банально архивирует ее и складывает как обычный zip-файл. Тупо как угол дома. На мелких файлах все работает неплохо, но если в базе несколько гигабайт данных, то все становится ожидаемо печально. Для оффлай-решений время генерации резервной копии не является проблемой, но для постоянно работающей системы это может стать причиной кратковременного отказа от обслуживания.

Можно запускать процедуру резервирования как для конкретной базы. так и для всех сразу. Восстановление делается так же просто, как и создание резервной копии. Так как zip-файлов может быть много, можно восстанавливаться на какую-то конкретную резервную копию. Остановки сервера для этого не требуется.

Репликация и Redo-логи

С этим у BaseX печаль-беда. Я не раз подымал этот вопрос с руководителем проекта, Кристианом Грюном, и он обещал рассмотреть возможность внедрения этой функциональности в ближайшее время, но, пока что вопрос открыт.

Триггеры

Еще одна печаль-беда…

Возможности администрирования

Они весьма просты. Можно заводить пользователей, давать им право на 4 типа действия: читать, писать, создавать базы и администрировать. Не сильно много, а другое и представить тяжело. Опять же, так как база данных представляет собой набор файлов, то дополнительную «защиту» можно организовать на уровне файловой системы.

Журнал действий

Это тоже есть, но, честно говоря, мне не сильно нравится его формат и структура. Основная претензия к формату хранения данных. Какую-то информацию из него можно вытащить, но восстановить картину происходящего будет несколько затруднительно.

Клиент-серверная архитектура

BaseX легко подымается как сервер. Специальные драйвера для работы не требуются, так как работа с сервером идет через порты. Чтобы поднять несколько серверов одновременно, нужно просто разнести их на разные порты. Они без труда могут выполнять запросы друг друга, для этого надо написать несколько строчек кода (или скопипастить из документации :)

Протокол обмена данными с сервером прекрасно задокументирован, написать клиент для разных языков не составляет никаких проблем. На данный момент времени есть готовые клиенты для следующих языков или систем: C#, VB, Scala, Java, ActionScript, Perl, PHP, Python, Rebol, Ruby, Haskell, Lisp, node.js, Qt, и, конечно же, C.

XQuery

Это, по моему скромному мнению, самый огромный плюс данного продукта. Лично для меня XQuery гораздо привлекательнее чем SQL, и причин для этого несколько.

Простота

Я не буду приводить прямые сравнения XQuery и SQL, но для меня первый гораздо логичнее, последовательнее, читабельнее. Я смог писать на XQuery нормальные, более-менее сложные запросы уже на второй день. Правда, через два месяца мы их переписали, но факт остается фактом.

Функции

XQuery поддерживает функции и их можно или создавать прямо в коде запроса, или подключать в виде модулей. В целом, XQuery — можно назвать функциональным языком. Функции позволяют делать код настолько лаконичным, насколько это возможно.

Модульность

BaseX поддерживает модульность, на двух уровнях: Java- модули и xqm (написанные на XQuery). Если проводить аналоги, то это чистейшей воды хранимые процедуры

XPath

Еще одна технология, которая помогает писать чистый и лаконичный код. XPath используется и в формировании первичных выборок, и как аналог JOIN'ов из мира SQL.

Предустановленные модули

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

Если сократить список и не особо распыляться, то список возможностей выглядит так: модуль просмотра системных данных (списки пользователей, сессий, логов), архивирования данных (zip), клиент для соединения с другими BaseX серверами и удаленного выполнения запросов, модуль конвертации форматов данных, криптографии, по работе с csv-файлами, модуль по управлению базами данных, их созданию, оптимизации, переносу, восстановлению, модуль по запросам информации по uri, работе с файлами, модуль для полнотекстового анализа, по работе с хэш-функциями, конвертации HTML документов в XML, по работе с HTTP-запросами, запросу информации про индексы и инспектированию баз данных, модуль парсинга и сериализации JSON'а, маппинга данных, по работе с математическими операциями, форматированию данных, вызову системных функций, профилированию, управлению репозиторием XQM-модулей,
JDBC-коннектор к базам данных, модуль по работе с потоковыми данными, модуль для юнит-тестирования, валидации документов по DTD и XSD, трансформации XSL. Полный список тут

Весьма неплохо для такой козявки, как BaseX!

Область применения

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

  • Аналитические системы. Так как BaseX работает с XML, у которого нет жесткой структуры, да еще и использует XQuery в качестве языка запросов, это делает его идеальным инструментом для аналитики и датамайнинга
  • Standalone продукты. Потому что из коробки мы получаем очень сильно много всего. Можно поднять даже веб-сервер.
  • Обучающие системы. Для этого есть все предпосылки и полный набор функциональных возможностей
  • Системы по хранению неструктурированных данных.XML стерпит все :)

Заключение

Хотелось бы поблагодарить команду BaseX за впечатляющий продукт, который открыл для меня массу новых возможностей и технологий!

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

Официальный сайт проекта: basex.org
Документация: docs.basex.org
Скачать: отсюда

Автор: s0rr0w

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js