如何在Riak中构建数据?

Fab*_*ius 13 riak

我正在试图弄清楚如何在Riak中建模数据.假设您正在构建具有两个功能,新闻和产品的CMS.您需要能够为多个客户端X和Y存储此信息.您通常如何构建此信息?

  1. 每个客户一个桶,然后两个键新闻产品.在每个键下存储多个对象,然后使用map/reduce对它们进行排序.

  2. 将新闻和产品存储在同一个存储桶中,但每个新闻项和产品项都有一个新的自动生成密钥.也就是说,X为一个桶,Y为一个.

  3. 每个客户端/功能组合一个存储桶,即存储桶将是X-news,X-products,Y-newsY-products.然后在整个存储桶上使用map/reduce按顺序返回结果.

哪个是处理这个问题的最佳方法?

Kev*_*sJr 15

我创建了2个桶:新闻和产品.然后我会在每个存储桶中使用客户端名称为密钥添加前缀.我可能还会在新闻密钥中包含日期以便于日期范围.

news/acme_2011-02-23_01
news/acme_2011-02-23_02
news/bigcorp_2011-02-21_01
Run Code Online (Sandbox Code Playgroud)

并且可选地将产品名称加上类别名称

products/acme_blacksmithing_anvil
products/bigcorp_databases_oracle
Run Code Online (Sandbox Code Playgroud)

然后在你的map/reduce中你可以使用密钥过滤:

// 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
}
Run Code Online (Sandbox Code Playgroud)


Dmi*_*lin 7

比使用密钥过滤(根据Kev Burns的建议)更有效的方法是使用二级索引Riak搜索来模拟这种情况.

看看我对哪个集群NoSQL DB的消息存储目的的答案Riak中的链接:与图形数据库相比,它们可以做什么/不做什么?讨论类似案件.

根据您的使用情况,您可以做出几个决定.在所有情况下,您都应该从公司桶开始,以便每个公司都有一个唯一的密钥.

1)是否保存感兴趣的项目在2个单独的桶(新闻产品)或一个(像items_of_interest)取决于你的喜好和便于查询的.如果您总是要在一个查询中查询公司的新闻和产品,那么您也可以将它们存储在一个存储桶中.但是,我建议使用2分独立的人,让他们更容易跟踪,特别是如果你有类似的独立选项卡或页面为"X公司-产品"和"X公司-新闻".如果你需要将它们组合成一个单一的饲料,你会做2个查询(一个新闻,一个用于产品),并在客户端代码将它们组合(按日期或其他).

2)如果新闻/产品项目可以只有一个公司,则为每个项目在company_key上创建一个二级索引.这样,您可以通过该公司的二级索引(2i)查询轻松获取公司的所有新闻或产品.

3)如果有一个多一对多的关系(如果新闻/产品项目可以属于多个企业(也许是新闻内容是关于一个合资企业2家独立的公司)),那么我建议建模的关系作为一个单独的了Riak对象.例如,你可以创建一个提到桶,此后,在新闻报道中提到的每个公司,你想插入一提对象,具有自己独特的密钥,用于company_key二级指标,其值将包含一个类型("新闻"或"产品")和item_key(新闻密钥或产品密钥).提取的关系分开了Riak对象这样可以让你做了很多有趣的事情-标记它们随意使用了Riak搜索,查询他们订阅的事件通知等.