【问题标题】:How to structure data in Riak?如何在 Riak 中构造数据?
【发布时间】:2011-02-19 16:59:06
【问题描述】:

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

  1. 每个客户端一个存储桶,然后是两个键 newsproducts。在每个键下存储多个对象,然后使用 map/reduce 对其进行排序。

  2. 将新闻和产品存储在同一个存储桶中,但为每个新闻项和产品项使用一个新的自动生成的密钥。即 X 一个桶,Y 一个桶。

  3. 每个客户端/功能组合一个桶,即桶是 X-newsX-productsY-news 和 Y 产品。然后对整个bucket使用map/reduce按顺序返回结果。

解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: riak


    【解决方案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
    

    然后在你的 map/reduce 中你可以使用key filtering:

    // 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 的建议)更有效的方法是使用 Secondary IndexesRiak Search 来模拟这种情况。

      查看我对Which clustered NoSQL DB for a Message Storing purpose?Links in Riak: what can they do/not do, compared to graph databases? 的回答,以讨论类似案例。

      您需要做出几个决定,具体取决于您的用例。在所有情况下,您都将从 company 存储桶开始,以便每个公司都有唯一的密钥。

      1) 是将感兴趣的项目存储在 2 个单独的存储桶中(newsproducts)还是存储在一个存储桶中(类似于 items_of_interest)取决于您的偏好和查询的难易程度。如果您总是要在单个查询中同时查询一家公司的新闻和产品,那么您不妨将它们存储在一个存储桶中。但我建议使用 2 个单独的,以便更轻松地跟踪它们,特别是如果您有“公司 X - 产品”和“公司 X - 新闻”的单独选项卡或页面。如果您需要将它们组合到一个提要中,您将进行 2 个查询(一个用于新闻,一个用于产品),并将它们组合到客户端代码中(按日期或其他)。

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

      3)如果存在多对多关系(如果新闻/产品项可以属于多个公司(也许新闻项是关于 2 个独立公司的合资企业)),那么我建议对关系建模 作为一个单独的 Riak 对象。例如,您可以创建一个 mentions 存储桶,对于新闻报道中提到的每个公司,您将插入一个 Mention 对象,该对象具有自己的唯一键、company_key 的二级索引,其值将包含一个类型(“新闻”或“产品”)和一个 item_key(新闻密钥或产品密钥)。 像这样提取关系以分离 Riak 对象可以让您做很多有趣的事情——使用 Riak Search 任意标记它们,查询它们以获取订阅事件通知等。

      【讨论】:

      • 这是一个更好的答案,也是最新的。
      猜你喜欢
      • 2014-11-06
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多