NOSQL中的加入操作

54

我已经阅读了一些关于Bigtable和NOSQL的文章。有趣的是,它们避免使用JOIN操作。

作为一个基本的例子,让我们考虑Employee和Department表,并假设数据分散在多个表/服务器上。

我只想知道,如果数据分布在多个服务器上,我们如何执行JOIN或UNION操作?


11
您希望在名为NoSQL的产品中进行SQL JOIN或UNION操作? - gbn
简单来说,你可以使用playOrm并加入分区(分区通常少于100万行,但表可以无限大),它的性能表现良好。 - Dean Hiller
4个回答

53

当你有极大量的数据时,你可能想避免连接操作。这是因为每个键值查找的开销相对较大(服务需要找出要查询哪些节点,并同时查询它们并等待响应)。在此,我指的是延迟而不是吞吐量限制。

这使得连接操作非常低效,因为您需要执行许多外键查找,这些查找最终会到达许多不同的节点(在许多情况下)。因此,您应该避免使用此模式。

如果这种情况不经常发生,您可能可以承受这种开销,但如果您打算经常执行此操作,那么"去规范化"(denormalising) 数据可能就很值得了。

NoSQL存储中存储的类型通常相当 "非正常"。通常会在许多不同的地方复制相同的数据以便更容易地进行查找。

此外,大多数NoSQL也不支持辅助索引,这意味着如果您想按任何其他标准查询,您必须复制一些东西。

如果您正在存储诸如员工和部门之类的数据,使用传统数据库的效果更好。


5
当我试图理解这个问题时,这个链接对我很有帮助:http://www.allbuttonspressed.com/blog/django/2010/09/JOINs-via-denormalization-for-NoSQL-coders-Part-1-Intro。 - Jim Hunziker

7
您需要在应用程序中执行多个选择操作,并手动连接数据。有关更多信息,请参见此SO帖子。从该帖子中得知:
Bigtable数据集可以使用一种名为GQL(“gee-kwal”)的语言从AppEngine等服务中查询,该语言基于SQL的子集。在GQL中明显缺少任何类型的JOIN命令。由于Bigtable数据库的分布式性质,在两个表之间执行连接将非常低效。相反,程序员必须在其应用程序中实现这样的逻辑,或设计其应用程序以不需要它。

4

原生地,不幸的是,在NoSQL数据库中执行Join是不可能的。这实际上是SQL和NoSQL DB之间最大的区别之一。

正如@kaleb所说,您需要进行多次选择,然后手动连接所需信息。

幸运的是,有ORM框架,例如Prisma,可以让您“伪造”本机SQL join功能。

注意:在幕后仍在执行多个db调用,增加了读取操作和所有相关内容。

“ Prisma Client的一个关键特性是查询两个或多个模型之间的关系。” -> https://www.prisma.io/

示例:

 const getUser = await prisma.user.findUnique({
  where: {
    id: 19,
  },
  select: {
    name: true,
    posts: {
      select: {
        title: true,
      },
    },
  },
})

在这种情况下,文章被存储在另一张表中,但是Prisma能够获取并将它们连接到用户对象中。

2
一些 NoSQL 数据库可以进行联接操作,因此这个笼统的说法是错误的。 - OneCricketeer
请扩展您的答案。 NoSQL难道不是只能通过聚合查询执行JOIN查询,这会将查询本身的时间复杂度带到O(log(N))+Nlog(M)吗?其中M和N是涉及的文档? - Vitto
1
并非所有的数据库都使用文档。例如,Neo4j通过关系进行图遍历,从而通过边缘将节点“连接”成路径。Couchbase使用索引进行连接。Apache Hive/Impala/Trino通过类似于MapReduce的操作在大型半结构化文件集上执行连接。 - OneCricketeer
关于您在这里的回答,Prisma仅列出了对SQL数据库的支持,并未解决有关BigTable的问题。 - OneCricketeer

3

Kaleb是正确的。如果您的数据不适合键值存储,可以使用NoSQL解决方案编写自定义代码。Map-reduce/异步处理和自定义视图缓存很常见。Brian Aker在2009年11月的OpenSQLCamp上做了一个非常有趣(并带有讽刺和偏见)的演讲http://www.youtube.com/watch?v=LhnGarRsKnA。跳到40秒处听关于连接的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接