2014-01-27 96 views
0

我目前正在使用MongoDB進行設置並存儲訪問者信息。例如,假設我有關於在日期範圍內訪問過您網站的每位訪問者的信息。我想將這些信息存儲在數據庫中。用於處理訪問者數據的Mongodb Schema

目前我正在像下面的例子一樣將它存儲在mongo中。我真的有2個問題:

  • 是蒙戈我們的最佳解決方案[我想過使用CouchDB的,MySQL的將工作,但對於高流量的網站,該QPS會是一個瓶頸]
  • 是否將唯一訪問者存儲在文檔中[每個日期都分配給訪問者]是一個好主意,因爲16mb是最大文檔大小,而不是將每個訪問者簡單地存儲爲自己的文檔?

架構:

Visitor 
    Non unique id 
    Date 
    Visitors --array[could contain up to millions of visitors[daily visitors]] 
     source 
     keyword 
     city 
     state 
     country 
     page_views 
     etc....... 

回答

1

如果僅在Visitors陣列存儲的IP地址,並且使用具有45個字符最大長度人類可讀表示,那麼您可以適應多達372827名遊客在單個文檔。所以如果你每天的訪問量超過這個數量,你可以獲得風險投資的資金並重寫你的應用(只是在開玩笑)。一種選擇是將數據存儲在塊中。您可以在這樣的文檔中維護一個計數器,並且只要您接近此最大值,就可以創建一個新的文檔。這有點難以維護,所以另一種選擇是將數據分成幾小時,或者如果必須的話,可以分鐘。

我不認爲值得將每位訪問者存儲在單獨的頂級文檔中,除非您打算在該記錄中存儲更多信息並分析該訪問者訪問的內容等。取決於您想要對此數據執行什麼操作。

對於日誌記錄和視圖計數我會去一個大陣。出於業務分析的目的,我會爲每個訪問者選擇1個文檔。

+0

是啊,我結束了與每個訪問者的文件去,因爲我們將允許人們在其上運行的用戶過濾器和刪除某些遊客 –

2

是蒙戈此

號最好的解決方案有許多原因,但最大的一個是文件的大小。

過了一段時間,該文檔可能會增長到接近16MB的限制。這意味着將其從磁盤加載到工作集中不僅耗時,而且效率低下。

對於每位訪問者而言,如果您實際使用了一份文檔,您會做得更好。

如果您希望文檔的加載速度更快,您實際上希望它們更小,磁盤讀取更小,而IO更小,反過來又更少使用資源。由於我懷疑你會希望所有的訪問者(這將被加載一個單一的文件設置),那麼你也將有數據填充RAM,你不需要。

存儲爲你現在需要用很少的IO的開銷,這樣我擔保你所採取的替代,你可以有選擇地加載用戶:

是啊,我結束了爲每個訪問者的文檔會我們將允許人們在其上運行的用戶過濾器和刪除某些遊客

+0

感謝這種見解,似乎工作得很好 –