Базы данных «ключ-значение» великолепные — ультрабыстрые, простые, почти линейно масштабируемые по количеству узлов. Но с ними все не так просто. Команда VK Cloud Solutions перевела статью о том, какие у таких баз есть проблемы и как их решить с помощью Wide-column-хранилищ.

Проблемы с базами данных «ключ-значение»


Основная концепция базы данных «ключ-значение» в том, что сами значения ее не беспокоят. Ее работа основана на некоторых допущениях, например, как у Redis, но на структуру данных она вообще не обращает внимания. Из-за этого могут возникнуть три проблемы.

1. База не может фильтровать поля атрибутов. Ведь с ее точки зрения значение — это большой блок двоичных данных.

2. Возвращает целое значение. Если это не кажется проблемой, то вспомните, что главное преимущество баз «ключ-значение» — скорость. Посмотрите на процесс извлечения данных из базы:



Производительность большинства этапов зависит от размера передаваемых данных, а не от них самих. Именно поэтому команда  SELECT * говорит о том, что человек ничего не смыслит в производительности.

3. Значение можно обновить только целиком. Из-за этого нам приходится:

  • выводить клиенту полные данные;
  • работать с данными целиком;
  • отправлять в базу данные целиком.

Это звучит даже хорошо, ведь мы обновляем объект целиком, разве нет? Но подумайте о вариантах, когда нужно:

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

Как решить эти задачи и не потерять в скорости?

Wide-column-базы данных


В основе такой базы лежит простой принцип работы: давайте снова структурировать данные (то есть их значения) в пары «ключ-значение». Вот что у нас есть в базах «ключ-значение»:



А вот как представляют данные Wide-Column-базы:



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

Преимущества Wide-column-баз данных


У Wide-column-баз данных в основном те же плюшки, что и у баз «ключ-значение». Но есть и дополнительные преимущества, пускай они заметны и не в каждой реализации:

  • частичные операции. Можно добавить или обновить значение столбца;
  • сжатие данных. При работе с разреженными данными не нужно хранить пустые значения или null. Можно сэкономить обычно зарезервированное место, так как значения определяет схема;
  • предложение WHERE. Эта функция редко встречается в базах этого типа, но появляется фильтрация данных.

Команда VK Cloud Solutions развивает собственные Big-Data-решения. Будем признательны, если вы их протестируете и дадите обратную связь. Для тестирования пользователям при регистрации начисляем 3000 бонусных рублей.

Что еще почитать:

Комментарии (8)


  1. OlegZH
    13.07.2022 12:26
    +11

    Начало более длинной статьи, оборванное на середине постановки задачи. Было бы неплохо дописать до конца. Тема-то актуальная!


  1. abutorin
    13.07.2022 12:51
    +4

    Что-то мне подсказывает что Wide-Column-базы это частный случай базы "ключ-значение" где просто к ключу можно добавить суффикс с названием колонки.


    1. Myateznik
      14.07.2022 20:34

      По сути так и есть Wide-Column - частный случай Key-Value. Причём многие почему-то рассматривают ключи как какой-то один идентификатор, хотя ключи также как и значения могут иметь структуру. @keich ниже привёл примеры и оставил ссылку на статью в этом же блоге.

      Собственно иногда от Key-Value даже остаётся только Key (какое-нибудь дерево B/R/LSM), в котором есть как техническая информация для сканирования, так и само значение (например, различные индексы, графы в триплетах и т.д.).

      Собственно таже Amazon DynamoDB база Key-Value, при работе с которой внешне может быть даже похоже на Wide-Column/Document Oriented.


  1. keich
    13.07.2022 15:30

    Есть стандартные способы хранения данных в key-value и они все(не уверен) перечислены в  статье https://habr.com/ru/company/vk/blog/480850/

    1)      Если не нужен поиск по содержимому данных и получение частичных данных, то структура ключа как обычно.

    Key1 | {Field1:Val1,Field2:Val2}

    2)      Если нужно получения только части данных. Естественно база должна уметь scan с первого совпадения части ключа.

    Key1.Filed1 | {Val1}

    Key1.Filed2 | {Val2}

    3)      Если нужен поиск по содержимому

    Key1.Field1.Val1|NULL

    Key1.Field2.Val2|NULL


  1. hard_sign
    14.07.2022 09:56

    Справедливости ради, «документо-ориентированные» БД также решают все перечисленные проблемы.


  1. Badiboy
    14.07.2022 10:12

    А вот как представляют данные Wide-Column-базы:

    Redis Hashes решает эту задачу не выходя за принцип базы "ключ-значением".


  1. FoxisII
    14.07.2022 13:58
    +1

    Все зависит от задачи:
    если надо найти одну строку и в ней что то поискать
    - Ключ значение вполне подойдет
    если надо найти по атрибуту все строки
    - Wide-Column

    Те кто пробуют искать что то внутри полей json ....
    ну такое на любителя.....

    потому что у колонок есть фишки которых нет в Key Value
    - Тип данных
    - Статистика по колонке
    - Индексы



  1. andronnik
    15.07.2022 16:34

    Redis hmset hmget про это