用于按书籍或唯一页面查询数据的Riak解决方案

用于按书籍或唯一页面查询数据的Riak解决方案,riak,riak-search,Riak,Riak Search,考虑一组名为Library的数据,其中包含一组书籍,每本书包含一组页面 假设您正在使用Riak存储此数据,您需要以两种可能的方式访问数据: -查询特定页面(具有唯一id) -查询特定书籍中的所有页面(具有唯一名称) 此外,您需要能够轻松地更新和删除特定书籍的页面 在里亚克实现这一目标的最佳方式是什么 显然,Riak搜索可以做到这一点,但对于我正在尝试做的事情来说,它可能效率低下。我想知道在每个桶都可以是一本书的地方设置桶是否有意义(这可能会产生数百万个“书”桶)。也许这是个坏主意 这可以通过二级

考虑一组名为Library的数据,其中包含一组书籍,每本书包含一组页面

假设您正在使用Riak存储此数据,您需要以两种可能的方式访问数据: -查询特定页面(具有唯一id) -查询特定书籍中的所有页面(具有唯一名称)

此外,您需要能够轻松地更新和删除特定书籍的页面

在里亚克实现这一目标的最佳方式是什么

显然,Riak搜索可以做到这一点,但对于我正在尝试做的事情来说,它可能效率低下。我想知道在每个桶都可以是一本书的地方设置桶是否有意义(这可能会产生数百万个“书”桶)。也许这是个坏主意

这可以通过二级索引实现吗

我试图保持这个简单


我是Riak的新手,我正在努力找到最好的方法来完成一些可能相对简单的事情。我将感谢Stack Overflow社区的任何帮助。谢谢

最有效的方法是将hole book存储为一个对象,并将其页面复制为另一个单独的对象。 优点:

  • 您将能够通过其键选择任何对象(最便宜的操作 里亚克语为(查询)
  • 任何查询都将通过延迟进行预测
  • 这是riak的自然储存方式
缺点:

  • 若你们需要更新任何一页,你们必须更新整本书,然后再更新一页。由于riak没有原子操作系统,所以您必须考虑如何恢复任何故障情况(如:本书已更新,但页面未更新)

Riak是关于可用性和可预测延迟的,因此如果您使用2i之类的工具来收集结果,它将进行不可预测的时间查询,时间查询将随着页码的增加而增加,可能与有关详细信息记录的一些信息一起,这些信息在决定检索哪些详细信息记录时可能很有用

在您的示例中,您可以有两个称为“books”和“pages”的存储桶。“books”bucket中的主记录将包含关于整本书的元数据和信息,以及书中包含的页面列表。每个页面将包含保存页面数据的“页面”记录的ID以及相应的页码。例如,如果您希望能够按章节进行查询,还可以添加有关某个页面所属章节的信息

“pages”bucket将包含页面的文本,并可能包含指向该页面上包含的图像和其他媒体数据的链接。这些数据可以存储在另一个存储桶中

为了获得特定的页面或页面范围,首先从“books”桶中检索主记录,然后根据记录的内容选择适当的页面。尽管这需要几个GET操作,但它们都是基于键的直接查找,这是从Riak检索数据的最有效和可扩展的方法,因此它将执行良好并可扩展

这种方法还使得更改页面和/或章节的顺序变得简单,因为只需要更新主记录。但是,添加、删除或修改页面需要更新、添加或删除主记录以及一个或多个详细记录

您也可以通过向对象添加二级索引并基于此进行查询来解决此问题。不过,Riak中的二级索引查询必须包括对分区覆盖集(通常为环大小/n_val)的处理,以满足请求,因此会给系统带来更多的负载,通常比通过直接键查找检索包含键的单个对象的延迟更高(这只需要涉及实际存储对象的分区)

尽管在插入或删除页面/条目时维护包含索引的单独对象会增加一些额外工作,但这种方法通常会导致更高效的读取,因为只需要直接的键查找。如果应用程序的读取量很大,则使用这种方法可能是有意义的,而辅助索引可能是对于写操作繁重的应用程序来说效率更高,因为插入和修改成本更低,而读取成本更高。不过,为了保持选项的开放性,您可以随时添加辅助索引以防万一


在这种情况下,我通常会建议执行一些基准测试来测试解决方案,并检查哪个解决方案最符合您的特定性能和扩展要求。

我认为这可能与此有关,但我仍然希望得到一个答案:感谢您的深入回答。我认为此方法是您提到的最后一部分-关于添加/删除页面。您是否看到仅存储页面和使用二级索引存储每页图书的唯一id的缺点?在定义为记录元数据的Riak二级索引中,为了修改一组对象的索引,需要读取和修改所有em.我的假设是,必须能够通过页码识别和检索特定页面/页面集。如果您选择将其放在键和/或辅助索引中,则在插入或删除页面时可能需要更新多个页面,因为更改页面之后的所有页面都可能需要重新编号。因此,我认为将索引保留在单个对象中会使更新更容易,也更高效。谢谢您的提醒nt(很抱歉回答了这么长时间)。图书/页面示例实际上是一个概括。在某些情况下,我们实际上有属于目录的项目或属于pdf的页面