如何學習NoSQL?

banq發表於2011-08-16
How You Should Go About Learning NoSQL

作者在twitter上總結:
1: 用 MongoDB. 2: 花20分鐘學習Redis 3: 觀察這個video理解Dynamo.

這篇文章主要是明確兩個概念:
1.第二索引和Join問題,在關聯式資料庫中,通常除了主索引主鍵primary key之外,還有第二個index。而NoSQL一般只有主鍵,沒有第二索引,那怎麼替換呢?

作者認為可以無需第二索引,以Score表為例子,有主鍵Id, LeaderboarId 和UserId以及Score四個欄位。作者意思再建立另外一個表有兩個欄位:LeaderboardId 和 ScoreIds,表達屬於同一個leaderboard所有Score。透過兩次查詢,首先根據LeaderboarId獲得所有的 ScoreId集合,然後再在Score表中根據主鍵Id(ScoreId)獲得其餘欄位。

在關聯式資料庫中可能將ScoreIds看成一個陣列,因而效率不太好,但是如果資料庫引擎將其看成是一個整塊物件(可以Push remove和切片slice),這個方案就不會那麼誇張了,當然,不可否認第二索引也許更好些。

第二個需要明確的是joins,雖然有些NoSQL支援第二索引有些其他不支援,但是他們幾乎都認為joins是狗屎。

為什麼呢?因為joins導致資料庫切分sharding無法實施,Sharding是大多數NoSQL可伸縮的方案。

以score為例,leaderboard的1 3 5 7 9的score資料也許在伺服器1,而伺服器2包含 leaderboard的2 4 6 8 10資料,一旦你這樣開始切分你的資料,join將不會起作用。比如要透過join Scores,userId和Users.Id獲得UserName,因為在不同伺服器上,就無法獲得。

那麼我們如果處理無join(joinless)世界呢?在你自己應用程式中使用join類似功能,比如透過二次查詢,你首先獲得所有scores資料,然後,透過再透過查詢Users表獲得UserName集合。增加程式碼必要的複雜性才能進行水平伸縮。

作者在該文還談了具體幾個NoSQL的特點,待續。

[該貼被banq於2011-08-16 09:58修改過]

相關文章