Цель данной статьи — познакомить читателей хабра с NoSQL-СУБД MarkLogic (ML). Беглый поиск показывает, что в среде русскоговорящих айтишников она малоизвестна. Данным обзором я попытаюсь исправить эту ситуацию.
1) Основное назначение — хранение больших объёмов информации, не имеющей жёсткой структуры (в отличии от СУБД основанных на таблицах), и эффективный поиск по ней. При этом MarkLogic является «самодостаточным» сервером, а не надстройкой к другому серверу БД (какому-либо SQL например).
2) Модель БД — файлово-фолдерная. Фактически любая БД в ML — это виртуальная файловая система, с каталогами, разграничением доступа, временными метками и т.д. Каждый файл — документ XML, проиндексированный сервером; поиск осуществляется внутри любого XML с учётом его разметки. Могут храниться также plain-text и binary документы, причём в последних можно осуществлять индексацию и поиск метаинформации. Встроена обработка PDF, изображений, архивов, документов MS Office и т.д. Для больших binary можно настроить прозрачное сохранение не в БД, а в файловую систему хоста.
3) Язык запросов:
3.1) Базовый — XPath (с некоторой натяжкой его можно рассматривать как SQL, только по отношению к XML); хотя чаще используют его расширенные возможности, описанные в стандарте XQuery и известные как 'FLWOR'. XQuery-запросы могут быть получены сервером «на лету» от программы, запускающей соединение с БД; а также взяты из самой БД или из файловой системы хоста (об этом ниже).
3.2) Помимо XPath, запрос можно сконструировать с помощью встроенных функций ML, который позволит осуществить быстрый поиск по индексам и выдать результаты в соотв. с релевантностью. Результат любого запроса — множество строк в формате XML, plain-text или binary.
4) Исполнение запросов осуществляется либо через встроенный HTTP-сервер, либо через XDBC/ODBC.
4.1) Использовать HTTP можно как запрашивая документы из БД по пути и имени, так и исполняя сохранённые XQuery-запросы. Результат может выдаваться в любом виде (XML/HTML, json, binary и т.д.). При этом имеется возможность получения заголовков запроса и управления заголовками ответа. В последней версии ML появились возможности для создания RESTful-сервисов.
4.2) Запрос можно выполнить через XDBC, для чего существуют модули-коннекторы для Java, C# и Perl. При разработке сложных XQuery имеется возможность для пошаговой отладки. (Для этого я использую IDE Oxygen, но по некоторым сведениям есть плагин для Eclipse.)
5) Сохранение и изменение документов осуществляется встроенными функциями ML'а. (XQuery это в чистом виде пока что язык именно запросов, в отличии от SQL.) Каждый запрос XQuery является транзакцией, а изменения по умолчанию заносятся в базу после успешного завершения работы скрипта. MarkLogic может валидировать данные средствами XML Schema в случае вызова соответствующей инструкции XQuery.
6) Закачивание данных может осуществляться посредством исполнения соотв. XQuery через XDBC, через RESTful-сервис, либо через встроенный WebDAV.
7) Отдельно отмечу возможность производить XSL-преобразования средствами ML. Скрипт XSL имеет при этом доступ ко всем функциям сервера и данным. Сам XSL может быть как выбран из базы (либо из файловой системы хоста), так и получен из-вне.
8) Конфигурирование осуществляется через встроенный Web-интерфейс, хотя можно напрямую редактировать конфигурационные файлы. Встроенных возможностей для работы из командной строки по-моему нет. Я использовал скрипты на Perl.
9) ML содержит огромный набор функций, как для администрирования его самого, так и для управления данными, хранящимися в его БД, для поиска по индексам и т.д. Также имеются функции для работы с файловой системой сервера-хоста, на котором запущена СУБД; для работы с сетевыми ресурсами; с транзакциями, расписанием (schedule), событиями (triggers) и т.д. В сущности, ML можно рассматривать как некую виртуальную ОС по отношению к запускаемым на нём скриптам (учитывая п.2). Это, на мой взгляд, и есть главное преимущество данной СУБД, т.к. серверную часть проекта любой сложности можно сделать на любой аппаратной платформе (ML выпускается для всех более-менее известных), с использованием одного языка — XQuery и имея представление лишь об одном API.
10) Условия лицензирования: это коммерческий продукт, но есть лицензия для использования в коммерческих целях бесплатной версии СУБД (хотя и с урезанными возможностями, например: объём хранимой информации имеет ограничение 40GB; число используемых процессоров — 2; отсутствует возможность кластеризации). До недавнего времени это была промышленная СУБД, использовавшаяся в основном в крупных компаниях, проектах и государственных учрежедниях (например, в библиотеке Конгресса США). Однако наличие бесплатной лицензии сделало её удобной в стартапах. Такой подход к лицензированию логичен: большинство проектов на ранних этапах существования редко испытывают высокую нагрузку и не требуют специфичного функционала. Но по мере развития бизнеса и принесения им прибыли становится оправданым приобретение «полновесной» версии.
В дальнейшем я предполагаю публиковать свои заметки, связанные с разработкой скриптов для данной СУБД и изучением её возможностей; а также не обойду вниманием другие СУБД такого уровня.
Автор: anton_kr