2011-07-21 37 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

是的,但是這種差異僅在於數據的物理組織,而問題是關於數據建模。 –