在从RDBMS切换之前,需要MongoDB专家/开发人员的建议

khe*_*eya 4 sql rdbms mongodb nosql

我们在SQL2005中有这些表:

  • 专辑:视频专辑详情(类别,标题,标签,日期,作者,喜欢,观点等
  • 标签:专辑标签&按字母顺序排序(查找具有特定标签的所有专辑)
  • 评级:存储评级相册的用户的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)可以控制对文档进行新条目的顺序吗?

谢谢阅读.上帝保佑.

And*_*ich 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)
}
Run Code Online (Sandbox Code Playgroud)

我已将评论移到单独的集合中(而不是将其嵌入到专辑中),因为现在mongodb难以更新多于一层嵌套的文档.

现在查询:

1)通过分页获得前10个最喜欢的专辑(标题,缩略图,视图,喜欢,作者和日期).如果用户点击下一个,则获取下一个10个最喜欢的专辑等

db.albums.find().skip(0).limit(10).sort( { RatingsCount: -1 } );
Run Code Online (Sandbox Code Playgroud)

2)通过分页获得前10个最受欢迎的专辑.

db.albums.find().skip(0).limit(10).sort( { ViewsCount: -1 } );
Run Code Online (Sandbox Code Playgroud)

3)通过分页获得前10个讨论最多的专辑.

db.albums.find().skip(0).limit(10).sort( { CommentsCount: -1 } );
Run Code Online (Sandbox Code Playgroud)

4)获取最近创建的专辑列表,其中包含分页但最多100张专辑

db.albums.find().skip(0).limit(100).sort( { CreatedDate: -1 } );
Run Code Online (Sandbox Code Playgroud)

5)获取给定用户的所有专辑(标题,缩略图,视图,喜欢,作者和日期)

db.albums.find({UserId: someUserId})
Run Code Online (Sandbox Code Playgroud)

6)获取特定专辑的详细信息,并通过分页显示前10条评论.接下来将加载下一个10条评论,依此类推.

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

7)获取相关专辑列表.关系将通过专辑标签或专辑标题完成

请澄清

8)按关键字搜索将搜索专辑的标题或标签字段.

db.albums.find( { $or : [ { Title : searchKey } , { Tags : searchKey } ] } )
Run Code Online (Sandbox Code Playgroud)

注意:可能需要存储标记两次:小写用于搜索,用于显示

9)当有人点击标签时,获取具有该标签的所有相册的列表

db.albums.find( {Tags : { $in: [tagName1, tagName2]}} ] } )
Run Code Online (Sandbox Code Playgroud)

注意:在oprator中使用$可以搜索多个标记名称.

10)当有人点击类别链接时,获取10个类别专辑的列表

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

11)按评级,日期等方式获取评论

db.comments.skip(0).limit(10).sort( { RatingsCount: -1 } );
Run Code Online (Sandbox Code Playgroud)

12)可以控制对文档进行新条目的顺序吗?

请澄清

我认为现在您已经看到可以将关系数据库移动到MongoDB,并相信您的应用程序将使用mongodb及以上架构快速实现;).

希望这有帮助.

PS:如果sql 2005比我想你使用一些.net语言?