Как структурировать данные в Riak?

Я пытаюсь понять, как моделировать данные в Riak. Допустим, вы создаете что-то вроде CMS с двумя функциями, новостями и продуктами. Вы должны иметь возможность хранить эту информацию для нескольких клиентов X и Y. Как бы вы это структурировали?

  1. Одно ведро на клиента, а затем две ключевые новости и продукты. Сохраните несколько объектов под каждым ключом, а затем используйте карту / уменьшить, чтобы упорядочить их.

  2. Храните новости и продукты в одной корзине, но с новым автоматически сгенерированным ключом для каждой новости и продукта. То есть одно ведро для X и одно для Y.

  3. Один сегмент на комбинацию клиент / функция, то есть наборы: X-новости, X-продукты, Y-новости и Y-продукты. Затем используйте карту / уменьшить на все ведро, чтобы вернуть результаты по порядку.

Как лучше всего справиться с этой проблемой?

2 ответа

Решение

Я бы создал 2 ведра: новости и продукты. Затем в каждом сегменте я ставлю ключи с именами клиентов. Возможно, я бы также включил даты в новостные ключи для облегчения ранжирования дат.

news/acme_2011-02-23_01
news/acme_2011-02-23_02
news/bigcorp_2011-02-21_01

И, возможно, префикс названия продуктов с названиями категорий

products/acme_blacksmithing_anvil
products/bigcorp_databases_oracle

Тогда в вашей карте / уменьшить вы можете использовать фильтрацию ключей:

// BigCorp News items
{
  "inputs":{
     "bucket":"news",
     "key_filters":[["starts_with", "bigcorp"]]
  }
  // ... rest of mapreduce job
}

// Acme Blacksmithing items
{
  "inputs":{
     "bucket":"products",
     "key_filters":[["starts_with", "acme_blacksmithing"]]
  }
  // ... rest of mapreduce job
}

// News for all clients from Feb 12th to 19th
{
  "inputs":{
     "bucket":"news",
     "key_filters":[["tokenize", "_", 2],
                    ["between", "2011-02-12", "2011-02-19"]]
  }
  // ... rest of mapreduce job
}

Еще более эффективный подход к этому, чем использование фильтрации ключей (согласно рекомендации Кев Бернс), заключается в использовании вторичных индексов или поиска Riak для моделирования этого сценария.

Взгляните на мои ответы на какую кластеризованную NoSQL DB для хранения сообщений? и ссылки в Riak: что они могут делать / не делать по сравнению с графовыми базами данных? для обсуждения подобных случаев.

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

1) Хранить интересующие вас предметы в 2 отдельных корзинах (новости и продукты) или в одной (что-то вроде items_of_interest) зависит от ваших предпочтений и простоты запроса. Если вы всегда будете запрашивать новости и продукты для компании в одном запросе, вы можете также хранить их в одном контейнере. Но я рекомендую использовать 2 отдельных, чтобы их было легче отслеживать, особенно если у вас есть что-то вроде отдельных вкладок или страниц для "Company X - Products" и "Company X - News". И если вам нужно объединить их в один канал, вы сделаете 2 запроса (один для новостей и один для продуктов) и объедините их в коде клиента (по дате или как угодно).

2) Если у новости / продукта может быть одна и только одна компания, к которой он принадлежит, создайте вторичный индекс для company_key для каждого элемента. Таким образом, вы можете легко получить все новости или продукты для компании с помощью запроса вторичного индекса (2i) для этой компании.

3) Если существует отношение "многие ко многим" (если новость / товарная позиция может принадлежать нескольким компаниям (возможно, новость о совместном предприятии для 2 отдельных компаний)), то я рекомендую смоделировать отношения как отдельный Riak объект. Например, вы можете создать корзину упоминаний, и для каждой компании, упомянутой в новостях, вы вставите объект Mention с его собственным уникальным ключом, вторичным индексом для company_key, а значение будет содержать тип ('news'). или 'product') и item_key (ключ новостей или ключ продукта). Подобное извлечение связей для разделения объектов Riak позволяет вам делать много интересных вещей - помечать их произвольно, используя Riak Search, запрашивать их для уведомлений о событиях подписки и т. Д.

Другие вопросы по тегам