Key=value (ключ=значение) базы данных
Что такое key=value БД? Это система управления данными, которая позволяет сохранять пары ключ=значение в постоянное хранилище, и в последствии читать эти значения по ключам. Вот так все просто! Все гениальное просто, но в чем необходимость такого крайне ограниченного на первый взгляд решения?..
Зачем нужно такое решение, если есть MySQL, PostgreSQL, Oracle…?
Решая такую простую задачу, как сохранение/чтение значений по ключу, система работает крайне эффективно, т.к. в ней отсутсвуют тяжелые слои SQL обработчиков, систем индексации, профилирования, вакуумизации (для PostgreSQL) и т.д. Подобное решение дает наиболее эффективную производительность, минимальную стоимость внедрения и масштабирования.
В каком случае необходимо использовать такое решение?
Как бы это удивительно не звучало, но во многих, если не во всех. Проблемма выбора для простых задач тяжелых СУБД обычно связана с тем, что разработчики хорошо понимают только одну технологию управления данными. Во время проектирования обычно даже не ставится вопрос о стоимости применяемого решения и о его масштабировании. Если в мелких проектах это не проблематично, то в крупных - это вопрос номер ноль. Давайте рассмотрим подробнее простую и распространенную задачку - авторизацию.
Пример на основе авторизации пользователя
Давайте начнем с самого ядра. Допустим у нас есть логин и пароль пользователя. Сейчас все представили себе стандартное решение - таблица в MySQL на три колонки (может быть больше трех, но это основа):
ID | login | password |
Регистрация происходит следующим образом - мы проверяем, нет ли такого же логина в таблице и вставляем новый рядок. Автризация еще проще - делаем выборку по связке логин - пароль (или хеш пароля) и все. А теперь вопрос - зачем мы использовали MySQL для решения такой задачи, если мы не использовали 99% возможностей этой РСУБД. Другими словами мы сейчас “съездили за хлебом на танке”.
Давайте ту же задачу рассмотрим в приближении БД ключ=значение:
Регистрация. У нас есть логин (уникальная колонка) и пароль. Все замечательно подходит для выбора пароля как значения, а логина - как ключа. Авторизация будет происходить следующим образом - делаем выборку по логину (это ключ) - получаем пароль, сравниваем с тем, что написал пользователь - готово.
Это решение требует некоторого расширения для использования в стандартных нуждах. Как Вы успели заметить, у нас нет поля “user_id”, без которого будет крайне трудно построить систему любой сложности. Как это решается? Средствами все той же БД, давайте посмотрим:
- Ключом будет user_id, который будет увеличиваться при каждой регистрации на 1 (текущее значение autoincrement будем также хранить в паре ключ=значение)
- Данными будет логин и пароль.
- Т.к. во время авторизации нам нужно делать выборку по логину, то нужно хранить еще одну пару: логин=user_id
Существующие технологии
Ближе к конкретике, расммотрим несколько решений баз данных ключ=значение:
- MemcacheDB - решение на основе протокола memcached. Это не решение для кеширования, просто название такое! Из сильных сторон: высокая производительность записи/чтения, обеспечение высокой надежности и доступности данных, репликация, транзакционность. Хорошим плюсом в сторону этого решения будет то, что этот продукт вышел в официальный релиз
- Redis - база данных ключ=значение с дополнительными возможностями работы со списками и стеками. Из плюсов - высокая производительность, поддержка репликации, работа со списками и стеками, множество клиентских API для различных платформ (PHP, Ruby, Python, Perl, Java и другие)
- CouchDB - решение, написанное на языке Erlang. Плюсы - отличная работа пол нагрузками (в основе - паралельный язык), поддержка инкрементальной репликации, доступ по протоколу HTTP
- Tokyo Cabinet - высокопроизводительное решение с расширенными возможностями. Из отличительных сторон - крайне высокая производительность (бенчмарк), поддержка сжатия данных, Hash и B+tree алгоритмы доступа к данным, поддерживает манипуляции со списками записей.
- BerkeleyDB - устоявшийся продукт. Сильные стороны: текущая версия перевалила за 4 (что является показателем стабильности) поддержка репликации, внутренне кеширование, транзакционность, и много другое. Это решение зачастую используется, как прослойка для хранения данных, на основе которой строится интерфейсная и операционная часть.
Преимущества баз данных ключ=значение
И так, если у Вас стоит задача хранить определенные значение по ключу, почему стОит использовать БД ключ=значение?
- РСУБД (RDBMS) слишком медленные, имеют тяжелую прослойку SQL движков, тяжело масштабируются
- РСУБД не достаточно хороши в плане показателя concurrency (обработка одновременных запросов)
- Слишком большая стоимость решения РСУБД для хранения мелких порций данных
- Нет необходимости в SQL запросах, индексах, триггерах, хранимых процедурах, временных таблицах, видах и т.д.
- БД ключ=значение легко масштабируемы и высокопроизводительны ввиду своей легкости
Итог
При построении масштабируемой системы вопрос стоимости расширения зачастую не ставиться или игнорируется. Экономя время на анализе во время разработки, вы теряете время и деньги, масштабируя решения, которые не предусмотрены для возложеных на них задач. Использовать РСУБД для хранения пар ключ=значение и чтений значений по ключу - это показатель того, что Вы действуете крайне не эффективно. Тем не менее, думайте заранее - если Вам необходимо делать выборки списков или строить графики статистики, Вам придется использовать реляционные СУБД (для чего они собственно и нужны)


