Главная > Теория и практика > Key=value (ключ=значение) базы данных

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 запросах, индексах, триггерах, хранимых процедурах, временных таблицах, видах и т.д.
  • БД ключ=значение легко масштабируемы и высокопроизводительны ввиду своей легкости

Итог

При построении масштабируемой системы вопрос стоимости расширения зачастую не ставиться или игнорируется. Экономя время на анализе во время разработки, вы теряете время и деньги, масштабируя решения, которые не предусмотрены для возложеных на них задач. Использовать РСУБД для хранения пар ключ=значение и чтений значений по ключу - это показатель того, что Вы действуете крайне не эффективно. Тем не менее, думайте заранее - если Вам необходимо делать выборки списков или строить графики статистики, Вам придется использовать реляционные СУБД (для чего они собственно и нужны)

Google Bookmarks Digg I.ua Ru-marks Ruspace Zakladok.net Reddit delicious Technorati Yahoo My Web News2.ru БобрДобр.ru Memori.ru rucity.com

Статьи по теме

  1. 28 Апрель 2009 в 13:17 | #1

    Дэн, ты не упомянул самые популярные инструменты для этого - BerkleyDB, и гораздо более быстрый TokioCabinet.

  2. 28 Апрель 2009 в 13:24 | #2

    @Иван Евтухович
    Исправил

  3. ivan
    4 Май 2009 в 16:01 | #3

    Интересно, какие недостатки у таких [ключ=значение] СУБД. Я был бы признателен, если бы автор ответил. Я читал о BigTable, и как понял, там достаточно сложно (если не невозможно на данный момент) решать задачи, где есть связи многие-ко-многим (если такие понятия применимы к базам данных ключ=значение). Т.е. такие СУБД обладают рядом ограничений, не свойственных для РСУБД, хотя для РСУБД это решается элементарно.

  4. 4 Май 2009 в 18:46 | #4

    @ivan
    Иван, спасибо за вопрос!
    Недостатков нет (идеалогических), если Вы видите недостатки - это решение не подходит Вам (точнее для той задачи, которую хотите решить). Базы данных “ключ=значение” не решают проблеммы взаимосвязей - для этого есть РСУБД - и именно их и нужно использовать.
    Недостатки есть на архитектурном уровне. Например, для построения распределенной системы, необходимо реализовать блокировку ключей на уровне приложения - но это детали, кстати об этом также скоро напишем :)

  5. 15 Июнь 2009 в 20:52 | #5

    @Den Golotyuk
    Касательно примера с авторизацией, обычно на таблице с пользователями замешано масса логики и связей, как быть в таком случае? И как быть при выборках на больших таблицах, в РСУБД спасают индексы, а здесь?

  6. tx2
    28 Август 2009 в 23:41 | #6

    спасибо за статью.
    сразу оговорюсь, что с подобными системами не работал…

    однако не вполне очевиден ответ на вопрос (допустим, для приведенного примера): как при такой схеме получить список пользователй?

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

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

    получать курсор и бежать по всей таблице - тоже както некошерно.

    наиболее разумным кажется использовать свойство b-tree индексов - возможность выбирать подмножество ключей с определенным префиксом…
    в той или иной степени доступ к таким функциям я нашел в berkeleydb и tokyo cabinet… однако доступ к этим функциям по сети (напр. tokyo tryant) мне найти не удалось.

    как такие проблеммы решаются в реальных системах?

  7. 10 Сентябрь 2009 в 15:39 | #7

    Предлагаю добавить сюда набирающий обороты Amazon SimpleDB (http://aws.amazon.com/simpledb/) - компонент из Amazon Web Services

  8. 10 Декабрь 2009 в 14:01 | #8

    @Александр Махомет
    @tx2

    Спасибо!

    Выборки списков для таких таблиц не актуальны. Если действительно необходимо задействовать инструменты выборок, объединений и сортировок, то конечно нужно использовать РСУБД.

    Для примера взята распространенная задача авторизации. Логика зачастую намешана не на авторизационных данных, а на дополнительных (права пользователя, тип, возраст, город и т.п.) - эти данные легко выносятся в отдельную таблицу(или таблицы).

    Т.е. главная суть: если Ваша задача требует только сохранения/чтения объекта по ключу - для Вас это решение подходит. А принцип в том, что грамотно дробя логику, можно в большом количестве случаев обойтись только такими элементарными операциями.

  9. IgorN
    10 Декабрь 2009 в 17:17 | #9

    А есть готовые приложения написанные на таких БД, что бы можно было залезть посмотреть код, увидеть как решаются разного рода задачи и т.д., пощупать одним словом. Очень редко на работе могут дать возможность на живом проекте поиграться с незнакомыми Базами :) Желательно приложение на PHP :)

  10. 10 Декабрь 2009 в 18:12 | #10

    @IgorN
    Готовые точно есть, но в opensource не видел, нужно поискать

  11. Jenea
    28 Февраль 2010 в 19:16 | #11

    Kak nasciot MongoDB? V americanskih podcastah ciashe slishal ob atom proiecte. Posmotrel v wikipedii MongoDB toje document oriented database.

  1. Пока что нет уведомлений.