Далеко-далеко, десь на краю Галактики, я виявив вельми вражаюче 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'a, мапінгу даних, по роботі з математичними операціями, форматуванню даних, виклику системних функцій, профілювання, управління репозиторією XQM-модулів,
JDBC-конектор до баз даних, модуль по роботі з потоковими даними, модуль для юніт-тестування, валідації документів по DTD і XSD, трансформації XSL. Повний список тут
Дуже непогано для такої козявки, як BaseX!
Область застосування
Вивчивши за рік всі плюси і мінуси, можна виділити кілька основних областей застосування даного продукту
- Аналітичні системи. Оскільки BaseX працює з XML, у якого немає жорсткої структури, та ще й використовує XQuery як мову запитів, це робить її ідеальним інструментом для аналітики і датамайнінгу
- Standalone продукти. Тому що з коробки ми отримуємо дуже сильно багато всього. Можна підняти навіть веб-сервер.
- Навчальні системи. Для цього є всі передумови і повний набір функціональних можливостей
- Системи зберігання неструктурованих даних. XML стерпить все:)
Ув'язнення
Хотілося б подякувати команді BaseX за вражаючий продукт, який відкрив для мене масу нових можливостей і технологій!
Я б порекомендував уважно придивитися до цього продукту, нехай навіть і не використовуючи його в реальних проектах, тільки в якості базису для вивчення XQuery.
Офіційний сайт проекту: basex.org
Документація: docs.basex.org
Завантажити: звідси