2012-01-24 30 views
0

我正在構建一個需要可擴展的Web應用程序。簡而言之:組合mysql mongodb

我們得到了用戶,用戶有朋友,所以他們得到了一個好友列表。用戶可以創建消息,並且朋友的消息顯示在主頁上,每條消息都鏈接到一個位置,這些消息可以按日期過濾,例如,我想顯示昨天發佈的來自朋友的所有消息,或者向我顯示來自位置X的所有消息。

我正在MongoDb中完全構建應用程序,但是我正在陷入困境。例如:

  • 在炫魅,我們得到了用戶的朋友的郵件列表,沒有問題,我們使用:

$ DB->消息 - >找到(陣列(」 users._id'=> array('$ in'=> $ userFriendListGoesHere)));

所以後來我們得到了我們的消息,但是在那之後,每封郵件都有一個位置,所以我必須通過所有的消息,使一個循環,並從另一個收集得到的位置,也多個用戶可以綁定到一個消息,所以我們還必須從另一個集合中獲取所有用戶數據,在MySql中只需一個連接查詢,在MongoDb 2循環中,這是我的第一個問題:這是一個問題嗎?這是否需要大量資源,循環?

所以我的想法是與MySql和MongoDb分離,我使用MongoDb來存儲所有位置(因爲它超過了350.000+個位置並使用lat長計算)和MySql的消息,用戶和用戶的朋友,所以第二個問題,你能幫我做出決定嗎,我應該繼續使用MongoDb嗎?或者使用組合?

感謝您的閱讀和您的時間。

回答

2

..在MySql中只是一個連接查詢,在MongoDb 2個循環中,這是我的第一個問題:這是一個問題嗎?

這是MongoDB的課程,事實上,這是一個核心的MongoDB折衷。

MongoDB基於連接不能縮放的規則。所以它沒有連接,讓你「滾動你自己」。一些類似Morphia的庫(,用於Java)提供用於加載引用的內置邏輯。

PHP有Doctrine project,這應該有所幫助。

這是否需要很多資源,循環?

那種?這將取決於實施。

這顯然會涉及一堆來回與數據庫,但它可能比SQL版本的網絡流量少。您將需要內存空間來存儲所有返回的數據。但是,這又和SQL沒有太大的區別。

真的,這取決於您如何實施這些權衡以及誰在記憶中保留內容的所有權衡。

+0

在SQL中,您進行一個查詢,並輸出N個結果。通過這種設置,您可以進行一次查詢,獲得N個結果,並使另外的RPC查找額外的數據。這幾乎可以肯定是延遲/流量衝擊與在SQL本地執行衝擊相比,通過額外往返數量。也就是說,這些查找中的每一個都應該相對便宜,並且無論如何都要將數據流式傳輸回去(例如,顯示第一個N,然後在滾動時執行AJAX請求以獲取下一個N等等),這當然是可行的。 。)這可能會抵消它。 – James

+0

如果我加入4個表,服務器必須做4個索引查找+數據查找+一堆內存中的''循環。如果你在Mongo中這樣做,你仍然可以做4個索引查找+數據查找+ for循環。由於重複(在連接中固有),SQL響應通常需要更多的數據。 Mongo需要更多的查詢。謎題中最慢的部分是驅動器,但這些看起來差不多,所以這成爲4個小查詢與1個大查詢或延遲與吞吐量的問題。我真的不確定哪個更好,延遲或吞吐量。 –

0

我應該繼續使用MongoDB的與循環

MongoDB是一個偉大的想法,當你的數據是不固有關係。

在你提供的例子中,它看起來好像你的數據是關係型的。 MySQL和其他關係數據庫(如Postgres)比MongoDB的關係數據庫更好。這個blog post更詳細地介紹了這個話題。

總之,我提出以下建議:

  1. 請花一些時間來分析你的數據是否具有內在的關係或沒有。
  2. 如果不是,那麼MongoDB可以給你使用MySQL的好處。
  3. 如果是關係型,那麼MySQL是更好的解決方案。
  4. 使用兩者當然是可能的 - 但它會爲您創建額外的工作&複雜性。從長遠來看 - 這是值得的努力?只有你會知道答案。

祝您的網絡應用程序好運!