2011-03-29 56 views
4

切換我們在這些表中SQL2005:從MongoDB的專家/開發者需要的建議之前從RDBMS

  • 專輯:視頻專輯的詳細信息(類別,標題,標籤,日期,作者, 喜歡,意見等
  • 標籤:專輯標籤&字母順序(找到的所有專輯W/A 特定標籤)
  • 評級:商店誰額定專輯用戶的ID(以防止 重複等級)
  • 評論:存儲在專輯中的所有意見
  • comment_ratings:用戶的ID額定評論(防止重複 評級)
  • comment_replies:所有的答覆的日期和海報 信息評論
  • comment_reply_ratings:誰評爲用戶的ID回覆(防止 重複等級)

來說,這種結構的MongoDB中創建允許與平等/更好的性能 以下操作/查詢?

1)使用分頁獲得前10名最喜歡的專輯(標題,縮略圖,視圖,贊, 作者&日期)。 如果用戶點擊下一個,獲取下10個最喜歡的專輯&等等

2)使用分頁獲得排名前10的最多觀看相冊。

3)通過分頁獲得排名前10位的討論最多的專輯。

4)獲得最近創建的相冊列表分頁,但高達100張 專輯

5)由給定用戶(標題,縮略圖視圖,喜歡, 作者&日期)

獲取的所有專輯

6)獲取具體相冊的詳細信息&只顯示排名前10位的評論,其中包含 分頁。 接下來會加載下10條評論等。

7)獲取相關相冊列表。關係將通過專輯標籤或 專輯標題

8)按關鍵字搜索將搜索專輯的標題或標記字段。

9)當用戶點擊一個標籤,獲得與標籤

10)當有人點擊一個類別鏈接所有專輯的列表中,得到10類列表 專輯

11)獲得評論按照評級,日期等排序

12)可以控制文檔的新條目的順序爲 ?

感謝您的閱讀。上帝保佑。

+1

我已經從不同的rdbms移動了兩個應用程序(第一個約100個sql表,第二個約60個)。這兩個應用程序使用mongodb快速工作。因此,將項目移動到mongodb是一個很好的解決方案(至少在項目之上,因爲對於使用sql仍然至關重要的項目)。 – 2011-03-29 22:19:52

+0

Bugai,我無法告訴你我多麼感激你的回覆。非常感謝你。 – kheya 2011-03-29 23:42:44

回答

9

我建議以下結構:

Album { 
    Id, 
    UserId, 
    Title, 
    Category, 
    Tags (list of tag names for fast access and for searching), 
    Ratings (user ids, use $addToSet), 
    Likes (user ids, use $addToSet), 
    ViewsCount, (probably just integer value,) 
    RatingsCount (use $inc to increment this field once someone vote for album), 
    CommentsCount (use $inc everytime when someone post comment), 
    LikesCount (use $inc everytime when someone click 'Like it') 
} 

Comment { 
    Id, 
    AlbumId, 
    Text, 
    CreatedDate, 
    Ratings, 
    RatingsCount, 
    Replies { (collection of comment replies) 
     Text, 
     CreatedDate, 
     Ratings, 
     RatingsCount 
    } 
} 

Tag { 
    Id, 
    TagName, 
    AlbumsCount (use $inc: 1 when new album created with this tag 
       and $inc:-1 - once deleted) 
} 

我搬到評論到單獨的集合(而不是將它嵌入到專輯),因爲現在在MongoDB中難以更新與嵌套一個以上級文件。

現在查詢:

1)獲得10最喜歡的專輯(標題,縮略圖視圖,喜歡,筆者&日期)與尋呼頂部。如果用戶點擊下一個,下一個獲得10個最喜歡的專輯&等

db.albums.find().skip(0).limit(10).sort({ RatingsCount: -1 }); 

2)與尋呼獲取10個最觀看的相冊。

db.albums.find().skip(0).limit(10).sort({ ViewsCount: -1 }); 

3)通過分頁獲得排名前10位的討論最多的專輯。

db.albums.find().skip(0).limit(10).sort({ CommentsCount: -1 }); 

4)獲得最近創建的相冊列表分頁,但高達100張專輯

db.albums.find().skip(0).limit(100).sort({ CreatedDate: -1 }); 

5)由給定用戶(標題,縮略圖視圖,喜歡,筆者&日獲取的所有專輯)

db.albums.find({UserId: someUserId}) 

6)獲取特定相冊&的詳細信息只顯示分頁十大意見。接下來會加載下10條評論等。

