Как структурировать данные в Riak? - PullRequest
13 голосов
/ 19 февраля 2011

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

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

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

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

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

Ответы [ 2 ]

15 голосов
/ 24 февраля 2011

Я бы создал 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
}
7 голосов
/ 22 октября 2012

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

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

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

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

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

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

...