有人可以提供一个真实的例子来说明如何在Bigtable中构建数据吗?请从搜索引擎,社交网络或任何其他熟悉的角度进行讨论,这些观点清楚而实用地说明了行 - >列族 - >列组合优于传统的规范化关系方法。Bigtable实例
回答
阅读原谷歌白皮书是有帮助的:
由于是对谷歌的数据架构信息来源这一全面的列表:
http://highscalability.com/google-architecture
更新:11/4/14
的谷歌白皮书PDF的新版本可以在这里找到:
http://static.googleusercontent.com/media/research.google.com/en/us/archive/bigtable-osdi06.pdf
我相信不同之处在于数据被查询的方式,而不是存储方式。
关系数据库和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
如果你觉得有在其中一组中将跳过太多。
因此说,关系方法为您提供了更便捷的方式在可能的性能损失代价来查询数据。
如果你正在开发一个校园网服务器,然后写那些SELECT *
是OK,即使它们被执行一微秒的时间比他们可能可能。但是,如果你正在开发一个Google,那么花一些时间来优化查询是值得的(纯粹的关系系统只允许使用SQL
来访问他们的数据)。
的这种称为NoSQL
和关系数据库有时扩散到彼此中。例如,Berkeley DB
是众所周知的NoSQL
存储引擎,其被MySQL
用作其存储后端以允许SQL
查询。反之亦然,HandlerSocket
允许通过构建的MySQL
数据库对关系数据库进行纯关键字值查询。
- 1. Google云端Bigtable实例
- 2. 无法连接到Google Cloud Bigtable实例
- 3. Auth从计算实例连接到Bigtable
- 4. 实现声明的Cloud Bigtable写入QPS
- 5. BigTable的设计 - 一个BigTable的细胞
- 6. BigTable vs noSQL
- 7. BigTable with C#Library
- 8. Google Bigtable-primarykey
- 9. Bigtable批量插入
- 10. Bigtable导入错误
- 11. NoSQL(BigTable ...)和TimeSeries Data
- 12. Google Cloud Dataflow管道中的例外情况从BigQuery到Cloud Bigtable
- 13. Google Cloud Bigtable是否支持透明的维护/实时迁移?
- 14. 将成千上万的实体插入BigTable
- 15. Bigtable性能影响列族
- 16. 谷歌云上的TTL Bigtable
- 17. 学习Google App Engine&BigTable
- 18. Bigtable和复合主键
- 19. Google Cloud Bigtable和Java 8
- 20. Bigtable中列键的顺序?
- 21. bigtable是否需要锁定?
- 22. 实例退休:实例停
- 23. 如何从父实例实例化子实例
- 24. 实例
- 25. 实例
- 26. LibSVM.classifyInstance(实例实例)抛出显示java.lang.NullPointerException
- 27. 使用OpsWorks实例启动实例AMI
- 28. 类定义实例实例化问题
- 29. 实例化JavaScript错误对象实例
- 30. 通过实例ID获取实例
Altrough您的文章,使有效poitns,有数据的存储方式有很大的不同。 HandlerSocket完全用于跳过RDBMS的SQL层,当你想要的是通过它的索引获得行时。您可以在基于文档的数据存储中使用查询。文档模型商店,图形商店,关键/价值商店 - 每个商店都存储不同的数据,以便以不同的方式更有效地查询数据。在数据出于性能目的而非规范化后,即使在合理的数据库中。 –
@Darhazer:在不同的关系数据库中,数据的存储方式是不同的:在'PostgreSQL'中没有聚簇表,而在'InnoDB'中没有聚簇表。当然,我错过了许多事情,但如果我试图覆盖所有的事情,我会打30,000个邮件大小,每个邮件限额30个答案。 – Quassnoi
是的,但是这种差异仅在于数据的物理组织,而问题是关于数据建模。 –