Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

Я бы создал 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
}

Ответ 2

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

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

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

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

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

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