2012-03-16 88 views
2

所以我已經閱讀了關於在couchdb上翻譯關係的東西,但我仍然無法想出一個適當的映射函數來表示多對多。couchdb很多很多頭痛

想象一下,你有一些文檔(注意,這是一個例子,而不是實際的模型):

{name:"whatever1", from:"A"} 
{name:"whatever2", from:"A"} 
{name:"whatever3", to:"B"} 
{name:"whatever4", to:"C"} 

和一些其他類型的文檔定義的關係:

{name:"link1", link: true, from: "A", to: "B"} 
{name:"link2", link: true, from: "A", to: "C"} 

我想拿出正確的功能,返回我的組合列表:

{ name: "link1", 
    froms: ["whatever1", "whatever2"], 
    tos: ["whatever3"] 
} 

有誰知道如何這樣的地圖,我應該改變我的文檔結構嗎?如果你只是想鏈接一個指南,請不要發佈。

+0

幫助我,理解你的問題..更經常的是什麼?鏈接或凡是? ups ...同時你改變了問題... – okurow 2012-03-16 17:00:49

回答

5

一般來說說起來,多對多是根本不可能存在的CouchDB。你看起來就像是一個沒有糖衣的人直接想要它,所以它就是這樣。

加入相關數據並不是CouchDB的優勢,當然這也是關係數據庫的主要優勢。然而,這個事實有點混亂,因爲大多數人都「直觀地」對關係數據進行建模,因爲這就是我們所有人的訓練。

您的困難恰恰是您必須付給CouchDB以獲得其他功能的成本:HTTP API,靈活的集羣,多主或離線操作等。按照設計,其同步功能是可能的,因爲documents are simple, and unrelated to each other

但是,CouchDB的另一個優勢是併發性。因此,如果您已經享受到CouchDB的其他功能,並且您只需要克服這一點,那麼您可以簡單地在客戶端「加入」。

一個更簡單的映射函數只是發出所有froms(key:["from", "A"], value:"whatever1")和tos(key:["to","B"], value:"whatever3")。因此,您可以用?key=["from","A"]查詢它,並獲得所有發送者的列表,以查看任何給定值或值。

對於每個鏈接的文檔,你有一個值來檢查。因此,查詢兩者(或者一次一個,或同時,這是相當容易的Javascript例如):

  1. 與選項?key=["from","A"]
  2. 而且還認爲視圖與?key=["to","B"]

一旦兩個結果都返回,您就可以得到該鏈接的答案。

你會發現,因爲你可能只有 CouchDB的(索引掃描)做出有效的請求,CouchDB的支持請求非常高的速率和高併發連接數。

這很簡單嗎?在Javascript中,它並沒有那麼糟糕,但是沒有,基本上這並不容易。這個問題從根本上削減了CouchDB穀物和關係穀物。(我對Drizzle對這樣的問題感到非常興奮。)

+1

感謝您的回覆,確實沙發已經給我帶來了很多,我願意爲此付出更多的努力。你所描述的解決方案接近我最終實施的方案。但是,在這裏或那裏閱讀各種博客,我確實已經掌握了將所有內容都放在一個請求/視圖/列表中的可能性。 – 2012-03-17 13:32:46