2009-11-04 84 views
3

看來您無法在CouchDB中嵌套數據庫。人們如何解決這個限制?例如,假設我想創建一個博客引擎,其中每個域都有一個單獨的數據庫。在每個數據庫中,我可能需要一個用戶數據庫,一個訂單數據庫等來包含各種用戶文檔,訂單文檔等等。CouchDB中的嵌套數據庫

最顯而易見的方法似乎是一個扁平結構,其中數據庫名稱標定數據庫嵌套級別之間的人爲邊界用連字號:

myblog.com-users 
myblog.com-posts 
myblog.com-comments 
anotherblog.com-users 
anotherblog.com-posts 
anotherblog.com-comments 
...hundreds more... 

另一種解決辦法是保持較低級別的數據庫和標記每個與頂層值記錄:

用戶含有文檔User1的數據庫,與現場實例=「測試」或場domain =「myblog.com」

回答

6

我想你在濫用術語數據庫這裏。沒有理由不能將用戶,帖子和評論數據存儲在單個couchdb數據庫中。您的couchdb視圖可以從評論文檔中分離出帖子文檔中的用戶文檔。

用於在數據庫的CouchDB用戶文檔示例地圖功能:

function(doc) { 
    if (doc.type = 'user') { // only return user documents 
    emit([doc.domain, doc.id], doc); // the returned docs will be sorted by domain 
    } 
} 

看到View Api各種方法來限制由域視圖結果使用startkey和endkey與視圖歸類。

+1

其實,我認爲你濫用術語數據庫。從CouchDB:最終指導:「對於嚴格的,CouchDB是一個數據庫管理系統(DMS),這意味着它可以容納多個數據庫,數據庫是容納'相關數據'的存儲區。當我在我的問題中提及數據庫時,我並不是指CouchDB DMS的多個實例,而是指多個存儲區來存儲相關數據。由於數據庫(存儲區)旨在保存相關數據,因此您可以爲所有域中的訂單設置存儲桶,或者可以爲單個域中的用戶和訂單設置存儲區。 – rcampbell 2009-11-05 09:43:49

+0

除了術語之外,使用Views來分隔用戶文檔,發佈文檔和評論文檔的建議絕對與我的想法一致,即爲每個文檔使用一個鑑別器鍵/值對。對我來說,只是感覺像一個黑客必須說Post.domain = MyApp,User.domain = MyApp,Comment.domain = MyApp等等。很多數據重複。另外,將所有客戶端數據分組在一起,只是覺得安全明智。視圖中的漏洞可能會將一個客戶端暴露給另一個客戶端的數據。 – rcampbell 2009-11-05 09:49:17

+2

可能是我的錯誤選擇。我的觀點是,如果你想在一個數據庫中有帖子評論和用戶都完美的話。每個域有一個數據庫可能是一個好主意,但如果你想整理或加入帖子和評論文件說,那麼如果你把它們全部放在同一個數據庫中,它會更容易。 – 2009-11-05 15:30:39

3

我認爲最好的解決方案是每個域有一個數據庫,每個數據庫存儲特定於域的數據。