我已经阅读了一些关于Bigtable和NOSQL的文章.他们避免JOIN操作非常有趣.
作为一个基本的例子,让我们采用Employee和Department表,并假设数据分布在多个表/服务器上.
只是想知道,如果数据分布在多个服务器上,我们如何进行JOIN或UNION操作?
当您拥有非常大的数据时,您可能希望避免加入.这是因为单个密钥查找的开销相对较大(服务需要确定要查询的节点,并行查询它们并等待响应).通过开销,我的意思是延迟,而不是吞吐量限制.
这使得连接非常糟糕,因为你需要进行大量的外键查找,最终会进入许多不同的节点(在很多情况下).所以你想要避免这种模式.
如果它不经常发生,你可能会受到打击,但如果你想要做很多这样的事情,那么数据的"非规范化"可能是值得的.
存储在NoSQL存储中的东西通常是非常"异常"的.在各种不同的地方复制相同的数据以使查找更容易并不罕见.
此外,大多数nosql也不(实际上)支持二级索引,这意味着如果要按任何其他条件查询,则必须复制内容.
如果您正在存储员工和部门等数据,那么使用传统数据库会更好.
您将必须进行多项选择,然后在应用程序中手动加入数据。有关更多信息,请参见此SO帖子。从该帖子:
可以使用一种称为GQL(“ gee-kwal”)的语言(基于SQL的子集)从AppEngine等服务中查询Bigtable数据集。GQL中明显缺少的是任何一种JOIN命令。由于Bigtable数据库具有分布式特性,因此在两个表之间执行联接将效率非常低下。相反,程序员必须在其应用程序中实现此类逻辑,或者设计其应用程序以使其不再需要它。