четверг, 24 мая 2012 г.

Пост 2. Oracle NoSQL DB основные понятия.

Доброго времени суток!

Как и обещал продолжаю свой блог, посвященный продукту Oracle NoSQL.
Это NoSQL база данных типа ключ-значение. Ключ - это указатель на некий набор байт (value).
Как можно понимать ключ? Давайте возьмем пример прямо из документации этого продукта:

/Mijatovic/address/
/Mijatovic/Phone/
/Mijatovic/Phone/-/Mobile/MTS/
/Mijatovic/Phone/-/Mobile/BeeLine/
/Mijatovic/Phone/-/Work/


Ключ представлен как путь в файловой системе. Признаюсь честно, когда я только начал погружаться в мир NoSQL у меня было ошибочное представление о том, что ключ это нечто монолитное и негибкое. От этого у меня сложилось неверное представление о том, как можно выбирать значения по ключу (от чего я хочу застраховать читателя)... К примеру, когда у меня стояла задача обеспечить хранение и доступ к данным весьма подходящим для концепции key-value, я никак не мог понять что же мне использовать как ключ: идентификатор пользователя, либо UNIX-time события. Правильный ответ:и то и то (/UserId/13800....).
Так же можно понимать ключ в виде иерархического дерева(отдаленно напоминает глобал), как то так:


Рис 1. Понимание ключа

Важно: в приведенном примере система имеет 5 пар ключ-значение. То есть каждый ключ указанный выше имеет значение, например:

Key: /Mijatovic/address/                             Value: г.Москва
Key: /Mijatovic/Phone/                               Value: с кнопочками, чёренький :)
Key: /Mijatovic/Phone/-/Mobile/MTS/        Value +7985....
Key: /Mijatovic/Phone/-/Mobile/BeeLine/    Value: +7909....
Key: /Mijatovic/Phone/-/Work/                   Value: +7495...


Так же стоит заметить, что у некоторых ключей может не существовать явного "предка" (ключа /Mijatovic/Phone/-/Mobile/ нет). В Oracle NoSQL ключ - всегда string.
А что же такое Value? Тут еще проще - набор байт. Вот уж действительно не отнять не прибавить.
На языке Java это будет как то вот так:

String data = "Тут какой-то текст, может XML-ка, может еще какой-то текст...";
Value myValue = Value.createValue(data.getBytes());


Вашей базе абсолютно все - равно что вы храните в value, никаких типов просто напросто нет. Вы удивитесь и спросите почему, это же шаг назад(а то и несколько шагов)? Ответ прост. Идея NoSQL: чем проще система, тем она быстрее. И действительно мы живем в реальном мире и не можем прыгнуть выше возможностей этого мира (например, позицонирование головки диска ~ 5 мкс, последовательное чтение 100 мб/сек). Каждый функциональные "наворот" все дальше и дальше отдаляет нас от заветных 15 мкс. Хотите накрученную систему блокировок - получите, а вместе с тем и скорость произвольного чтения 100 мкс, вместо 15. Хотите парсер запросов + крутой оптимизатор? Пожалуйста, получите и вместе с тем 200 мкс, вместо 15...



Рис.2. Чем сложнее, тем медленнее

Вот скажите зачем все это системе, которая использует как правило запросы типа дай строчку по первичному ключу(см.ниже)?

select id from tab1 where PrimaryKey= :v1
Вот именно, незачем. Простой системе простая архитектура хранилки. Реляционные базы конечно же более универсальны, но за универсальность приходится платить скоростью. Если Вам нужен одна-две фичи из сотен которые предоставляет реляционка - реализуйте ее на уровне приложения (ну например, определение типа value, что бы для определенных ключей value было бы не просто набором байт, а переменной типа number).

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

NoSQL не замена реляционным базам (которые жили, живут и будут жить). Это очень узкоспециализированный инструмент, который подходит под некий(достаточно узкий) класс задач.


Рис.3. Oracle NoSQL DB - очень узкоспециализированный инструмент.

Комментариев нет:

Отправить комментарий