從關(guān)系型數(shù)據(jù)庫(kù)轉(zhuǎn)移至NoSQL數(shù)據(jù)庫(kù)——比如從MySQL轉(zhuǎn)移到Couchbase,你需要對(duì)你的數(shù)據(jù)進(jìn)行再思考。至于為什么是Couchbase而不是MongoDB什么的,因?yàn)椴┪牡淖髡進(jìn)C Brown是現(xiàn)任Couchbase副總裁,所以你懂得;同時(shí)這篇Couchbase博文還涉及到遷移后對(duì)查詢的影響。
以下為譯文:
如果你有一個(gè)建立在MySQL上的數(shù)據(jù)庫(kù),你可能就會(huì)考慮是否需要以及更重要的如何將數(shù)據(jù)庫(kù)(和你的應(yīng)用程序)轉(zhuǎn)移到Couchbase上。最大的絆腳石不在Couchbase建立或者是存儲(chǔ)信息方面(盡管他們也很重要),而是數(shù)據(jù)的重思,你需要使用另一種方式去處理你的數(shù)據(jù),然后對(duì)應(yīng)用程序作出相應(yīng)的變化。
下面將著眼如何把MySQL數(shù)據(jù)庫(kù)結(jié)構(gòu)轉(zhuǎn)換成Couchbase Server,并針對(duì)兩個(gè)數(shù)據(jù)庫(kù)的查詢方式改變進(jìn)行討論。
首先:數(shù)據(jù)結(jié)構(gòu)的重思
MySQL(以及其它的SQL類(lèi)型并且以表格為基礎(chǔ)的數(shù)據(jù)庫(kù))強(qiáng)迫你將數(shù)據(jù)打造成表格的形式。你所有的數(shù)據(jù)就是一張表,當(dāng)你儲(chǔ)存復(fù)雜結(jié)構(gòu)類(lèi)型數(shù)據(jù)時(shí),一個(gè)單獨(dú)的數(shù)據(jù)片可能拆分成多于一張的表格。對(duì)于一些應(yīng)用程序以及數(shù)據(jù)類(lèi)型,如此存儲(chǔ)數(shù)據(jù)是一個(gè)完美的邏輯以及合理的途徑。而同樣對(duì)于某些應(yīng)用程序,使用這樣的方法去存儲(chǔ)數(shù)據(jù)并不是很適合。
下面看一個(gè)典型的例子,一個(gè)recipe(食譜)數(shù)據(jù)庫(kù)。因?yàn)镃heffy.com是建立在MySQL之上,所以MC Brown對(duì)此非常清楚?;A(chǔ)的表格結(jié)構(gòu)是一個(gè)核心表,稱為recipe,包括了食譜的name、subtitle、description和servings。當(dāng)然還有一些其它的recipe信息,比如:成分清單(Ingredients)、方法步驟(Method)、元數(shù)據(jù)(Metadata)以及通過(guò)一個(gè)獨(dú)立的recipe ID連接到原recipe表的關(guān)鍵詞(Keywords)。你可以在下圖中看到這些主要部分:
這個(gè)結(jié)構(gòu)有一些潛在的好處,一些特定的操作可以非常簡(jiǎn)單的完成。舉個(gè)例子,比如說(shuō)查詢一些包含原理“carrot(胡蘿卜)”的recipe(食譜)。你可以從Ingredients表中查找“carrot”,并鑒于這點(diǎn)得到一個(gè)匹配的recipe列表。通過(guò)使用join你可以獲得一個(gè)recipe列表,從中獲取他們的title以及一些其它的信息,通過(guò)搜索Ingredient表,使用join連接兩張表中的recipe ID。
當(dāng)然這種查詢方法很簡(jiǎn)單,可以收集到一個(gè)食譜的所有信息。然而當(dāng)你想給用戶演示這個(gè)食譜時(shí),將會(huì)變得很復(fù)雜。你可以通過(guò)一個(gè)單獨(dú)的查詢來(lái)完成,然而有時(shí)候通過(guò)幾個(gè)查詢來(lái)完成這個(gè)更容易,分別獲取recipe、ingredients、metadata等表格的數(shù)據(jù)。在應(yīng)用程序?qū)?,通過(guò)建立對(duì)象就可以自動(dòng)的完成這些操作,同時(shí)這也是此類(lèi)操作的基礎(chǔ)方法。