khe*_*eya 4 sql rdbms mongodb nosql
我们在SQL2005中有这些表:
可以在MongoDB中创建这种类型的结构,从而允许以下操作/查询具有相同/更好的性能吗?
1)通过分页获得前10个最喜欢的专辑(标题,缩略图,视图,喜欢,作者和日期).如果用户点击下一个,则获取下一个10个最喜欢的专辑等
2)通过分页获得前10个最受欢迎的专辑.
3)通过分页获得前10个讨论最多的专辑.
4)获取最近创建的专辑列表,其中包含分页但最多100张专辑
5)获取给定用户的所有专辑(标题,缩略图,视图,喜欢,作者和日期)
6)获取特定专辑的详细信息,并通过分页显示前10条评论.接下来将加载下一个10条评论,依此类推.
7)获取相关专辑列表.关系将通过专辑标签或专辑标题完成
8)按关键字搜索将搜索专辑的标题或标签字段.
9)当有人点击标签时,获取具有该标签的所有相册的列表
10)当有人点击类别链接时,获取10个类别专辑的列表
11)按评级,日期等方式获取评论
12)可以控制对文档进行新条目的顺序吗?
谢谢阅读.上帝保佑.
我建议遵循以下结构:
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语言?