有人能提供一个关于如何在Bigtable中构建数据的真实示例吗?请从搜索引擎,社交网络或任何其他熟悉的观点谈谈,这清楚而务实地说明了行 - >列族 - >列组合优于传统的规范化关系方法。
答案 0 :(得分:8)
阅读原始的Google白皮书很有帮助:
Google数据架构的全面信息来源列表如下:
http://highscalability.com/google-architecture
更新:2014年4月4日
可以在此处找到新版Google Google白皮书:
http://static.googleusercontent.com/media/research.google.com/en/us/archive/bigtable-osdi06.pdf
答案 1 :(得分:4)
我认为差异更多的是查询数据的方式而不是存储方式。
关系数据库和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
而不是{{1如果你觉得其中一组中有太多东西要跳过。
因此,关系方法为您提供了一种更方便的方式来查询数据,但代价是可能的性能损失。
如果您正在开发校园Web服务器,那么编写next
即使它们执行的时间比它们可能的时间长1微秒也是可以的。但是如果你正在开发Google,那么值得花一些时间来优化查询(纯粹的关系系统只允许使用SELECT *
访问他们的数据,这是不允许的。)
这种被称为SQL
的关系数据库有时会相互扩散。例如,NoSQL
是一个众所周知的Berkeley DB
存储引擎,NoSQL
使用它作为其存储后端来允许MySQL
查询。反之亦然,SQL
允许纯关键值查询到关系HandlerSocket
商店,并在其上构建InnoDB
数据库。