我希望将图片存储在 NoSQL 数据库 (<5MB) 中,并将它们链接到不同存储桶中的文章。Riak 的链接步行功能提供什么样的速度?它就像一个 RDBMS 连接吗?
2 回答
链接与 JOIN(涉及笛卡尔积)完全不同,但在某些意义上它们可以用于类似的目的。它们与 HTML 文档中的链接非常相似。
使用链接遍历,您可以从单个键开始,或者创建一个从多个键开始的 map-reduce 作业。(链接遍历/遍历实际上是 map-reduce 的一种特殊情况。)这些值被获取,它们的链接根据您的规范(存储桶、标签)过滤,然后匹配的链接被传递到下一个阶段(或返回到客户)。当然,所有这些都是并行完成的(与 JOIN 不同),具有很高的数据局部性。
此外,map-reduce 本身并不慢,只是您没有复杂的查询规划器来为您完成繁重的工作;您必须考虑如何根据需要查询和组织数据。
考虑单向关系并与正常查询一样快。不如 MapReduce 慢。
来自: http ://seancribbs.com/tech/2010/02/06/why-riak-should-power-your-next-rails-app/
Riak 处理这个问题的第一种方法是链接遍历。Riak 中存储的每个数据都可以通过 Link HTTP 标头与其他数据建立单向关系。在规范示例中,您知道存储在“艺术家”存储桶中的乐队的密钥(Riak 存储桶类似于数据库表或 S3 存储桶)。如果该艺术家链接到其专辑,而专辑又链接到专辑中的曲目,您可以在一个请求中找到所有制作的曲目。正如我将在下一节中描述的那样,这比 SQL 中的 JOIN 痛苦得多,因为每个项目都是独立操作的,而不是一次操作一个表。这是该查询的样子:
GET /raw/artists/TheBeatles/albums, , /tracks,_,1 “/raw”是 URL 命名空间的顶部,“artists”是存储桶,“TheBeatles”是源对象键。以下是要遵循的链接的匹配规范,以桶、标记、保持三元组的形式,其中下划线匹配任何内容。第三个参数“keep”表示返回该步骤的结果,这意味着您可以以任意组合从任何您想要的步骤中检索结果。我不了解你,但对我来说感觉比这更自然:
选择曲目。* FROM 曲目 INNER JOIN 专辑 ON tracking.album_id = albums.id INNER JOIN 艺术家 ON albums.artist_id = Artists.id WHERE Artists.name = "The Beatles" 链接的警告是它们本质上是单向的,但是这在您的应用程序中可以轻松克服。如果您的 SQL 数据库中没有参照完整性约束(ActiveRecord 过去曾让这很痛苦),那么您就无法可靠地保证您的 DELETE 或 UPDATE 不会导致一行成为孤立行。我们有点被宠坏了,因为 ActiveRecord 会自动处理关联的链接。
链接遍历功能真正闪耀的地方在于自我参照和深层传递关系(想想 has_many :through writ large)。由于您不必通过 JOIN 创建虚拟表并为同一表的不同版本设置别名,因此您可以轻松执行社交网络图(friends-of-friends-of-friends)和数据结构(如树和列表。