【问题标题】:Join operation with NOSQL使用 NOSQL 进行连接操作
【发布时间】:2011-01-01 00:00:09
【问题描述】:

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

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

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

【问题讨论】:

  • 您想在名为 NoSQL 的产品中进行 SQL JOIN 或 UNION 操作吗?
  • 简单,你使用playOrm和join partitions(partitions通常少于100万行但是table可以是无限的)并且表现不错。

标签: sql join nosql bigtable


【解决方案1】:

不幸的是,在本机上无法执行加入 NoSQL 数据库的操作。这实际上是 SQL 和 NoSQL DB 之间最大的区别之一。

正如@kaleb 所说,您必须进行多项选择,然后“手动”加入所需的信息。

幸运的是,有诸如 Prisma 之类的 ORM 框架可以让您“伪造”本机 SQL 连接功能。

注意:您仍然在后台执行多个数据库调用,增加了读取操作,以及所有相关问题。

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

示例:

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

在这种情况下,帖子存储在不同的表中,但 Prisma 能够获取它们并将它们连接到 User 对象中。

【讨论】:

  • 一些 NoSQL 数据库可以进行连接,所以总括语句是错误的
  • 请扩展您的答案。 NoSQL 是不是只能通过聚合查询来执行 JOIN 查询,这会将查询本身的时间复杂度提高到 O(log(N))+Nlog(M)?涉及的文件M和N在哪里?
  • 并非所有数据库都使用文档。例如,Neo4j 通过关系进行图遍历,从而将节点“加入”到通过边的路径中。 Couchbase 确实加入了索引。 Apache Hive/Impala/Trino 通过类似 MapReduce 的操作连接大型半结构化文件集。
  • 不过,在这里重新考虑您的答案,Prisma 仅列出了对 SQL 数据库的支持,并没有解决有关 BigTable 的问题
【解决方案2】:

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

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

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

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

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

如果您要存储员工和部门等数据,则最好使用传统数据库。

【讨论】:

【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您必须进行多项选择,然后在您的应用程序中手动加入数据。请参阅this SO post 了解更多信息。从那个帖子:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2018-06-03
      • 2020-09-15
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多