2009-11-29 141 views
14

最近我在研究NoSQL數據庫。我需要關於如何針對給定問題以最優化和有效的方式存儲數據的建議。我現在針對的是MongoDB。但是它應該和CouchDB一樣。我需要關於NoSQL/MongoDb和數據/模型結構的建議

比方說,我們有這3種型號:

Story: 
id 
title 

User: 
id 
name 

Vote: 
    id 
    story_id 
    user_id 

我希望能夠查詢數據庫,這些問題:

  • 誰投了票?
  • 此用戶投票的內容?

我做簡單的用一個關係數據庫工作時加入。問題是,我應該如何存儲這些對象的數據才能達到最高效率。

例如,如果我保存投票對象作爲故事的一個子集合它不會是容易得到的信息 - 「什麼是用戶投票支持」。

回答

7

我建議保存票作爲故事_id S IN每個用戶的列表。這樣,您可以通過查看列表來查明用戶投了哪些故事。爲了讓誰投票給一個故事你可以做一些喜歡的網友:

db.users.find({stories: story_id})

其中story_id是有問題的故事_id。如果您在stories字段上創建索引,那麼這兩個查詢都將很快。

+0

那麼,事實上,我想在投票模型中存儲更多信息。例如:created_at,ip,user_agent。 我應該將數據存儲在用戶集合的故事列表中嗎? – 2009-11-30 19:10:08

+0

您可以將投票存儲爲一個子文檔數組,每個文檔類似於'{story_id:...,created_at:...,ip:...}'等,然後查詢變爲'find({'stories .story_id':...})'。你也可以索引。 – mdirolf 2009-11-30 21:17:13

+0

那麼我有一個相當大的數據庫與幾個M記錄,並將測試上述情況。 – 2009-12-01 07:01:08

2

好吧,你還沒給一個規範化的數據模型,你會在SQL設置做。

在我的理解,你不MongoDB中做到這一點。您可以存儲參考文獻,但在一般情況下您不會出於性能原因。

我不是NoSQL領域的專家,但您爲什麼不簡單地按照您的需求來存儲已經投票支持故事集合和故事中的故事的用戶(ID) )用戶在用戶集合中投了票嗎?

1

在CouchDB中,這是非常簡單的。一種觀點發出:

function(doc) { 
if(doc.type == "vote") { 
    emit(doc.story_id, doc.user_id); 
} 
} 

另一種觀點發出:

function(doc) { 
if(doc.type == "vote") { 
    emit(doc.user_id, doc.story_id); 
} 
} 

兩者都是查詢非常快,因爲有沒有加入。如果您確實需要用戶數據或故事數據,則CouchDB支持多文檔提取。也相當快,是做「加入」的一種方式。

+0

我需要在這種情況下查詢,我會嗎? 一個用於查詢投票文檔的索引,另一個用於獲取用戶/文章的文檔。 – 2009-11-30 19:06:27

+0

@Stanislav。那是對的。您首先需要獲取投票,然後獲取用戶和/或投票的故事。 – dnolen 2009-12-01 01:15:22

3
  • ,直到它開始按照以下報價無關緊要
  • ,你正在做的不要擔心,如果你的查詢都是有效的錯

我一直在進行有關的方式頭腦轉換就是忘記所有的數據庫。在 關係數據庫世界中,你總是需要 擔心數據規範化和 你的表結構。放棄一切。 只需佈置您的網頁。把它們全部放在 。現在看看他們。您的 已經2/3。如果您忘記了數據庫大小很重要的 概念,並且 數據不應與您的 3/4重複,那麼您甚至不必編寫任何代碼!讓你的觀點決定你的模型 。您不必採取 您的對象,並使它們不再像在 關係世界中一樣。您現在可以存儲 帶有形狀的物體。

how-to-think-in-data-stores-instead-of-databases

0

我一直在尋找到的MongoDB和CouchDB的很多最近,但我的觀點是有限的。儘管如此,當考慮將故事文檔存儲在故事文檔中時,您可能不得不擔心達到4MB文檔大小限制。即使你不這樣做,你可能會不斷增加文檔的大小以使其移動,從而減慢寫入速度(請參閱MongoDB中的文檔大小)。

對於CouchDB來說,一旦視圖索引被計算出來,這些東西就相當簡單,優雅,而且相當快。然而就我個人而言,由於基準測試顯示隨着數據庫的增長(以及視圖索引增長)逐漸減慢到相當程度,我在CouchDB中做類似的項目時猶豫不決。我很想看到一些更新的基準測試,顯示隨着數據庫大小的增加,CouchDB的性能。我想嘗試MongoDB或CouchDB,但SQL仍然看起來如此高效和合乎邏輯,所以我會一直堅持下去,直到項目適合誘惑爲止。