album = db.albums.find({_id: someAlbumId}); 
comments = db.comments.find({AlbumId: someAlbumId }).skip(0) 
       .limit(10).sort({ RatingsCount: -1 ,CreateDate: -1 }); 

7)獲取相關相冊列表。關係將通過專輯標籤或專輯名稱進行

請澄清

8)通過關鍵字搜索將搜索專輯的標題或標籤字段。

db.albums.find({ $or : [ { Title : searchKey } , { Tags : searchKey } ] }) 

注:可能需要存儲標籤兩次:在較低的情況下,用於搜索,並且是用於顯示

9)當用戶點擊一個標籤,獲得與該標籤的所有專輯列表

db.albums.find({Tags : { $in: [tagName1, tagName2]}} ] }) 

注:oprator使用$您可以通過多個標記名稱進行搜索。

10)當有人點擊一個類別鏈接,獲得的10類專輯

db.albums.find({Category: val }).skip(0).limit(10).sort({ CreatedDate: -1 }); 

11)獲取收視率排序評論列表,日期等

db.comments.skip(0).limit(10).sort({ RatingsCount: -1 }); 

12)的順序在哪些新的條目對文件進行控制?

請澄清

我想,現在你看,你可以將你的關係數據庫MongoDB的,相信你的應用程序將是驚人的快與MongoDB的以上模式)。

希望得到這個幫助。

P.S:如果sql 2005比我想你使用一些.net語言?

+0

你推薦哪種c#驅動程序?我在MongoDB網站上列出了一個,並在此處列出了另一個:http://github.com/samus/mongodb-csharp/downloads – kheya 2011-03-30 00:08:30

+0

如果您有首選的C#驅動程序,請告訴我。否則,我會去https://github.com/samus/mongodb-csharp – kheya 2011-03-30 00:18:48

+0

@Projapati:我建議你使用官方的mongodb c#驅動程序(https://github.com/mongodb/mongo-csharp-driver/downloads) 。它由10gen支持。 – 2011-03-30 07:16:44

4

我看到了網絡上出現的這類問題。您會發現最常見的答案是爲每項工作使用正確的「工具」,因此Mongo和標準RDBMS都不會比其他數據庫更適合每個應用程序,但對我而言,您肯定應該投入一些時間學習這個新的「工具」,因爲它會讓你更好地瞭解什麼更適合你的思維和編程風格。

我也在最近開始使用MongoDB多年後使用SQL數據庫,我可以告訴你這是值得的經驗。你可以用Mongo做所有事情,絕對是你在列表中描述的一切,但是要準備在這個過程中做一些權衡。我不知道你在用什麼語言。我使用PHP,我認爲MongoDB適合PHP比任何SQL數據庫都要好得多,因爲它以JSON格式組織數據,這對PHP(數組,類等)樹狀結構更「自然」可以將整個數組或其中的一部分轉儲到數據庫,而無需執行大量「映射」並在需要時將其返回。此外,無須設計的設計可以讓您更靈活地組織(或不組織):)數據。另外,如果您想開發一個大型應用程序,MongoDB比大多數SQL DB更容易擴展。

但是對於更「嚴格」的應用程序,其中數據「一致性」和「持久性」更重要,我可能會選擇其中一個老式的RDMBS數據庫,例如PostgreSQL。 事實上,如果你必須在同一個項目中使用這兩種工具,沒有什麼能阻止你。 希望這有助於!

+0

是不是數據一致性是所有網絡應用程序必須的?我知道這對於某些應用程序(例如銀行業務系統)來說至關重要,但總的來說,這對於像這樣的網站也很重要。只要我可以用NoSQL類型數據庫進行上述查詢,我​​很樂意移動到新的區域。我奉獻了一些時間去做一些好事。我準備好了一些權衡。謝謝你的發帖。 – kheya 2011-03-29 23:52:40

+1

並不完全,因爲Mongo是爲縮放環境而設計的,他們確實提供了所謂的「最終」數據一致性,這意味着您的數據將在每個節點上最終更新,而這對大多數Web應用程序來說都很好。例如,如果您在博客上創建帖子,它應該會「最終」出現在您的瀏覽器上,您可以在按下發布按鈕之後2-5秒而不是「即時」!他們也支持「原子」操作以及FSYNC,它允許您在更新一定數量的副本之後獲得響應,這是足夠好的一致性。 – techexpert 2011-03-30 02:20:54

+1

實際上,Mongo速度非常快,這個延遲通常比2秒小很多,更像是幾毫秒,但這是我所談論的一點小小的折衷,但使用Mongo的好處可以超過缺點目前爲止有很多應用。 – techexpert 2011-03-30 02:32:41