2011-07-21 35 views
11

有人可以提供一个真实的例子来说明如何在Bigtable中构建数据吗?请从搜索引擎,社交网络或任何其他熟悉的角度进行讨论,这些观点清楚而实用地说明了行 - >列族 - >列组合优于传统的规范化关系方法。Bigtable实例

回答

4

我相信不同之处在于数据被查询的方式,而不是存储方式。

关系数据库和NoSQL之间的主要区别在于后者中没有SQL

这意味着你(而不是查询优化器)自己编写查询计划。

如果您知道如何做到这一点,这可能会提高查询性能。

考虑一个典型的搜索引擎查询:查找顶部10包含全部(或部分)单词的页面,比如说,“湿T恤比赛”,按相关性排序(为简单起见,我们将单词旁边放在旁边)。

要做到这一点,你需要的所有单词拆分,并保存在由(word, relevance, source)下令搜索和迭代列表。然后,你的分区这个名单到(3 * ranks)集(每个起始于在您的搜索查询的话,在一个给定的级别上),其中ranks是可能的数量或级别,比如,110;并加入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数据库对关系数据库进行纯关键字值查询。

+0

Altrough您的文章,使有效poitns,有数据的存储方式有很大的不同。 HandlerSocket完全用于跳过RDBMS的SQL层,当你想要的是通过它的索引获得行时。您可以在基于文档的数据存储中使用查询。文档模型商店,图形商店,关键/价值商店 - 每个商店都存储不同的数据,以便以不同的方式更有效地查询数据。在数据出于性能目的而非规范化后,即使在合理的数据库中。 –

+0

@Darhazer:在不同的关系数据库中,数据的存储方式是不同的:在'PostgreSQL'中没有聚簇表,而在'InnoDB'中没有聚簇表。当然,我错过了许多事情,但如果我试图覆盖所有的事情,我会打30,000个邮件大小,每个邮件限额30个答案。 – Quassnoi

+0

是的,但是这种差异仅在于数据的物理组织,而问题是关于数据建模。 –