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

时间:2011-03-29 19:46:41

标签: sql mongodb rdbms nosql

我们在SQL2005中有这些表:

  • 相册:视频专辑详情(类别,标题,标签,日期,作者, 喜欢,观点等
  • 标签:专辑标签&按字母顺序排序(查找所有相册,包括 特别标签)
  • 评分:存储评分相册的用户的ID(以防止 重复评级)
  • 评论:存储相册中的所有评论
  • comment_ratings :用户的ID评分为评论(以防止重复 等级)
  • comment_replies :对包含日期和海报的评论的所有回复 信息
  • comment_reply_ratings :评分回复的用户的ID(以防止 重复评级)

可以在MongoDB中创建这种类型的结构 以下操作/查询具有相同/更好的性能?

1)获得十大最受欢迎的专辑(标题,缩略图,视图,喜欢, 作者&日期)与分页。     如果用户点击下一个,请获取下一个最喜欢的10张专辑&等等

2)通过分页获得前10个查看次数最多的专辑。

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

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

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

6)获取特定专辑的详细信息&只显示前10条评论 分页。     接下来将加载接下来的10条评论等等。

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

8)按关键字搜索会搜索相册的标题或标签字段。

9)当有人点击某个标签时,请获取包含该标签的所有相册的列表

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

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

12)可以对文档进行新条目的顺序 对照

感谢阅读。上帝保佑。

2 个答案:

答案 0 :(得分: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语言?

答案 1 :(得分:4)

我看到这些问题在网络上突然出现。您会发现最常见的答案是为每个作业使用正确的“工具”,因此Mongo和标准RDBMS都不会比其他数据库更适合每个应用程序,但我认为您应该投入一些时间。学习这个新的“工具”,因为它可以让你更好地了解什么更适合你的思维方式和编程风格。

我最近也在使用SQL数据库多年后开始使用MongoDB,我可以告诉你值得体验。您可以使用Mongo完成所有事情,绝对是您在列表中描述的所有内容,但请准备在此过程中进行一些权衡。我不知道你在用什么语言。我使用PHP,我认为MongoDB比任何SQL数据库都更适合PHP,因为它以JSON格式组织数据,这对PHP(数组,类等)树状结构更“自然”,允许几乎将整个数组或其中的一部分转储到数据库,而不必进行大量的“映射”,并在需要时将其取回。此外,无shema设计可以让您在如何组织(或不组织:)数据方面获得更多灵活性。此外,如果您想开发一个大型应用程序,MongoDB将比大多数SQL DB更容易扩展。

但对于更加“严格”的应用程序,数据“一致性”和“持久性”更重要,我可能会选择一种老式的RDMBS数据库,例如PostgreSQL。  事实上,如果必须的话,没有什么能阻止你在同一个项目中使用这两个工具。  希望这有帮助!