2010-10-02 190 views
1

我知道這是關於這個主題的另一個問題,但我是NoSQL世界的完全初學者,所以我會喜歡一些建議。 SO的人告訴我MySQL對於這個數據集可能不是個好主意,所以我問這個。我有很多數據的格式如下:MongoDB或CouchDB或其他?

TYPE 1

ID1: String String String ... 
ID2: String String String ... 
ID3: String String String ... 
ID4: String String String ... 

,我很希望能轉換成這樣的事情:

TYPE 2

ID1: String 
ID1: String 
ID1: String 
ID1: String 
ID2: String 
ID2: String 

這是效率最低的方法,但我需要能夠通過鍵和v進行搜索ALUE。例如,我的疑問是這樣的:

  • 我可能需要知道的所有字符串指定ID包含,然後用一個不同的ID獲得的另一份名單相交的列表。
  • 我可能需要知道所有的ID包含給定的字符串

我很想實現這一點沒有轉變類型1到2類型的,因爲純粹的空間需求,但想知道如果任的MongoDB或CouchDB的或其他人(有人建議NoSQL如此開始谷歌搜索,發現這兩個非常受歡迎)會幫助我在這種情況下。我可以利用一個14節點的集羣,但會喜歡一些關於哪個是適合此用例的正確數據庫的建議。有什麼建議麼?

一些額外的東西:

  • 的投入將主要是靜態的。我將創建新數據,但不會修改任何現有數據。
  • 該ID的長度爲40個字節,而字符串是20字節
+0

您希望每個ID有多少個ID和字符串? – methodin 2010-10-02 04:06:59

+0

@methodin:根據ID,可能會有大約10 - 80000個字符串。 – Legend 2010-10-02 04:09:09

+0

@methodin:哦,還有,在Type-1中,我有大約200萬條記錄。如果我把它轉換成Type-2,那麼這個數字就會達到40億。 – Legend 2010-10-02 04:16:08

回答

3

MongoDB的會讓你在1型高效地存儲這些數據根據您的使用它看起來像一個這些(數據是JSON ):

的字符串

陣列

{ "_id" : 1, "strings" : ["a", "b", "c", "d", "e"] }

集KV的字符串

{ "_id" : 1, "s1" : "a", "s2" : "b", "s3" : "c", "s4" : "d", "s5" : "e" }

根據您的查詢,我可能會使用字符串數組方法。這裏的原因:

我可能需要知道的所有字符串 給定的ID中包含然後相交 與不同的ID獲得 另一個列表清單。

這很簡單,您可以獲得一個ID的關鍵值查找。在代碼中,它會是這個樣子:

db.my_collection.find({ "_id" : 1});

我可能需要知道所有的ID包含給定的字符串

同樣簡單:

db.my_collection.find({ "strings" : "my_string" })

是的,這很容易。我知道「字符串」在技術上是一個數組,但MongoDB會將該項識別爲一個數組,並將循環查找值。此文件爲are here

作爲獎勵,你可以索引「字符串」字段,你會得到一個索引陣列。因此,上面的發現實際上表現相對較快(明顯的折衷是指數會非常大)。

就擴展而言,一個14節點的集羣可能幾乎是矯枉過正的。但是,Mongo確實支持自動分片和複製集。他們甚至一起工作,這裏有一個blog post from a 10gen會員,讓你開始(10gen製作蒙戈)。

+0

感謝您的詳細解釋。 – Legend 2010-10-03 04:47:38