Дэн, ты не упомянул самые популярные инструменты для этого - BerkleyDB, и гораздо более быстрый TokioCabinet.
@Иван Евтухович
Исправил
Интересно, какие недостатки у таких [ключ=значение] СУБД. Я был бы признателен, если бы автор ответил. Я читал о BigTable, и как понял, там достаточно сложно (если не невозможно на данный момент) решать задачи, где есть связи многие-ко-многим (если такие понятия применимы к базам данных ключ=значение). Т.е. такие СУБД обладают рядом ограничений, не свойственных для РСУБД, хотя для РСУБД это решается элементарно.
@ivan
Иван, спасибо за вопрос!
Недостатков нет (идеалогических), если Вы видите недостатки - это решение не подходит Вам (точнее для той задачи, которую хотите решить). Базы данных “ключ=значение” не решают проблеммы взаимосвязей - для этого есть РСУБД - и именно их и нужно использовать.
Недостатки есть на архитектурном уровне. Например, для построения распределенной системы, необходимо реализовать блокировку ключей на уровне приложения - но это детали, кстати об этом также скоро напишем
@Den Golotyuk
Касательно примера с авторизацией, обычно на таблице с пользователями замешано масса логики и связей, как быть в таком случае? И как быть при выборках на больших таблицах, в РСУБД спасают индексы, а здесь?
спасибо за статью.
сразу оговорюсь, что с подобными системами не работал…
однако не вполне очевиден ответ на вопрос (допустим, для приведенного примера): как при такой схеме получить список пользователй?
самый простой вариант - хранить массив логинов или идешников пользователй в сериализованном виде в одном единственном или группе(с разделением например по количеству) значений… но при достаточно количестве пользователей, это кажется нерациональным.
другой очевидный вариант - создать связанный список из пользователей, но это тоже выглядит медленно.
получать курсор и бежать по всей таблице - тоже както некошерно.
наиболее разумным кажется использовать свойство b-tree индексов - возможность выбирать подмножество ключей с определенным префиксом…
в той или иной степени доступ к таким функциям я нашел в berkeleydb и tokyo cabinet… однако доступ к этим функциям по сети (напр. tokyo tryant) мне найти не удалось.
как такие проблеммы решаются в реальных системах?
Предлагаю добавить сюда набирающий обороты Amazon SimpleDB (http://aws.amazon.com/simpledb/) - компонент из Amazon Web Services
@Александр Махомет
@tx2
Спасибо!
Выборки списков для таких таблиц не актуальны. Если действительно необходимо задействовать инструменты выборок, объединений и сортировок, то конечно нужно использовать РСУБД.
Для примера взята распространенная задача авторизации. Логика зачастую намешана не на авторизационных данных, а на дополнительных (права пользователя, тип, возраст, город и т.п.) - эти данные легко выносятся в отдельную таблицу(или таблицы).
Т.е. главная суть: если Ваша задача требует только сохранения/чтения объекта по ключу - для Вас это решение подходит. А принцип в том, что грамотно дробя логику, можно в большом количестве случаев обойтись только такими элементарными операциями.
А есть готовые приложения написанные на таких БД, что бы можно было залезть посмотреть код, увидеть как решаются разного рода задачи и т.д., пощупать одним словом. Очень редко на работе могут дать возможность на живом проекте поиграться с незнакомыми Базами
Желательно приложение на PHP
@IgorN
Готовые точно есть, но в opensource не видел, нужно поискать
Kak nasciot MongoDB? V americanskih podcastah ciashe slishal ob atom proiecte. Posmotrel v wikipedii MongoDB toje document oriented database.