2013-04-18 96 views
1

我開始爲一個肯定會有很多併發訪問的項目設計一個全新的MongoDB數據庫。 我選擇MongoDB是因爲我知道它的可伸縮性和查詢的速度。MongoDB的查詢優先方法?

我知道,但是,即使使用的MongoDB,出於性能的考慮,我應該嘗試打數據庫幾次越好。

我知道Apache的卡桑德拉,另一種的NoSQL數據庫,主張「查詢第一」的方針,這意味着你應該想想你的查詢,然後再根據他們組織的數據結構。現在

,我想知道如果同樣的原則也適用於MongoDB的。

我沒有找到這方面有任何相關的討論在網絡上爲止。

+1

有很多關於此的討論,只需搜索「mongodb query to schema design」 Google我得到了大量的結果,但是,一般情況下,您需要圍繞您的查詢形成模式 – Sammaye

+0

對於任何關心性能的系統,無論使用SQL/NoSQL,我總是會考慮數據的結構以及它將如何被訪問或查詢。如何在不同的數據庫中構建數據可能會有所不同,並且規則的應用也不同,但我認爲這是任何生產軟件項目的重要方面。 – WiredPrairie

回答

1

爲了在Mongo中組織和建模您的數據,您要學習和搜索的單詞是非規格化。在使用Mongo時,我一定會首先想到您的查詢。不僅僅用於建模,還用於建立索引。

一個很好的規則我在Mongo的會議如何進行非規範化聽到:

  1. 如果數據是相當靜態的,繼續和非規範化/嵌入文檔中的數據。
  2. 如果數據更改頻繁,請參考另一個文檔。

我已經看到這是非常真實的,經過一年的生產Mongo的工作。嵌入經常變化的數據已經給我們帶來了很多痛苦。

+2

雖然應該注意的是,反規範化不是模式設計的唯一方法,有時不推薦。這種範例的優點取決於查詢。 – Sammaye

0

查詢與MongoDB的工作時,你就不能存儲所有數據「原樣」,只是創建任意查詢和跨表(集合)加入後者第一是很重要的。 MonogDB是一個面向文檔的數據庫,即。您始終使用文檔而不是來自不同表格的結果集。

好消息是MongoDB的架構更少。您可以根據需要構建文檔,甚至根據需要隨時改變文檔的架構。但是你需要事先考慮的是如何(使用什麼樣的關鍵和索引)以及何時(記住,你不能連接!)你將要檢索它們。

由於ryan1234建議,非規範化是對付這個選項。但是,這會導致冗餘數據,並且隨着時間的推移可能難以維護。所以你可能不想把所有東西都歸一化。您需要務實地在您的應用程序代碼中尋址這些簡短事件。下面是一些建議:

  • 只要內存足跡可以接受,就可以預取經常使用的數據,例如查找表。
  • 決定哪些數據需要真正快速地按需提供,例如,通過Web界面請求。理想情況下,您只需使用索引就可以查詢單個密鑰,該索引將爲您提供單個請求所需的所有數據。
  • 決定使用長時間運行的作業(如地圖縮小或隊列)可以在後臺處理哪些數據。或者甚至有自定義的cronjob計劃作業可以處理您的數據,例如準備您可以稍後使用索引檢索的報告。
  • 在您的客戶端執行多個請求並加入數據。例如。如果你有一個Web客戶端,你可以做幾個後續請求來提取你的數據,你可能會用一個RDBMS在一個請求中完成這些請求。 MongoDB中的查詢如果編入索引非常快,那麼只要您不同步多個查詢並在服務器上加入數據,就可以在本身執行許多請求時無任何錯誤。在客戶端上執行此操作,可以在逐步構建用戶界面的同時利用整個堆棧(負載平衡器,緩存,..)