47

我浏览了一些关于 Bigtable 和 NOSQL 的文章。非常有趣的是,它们避免了 JOIN 操作。

作为一个基本示例,让我们以 Employee 和 Department 表为例,假设数据分布在多个表/服务器上。

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

4

4 回答 4

44

当您有非常大的数据时,您可能希望避免连接。这是因为单个键查找的开销相对较大(服务需要弄清楚要查询哪些节点,并并行查询它们并等待响应)。开销是指延迟,而不是吞吐量限制。

这使得连接非常糟糕,因为您需要进行大量外键查找,最终会到达许多不同的节点(在许多情况下)。因此,您希望避免将其作为一种模式。

如果它不经常发生,你可能会受到打击,但如果你想做很多事情,可能值得“非规范化”数据。

首先,存储在 NoSQL 存储中的东西通常非常“异常”。在各种不同的地方复制相同的数据以使查找更容易的情况并不少见。

此外,大多数 nosql 也不(真的)支持二级索引,这意味着如果您想通过任何其他标准查询,则必须复制内容。

如果您要存储员工和部门等数据,那么使用传统数据库确实会更好。

于 2010-01-03T22:26:07.100 回答
6

您必须进行多项选择,并在您的应用程序中手动加入数据。有关更多信息,请参阅此 SO 帖子。从那个帖子:

可以使用基于 SQL 子集的 GQL(“gee-kwal”)语言从 AppEngine 等服务中查询 Bigtable 数据集。GQL 中明显缺少的是任何类型的 JOIN 命令。由于 Bigtable 数据库的分布式特性,在两个表之间执行连接将非常低效。相反,程序员必须在他的应用程序中实现这样的逻辑,或者将他的应用程序设计为不需要它。

于 2010-01-03T15:13:19.310 回答
3

卡莱布是对的。如果您的数据不能很好地适合键值存储,您可以使用 NoSQL 解决方案编写自定义代码。Map-reduce/async 处理和自定义视图缓存很常见。Brian Aker 在 2009 年 11 月的 OpenSQLCamp http://www.youtube.com/watch?v=LhnGarRsKnA上做了一个非常有趣(并且带有讽刺性和偏见)的演讲。跳过 40 秒以了解加入情况。

于 2010-01-03T15:57:44.453 回答
1

Natively, unfortunately, is not possible to perform a Join into a NoSQL database. This is actually one of the biggest differences between SQL and NoSQL DBs.

As @kaleb said, you would have to do multiple selections and then join the needed information "manually".

Luckily, there are ORMs frameworks such as Prisma that will allow you to "fake" the native SQL join feature.

Note: you're still performing multiple db calls under the hood, increasing the read-ops, and everything that's concerned.

" A key feature of Prisma Client is the ability to query relations between two or more models. " -> https://www.prisma.io/

example:

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

In this case, the posts are stored in a different table, but Prisma is able to fetch them and join them into the User object.

于 2021-05-22T10:03:15.013 回答