我已经阅读了一些关于Bigtable和NOSQL的文章。有趣的是,它们避免使用JOIN操作。
作为一个基本的例子,让我们考虑Employee和Department表,并假设数据分散在多个表/服务器上。
我只想知道,如果数据分布在多个服务器上,我们如何执行JOIN或UNION操作?
当你有极大量的数据时,你可能想避免连接操作。这是因为每个键值查找的开销相对较大(服务需要找出要查询哪些节点,并同时查询它们并等待响应)。在此,我指的是延迟而不是吞吐量限制。
这使得连接操作非常低效,因为您需要执行许多外键查找,这些查找最终会到达许多不同的节点(在许多情况下)。因此,您应该避免使用此模式。
如果这种情况不经常发生,您可能可以承受这种开销,但如果您打算经常执行此操作,那么"去规范化"(denormalising) 数据可能就很值得了。
NoSQL存储中存储的类型通常相当 "非正常"。通常会在许多不同的地方复制相同的数据以便更容易地进行查找。
此外,大多数NoSQL也不支持辅助索引,这意味着如果您想按任何其他标准查询,您必须复制一些东西。
如果您正在存储诸如员工和部门之类的数据,使用传统数据库的效果更好。
原生地,不幸的是,在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,
},
},
},
})
Kaleb是正确的。如果您的数据不适合键值存储,可以使用NoSQL解决方案编写自定义代码。Map-reduce/异步处理和自定义视图缓存很常见。Brian Aker在2009年11月的OpenSQLCamp上做了一个非常有趣(并带有讽刺和偏见)的演讲http://www.youtube.com/watch?v=LhnGarRsKnA。跳到40秒处听关于连接的内容。