有人能提供一个真实的例子,说明数据在Bigtable中是如何结构化的吗?请从搜索引擎、社交网络或任何其他熟悉的角度谈一谈,这些观点清楚而实用地说明了行->列系列->列组合如何优于传统的规范化关系方法。
发布于 2011-07-25 14:00:20
阅读最初的Google白皮书是有帮助的:
http://static.googleusercontent.com/external_content/untrusted_dlcp/labs.google.com/en//papers/bigtable-osdi06.pdf
这是Google数据架构上的信息源的综合列表:
http://highscalability.com/google-architecture
更新: 11/4/14
新版本的Google白皮书PDF可以在这里找到:
http://static.googleusercontent.com/media/research.google.com/en/us/archive/bigtable-osdi06.pdf
发布于 2011-07-21 19:20:23
我认为更多的区别在于查询数据的方式,而不是存储数据的方式。
关系数据库和NoSQL之间的主要区别是后者没有SQL。
这意味着您(而不是查询优化器)自己编写查询计划。
如果您知道如何做到这一点,这可能会提高查询性能。
考虑一个典型的搜索引擎查询:查找包含所有(或一些)单词的顶级10页面,例如,“湿t恤竞赛”,按相关性排序(为了简单起见,我们将单词邻近性放在一边)。
为此,您需要拆分所有单词,并将其保存在按(word, relevance, source)排序的可搜索和可迭代列表中。然后将该列表划分为(3 * ranks)集合(每个集合从搜索查询中给定排名的单词的顶部开始),其中ranks是可能的数字或排名,例如,1到10;并在source上连接这些集合。
在关系数据库中,它将如下所示:
SELECT w1.source
FROM ranks r1
JOIN words w1
ON w1.word = 'wet'
AND w1.rank = r1.value
CROSS JOIN
ranks r2
JOIN words w2
ON w2.word = 'shirt'
AND w2.rank = r2.value
AND w2.source = w1.source
CROSS JOIN
ranks r3
JOIN words w3
ON w3.word = 'contest'
AND w3.rank = r2.value
AND w3.source = w1.source
ORDER BY
relevance_formula (w1.rank, w2.rank, w3.rank)
LIMIT 10这最好是在按等级划分的三个集合上使用MERGE JOIN来执行。
然而,据我所知,没有一个优化器会构建这个计划(抛开relevance_formula可能不会在单个级别上分布的事实不谈)。
要解决这个问题,您应该实现您自己的查询计划:从每个单词/等级对的顶部开始,同时向下递减所有三个集合,跳过缺少的值,如果您觉得其中一个集合中有太多要跳过的值,则使用search而不是next。
因此,关系方法为您提供了一种更方便的查询数据的方法,但代价是可能的性能损失。
如果你正在开发一个校园web服务器,那么编写这些SELECT *是可以的,即使它们的执行时间比可能的时间长了1微秒。但是,如果您正在开发一个谷歌,那么花一些时间优化查询是值得的(纯关系系统只允许使用SQL访问它们的数据,而不允许这样做)。
这种所谓的NoSQL和关系数据库有时会相互扩散。例如,Berkeley DB是一个广为人知的NoSQL存储引擎,MySQL使用它作为其存储后端,以允许SQL查询。反之亦然,HandlerSocket允许对带有构建在其上的InnoDB数据库的关系MySQL存储进行纯粹的键值查询。
https://stackoverflow.com/questions/6774503
复制相似问题