2012-07-16 61 views
0

我有幾個CouchDB數據庫,全部數百GB,我需要以依賴於多個數據庫的方式獲取文檔,例如, (僞代碼前綴表示該文件是從哪個數據庫):CouchDB的視圖性能與HTTP批量獲取的比較

for each Db1_Document in Db1 
    if Db1_Document has field "Db2_match" 
     Db2_Document = Db1_Document.Db2_match 
     for each Db2_Reference in Db2_Document.references 
      if Db2_Reference has empty field "Db1_match" 
       add Db2_Reference to List bigList 
     emit [Db2_Document, bigList] 

我可以設置各種觀點的複雜(哈克)做到這一點。或者我可以批量HTTP獲取我需要的文檔並使用Java進行處理。

與創建視圖相比,批量HTTP抓取有多昂貴?事實是CouchDB本身不支持視圖鏈接的原因足以避免視圖解決方案?

這是一個效率非常高的應用。

回答

1

製作視圖是Couch中的I/O和CPU密集型,尤其是因爲它會影響實例中的所有文檔。

如果您的邏輯影響所有文檔,那麼製作視圖可能是最有效的機制。如果您有一個相當粗糙的視圖ALREADY,它可以爲您提供處理所需的子集(或子集的超集,但少於整個數據庫),最好只需集中獲取所需的子集並在本地處理它。

1

您可能會發現創建一個新數據庫可以更容易/更好地使用過濾複製將其他數據庫中的所有信息提取到另一個數據庫中。然後對其他數據庫進行查詢。您的數據將會有點陳舊,但將所有相關數據存儲在單個數據庫中的優勢將使您可以編寫一個可查看所有相關文檔的視圖。因此,隨着新文檔從複製步驟到達,該視圖將被逐步索引和更新。

這將提供世界上最好的:

  • 您將能夠編寫意見認爲是有意義的。
  • 您將只將需要的數據提取到Java代碼中。
  • 您仍然可以在運行時獲得性能優勢,因爲該視圖將被索引,隨着新數據從複製到達,該視圖將逐步更新。