我们在SQL2005中有这些表:
可以在MongoDB中创建这种类型的结构 以下操作/查询具有相同/更好的性能?
1)获得十大最受欢迎的专辑(标题,缩略图,视图,喜欢, 作者&日期)与分页。 如果用户点击下一个,请获取下一个最喜欢的10张专辑&等等
2)通过分页获得前10个查看次数最多的专辑。
3)通过分页获得前10个讨论最多的专辑。
4)获取最近创建的专辑列表,其中包含分页但最多100个 相册
5)获取给定用户的所有专辑(标题,缩略图,视图,喜欢, 作者&日期)
6)获取特定专辑的详细信息&只显示前10条评论 分页。 接下来将加载接下来的10条评论等等。
7)获取相关专辑列表。关系将通过专辑标签或 专辑标题
8)按关键字搜索会搜索相册的标题或标签字段。
9)当有人点击某个标签时,请获取包含该标签的所有相册的列表
10)当有人点击类别链接时,获取10个类别的列表 相册
11)按评级,日期等方式获取评论
12)可以对文档进行新条目的顺序 对照
感谢阅读。上帝保佑。
答案 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。 事实上,如果必须的话,没有什么能阻止你在同一个项目中使用这两个工具。 希望这有帮助!