Решение Riak для запроса данных по книгам или уникальным страницам

Рассмотрим набор данных под названием Библиотека, который содержит набор Книг, а каждая книга содержит набор Страниц.

Допустим, вы используете Riak для хранения этих данных, и вам нужно получить доступ к данным двумя возможными способами: - Запрос для определенной страницы (с уникальным идентификатором) - Запрос для всех страниц в определенной книге (с уникальным именем) )

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

Как лучше всего это сделать в Riak?

Очевидно, Riak Search справится с задачей, но, возможно, он неэффективен для того, что я пытаюсь сделать. Мне интересно, имеет ли смысл настраивать корзины, где каждая корзина может быть книгой (что потенциально может привести к миллионам корзин "книги"). Может быть, это плохая идея...

Можно ли это сделать с помощью вторичных индексов?

Я пытаюсь сделать это просто...

Я новичок в Riak, и я пытаюсь найти лучший способ сделать что-то, что, вероятно, относительно просто. Буду признателен за любую помощь сообщества Stack Overflow. Спасибо!


person chaimp    schedule 17.03.2013    source источник
comment
Я думаю, что это может иметь какое-то отношение к этому, но я все равно был бы признателен за ответ: docs.basho.com/riak/latest/references/appendices/concepts/Links   -  person chaimp    schedule 17.03.2013


Ответы (2)


Обычный способ моделирования отношений «основной-подробности» в Riak — сделать так, чтобы основная запись содержала список идентификаторов записей подробностей, возможно, вместе с некоторой информацией о записи подробностей, которая может быть полезна при принятии решения о том, какие записи подробностей нужно извлечь.

В вашем примере у вас может быть два ведра с именами «книги» и «страницы». Основная запись в сегменте «книги» будет содержать метаданные и информацию о книге в целом, а также список страниц, включенных в книгу. Каждая страница будет содержать идентификатор записи «страницы», содержащей данные страницы, а также соответствующий номер страницы. Если вы, например. хотите иметь возможность запрашивать по главам, вы также можете добавить информацию о том, к каким главам принадлежит определенная страница.

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

Чтобы получить конкретную страницу или диапазон страниц, нужно сначала извлечь основную запись из корзины «книги», а затем на основе содержимого записи — соответствующие страницы. Несмотря на то, что для этого требуется несколько операций GET, все они представляют собой прямой поиск на основе ключей, что является наиболее эффективным и масштабируемым способом извлечения данных из Riak, поэтому он будет работать и масштабироваться хорошо.

Этот подход также упрощает изменение порядка страниц и/или глав, поскольку необходимо обновить только основную запись. Однако добавление, удаление или изменение страниц потребует обновления, добавления или удаления основной записи, а также одной или нескольких подробных записей.

Вы, безусловно, также можете решить эту проблему, добавив вторичные индексы к объектам и запросив их на основе этого. Однако запросы вторичного индекса в Riak должны включать обработку покрывающего набора (обычно размер кольца / n_val) разделов, чтобы выполнить запрос, и, следовательно, создают немного большую нагрузку на систему и, как правило, приводят к более высоким задержкам, чем получение один объект, содержащий ключи, посредством прямого поиска ключа (который должен включать только разделы, в которых фактически хранится объект).

Хотя поддержка отдельного объекта, содержащего индексы, добавляет немного дополнительной работы при вставке или удалении страниц/записей, этот подход обычно приводит к более эффективному чтению, поскольку требуется только прямой поиск по ключу. Если ваше приложение интенсивно читает, вероятно, имеет смысл использовать этот подход, в то время как вторичные индексы могут быть более эффективными для приложения с интенсивной записью, поскольку вставки и модификации удешевляются за счет более дорогих операций чтения. Однако вы всегда можете добавить вторичные индексы на всякий случай, чтобы ваши варианты оставались открытыми.

В таких случаях я обычно рекомендую выполнить некоторые тесты, чтобы протестировать решения и проверить, какое решение лучше всего соответствует вашим конкретным требованиям к производительности и масштабированию.

person Christian Dahlqvist    schedule 23.03.2013
comment
Спасибо за подробный ответ. Я думаю, что самым большим предостережением этого подхода является последняя часть, о которой вы упомянули, - добавление/удаление страницы. Видите ли вы какой-либо недостаток в хранении только страниц и использовании вторичного индекса для хранения уникального идентификатора книги на каждой странице? - person chaimp; 25.03.2013
comment
В Riak вторичные индексы определяются как метаданные записи, и для изменения индексов набора объектов необходимо прочитать и изменить их все. Я предполагаю, что должна быть возможность идентифицировать и получить конкретную страницу/набор страниц по номеру(ам) страницы. Если вы решите поместить это в ключевой и/или вторичный индексы, вам может потребоваться обновить несколько страниц при вставке или удалении страниц, поскольку все страницы, следующие за теми, которые вы изменили, возможно, потребуется перенумеровать. По этой причине я думаю, что хранение индекса в одном объекте сделает обновления проще и эффективнее. - person Christian Dahlqvist; 25.03.2013
comment
Спасибо за комментарий (и извините за долгий ответ). Пример с книгой/страницами действительно является обобщением. На самом деле у нас есть элементы, которые в некоторых случаях принадлежат каталогам, или страницы, принадлежащие pdf-файлам, в других случаях. Дело в том, что у нас есть элементы, к которым мы должны иметь доступ как по отдельности, так и в группе (разные уровни детализации). Порядок предметов в наборе не имеет значения. Мне просто нужно иметь доступ ко всем элементам в наборе с именем X или к одному определенному элементу Y. Для этого я думаю, что вторичный индекс идеален. Ты согласен? - person chaimp; 04.04.2013
comment
Я не думаю, что есть какие-либо сомнения в том, что он будет работать со вторичными индексами, но в зависимости от ваших шаблонов доступа он может быть или не быть наиболее эффективным и масштабируемым подходом. Я обновил свой ответ некоторыми вещами для рассмотрения. - person Christian Dahlqvist; 05.04.2013
comment
Спасибо за четкий и содержательный ответ. Я ценю, что вы ответили на мою озабоченность по поводу обновлений/удалений книги и указали на плюсы и минусы двух возможных методов с точки зрения того, читаем мы в первую очередь или обновляем. В целом, ваш ответ дал мне лучшее понимание лучших практик в Riak. - person chaimp; 08.04.2013

Наиболее эффективным способом будет хранить книгу отверстий как один объект и дублировать ее страницы как другие отдельные объекты. Плюсы:

  • вы сможете выбрать любой объект по его ключу (самая дешевая операция в риаке это kv query)
  • любой запрос будет предсказываться по задержке
  • это естественный способ хранения риака

Минусы:

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

Riak — это доступность с предсказуемой задержкой, поэтому, если вы будете использовать что-то вроде 2i для сбора результатов, это сделает непредсказуемый запрос времени, который будет расти с номерами страниц.

person danechkin    schedule 17.03.2013