2010-11-22 30 views
4

我正在尋找關於如何在CouchDB中存儲和構建數據的很好的示例/實踐。示例如何構建CouchDB

比權威指南中的博客應用程序更復雜一些。

讓我們想象一個像Stack Overflow這樣的應用程序。

  • 如何存儲基本部分 - 用戶,問題,答案,評論,標籤,投票?
  • 您認爲將數據劃分到不同的數據庫是一個好主意嗎?例如把用戶放在單獨的數據庫...或投票/標籤?
  • 還是不是因爲在視圖中無法合併來自不同數據庫的數據?

回答

2

適用於結構化關係數據庫中的數據的概念對文檔存儲數據庫也同樣有效。唯一真正改變的是通常在關係型數據庫上進行連接的查詢在NoSQL數據庫中通常很麻煩。這意味着通常在RDBMs上通過連接解決的一對多關係通常會涉及更多的NoSQL db的非規範化。在一個一對多關係的典型例子中,比如博客文章和該帖子的評論,而不是在帖子的評論中有一個外鍵,而是實際上將帖子中的一些數據複製到評論中,以避免有額外的查詢,並且您還會在帖子中保留評論ID的列表(也可能是最近的10個評論機構)。

+0

TokenMacGuy,外鍵,你的意思是這篇文章的 「_id」 屬性可以說仍與結構
實現的呢? 爲了方便起見,您會將重複數據存儲在評論對象中? 試圖用Backbone.js實現,所以我真的在爲Backbone的CRUD操作做準備。 – AndrewHenderson 2013-01-29 07:31:58

+0

是的,您可以通過將父項的ID添加到子項的屬性來關聯這兩個文檔。但不是,反規範化非常不方便,通常是爲了表現; couchDB可能會將您保存在這裏,但是有意見。 – SingleNegationElimination 2013-01-29 13:09:11

0

就幹什麼「加入」 CouchDB中:

實際上,它可能會更有意義不重複的數據。以下是我在couchdb中創建的一個視圖示例:http://wamoyo.iriscouch.com/_utils/database.html?ideageneration/_design/IdeaGeneration/_view/challengesAndIdeas

這個簡單的應用讓人們進入挑戰,然後讓他們收集有關如何解決這些挑戰的想法。它可以很好地轉化爲博客例子:挑戰將是博客文章,並且想法將成爲每篇博文中適合的評論。

我已經在全面詳細登載了這裏的另一個問題:Couch DB Join operations like RDBMS

對於結構應用在CouchDB中,賈森我在玩同樣的問題。 CouchDB提供了很多靈活性,所以我不太確定是否應該使用顯示和列表來顯示數據,或者只是編寫客戶端代碼來執行此操作,或許使用backbone,然後使用couchdb視圖來提供模型。讓我知道你提出了什麼,我會很好奇。

0

我建議您將各個部分(用戶,問題,答案,評論,標籤,投票)作爲單獨的文檔存儲在一個數據庫中。

不要將它們存儲在不同的數據庫中。您將失去視圖的力量,並且不得不使用大量的HTTP請求來收集數據。

-

退房http://www.cmlenz.net/archives/2007/10/couchdb-joins。它真的爲我闡明瞭這個問題。在another question中分享鏈接Costa

雖然本文使用無處不在的博客示例,但我相信具有「視圖歸類」的方法#2是您想要的。

作爲另一文檔子項的文檔將通過父項的「_id」屬性進行關聯。此外,您將爲文檔提供「類型」屬性,以便在視圖中返回時對其進行排序。例如:

function(doc) { 
    if (doc.type == "post") { 
    map([doc._id, 0], doc); 
    } else if (doc.type == "comment") { 
    map([doc.post, 1], doc); 
    } 
} 

什麼你就已經返回是這樣的:

{ 
"total_rows": 5, "offset": 0, "rows": [{ 
    "id": "myslug", 
    "key": ["myslug", 0], 
    "value": {...} 
}, { 
    "id": "ABCDEF", 
    "key": ["myslug", 1], 
    "value": {...} 
}, { 
    "id": "DEFABC", 
    "key": ["myslug", 1], 
    "value": {...} 
}, { 
    "id": "other_slug", 
    "key": ["other_slug", 0], 
    "value": {...} 
}, { 
    "id": "CDEFAB", 
    "key": ["other_slug", 1], 
    "value": {...} 
}] 
} 

你現在所有的數據,家長和孩子們在一個HTTP請求返回。另外,您可以直接通過REST API在這些文檔上進行CRUD。在我看來,這正是你想要的。

您可以將相同的方法應用於具有一對多或多對一關係的任何事物。

希望這會有所幫助!

0

http://www.cmlenz.net/archives/2007/10/couchdb-joins中的示例模型對理解結構很有幫助,但對於文檔ID使用博客主題的方法我有一點評論。如果兩個用戶擁有相同的博客標題,則會導致衝突。我是couchdb的新手,但似乎doc id和doc title應該是分開的,儘管可以使用/ blogName加載博客。 {:6377738426gdjjsb,_rev:1 hsusubsvh6377,標題:BLOGNAME,AUTHORNAME:shakespeareND5 _id}