草庐IT

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

coder 2023-10-27 原文

我们在 SQL2005 中有这些表:

  • albums:视频专辑详细信息(类别、标题、标签、日期、作者、 喜欢,观点等
  • tags:专辑标签并按字母顺序排序(查找所有带有 特定标签)
  • ratings:存储评价相册的用户id(防止 重复评级)
  • comments:存储对相册的所有评论
  • comment_ratings:评价评论的用户id(防止重复 评分)
  • comment_replies:对评论的所有回复,包括日期和发布者 信息
  • comment_reply_ratings:对回复进行评分的用户 ID(以防止 重复评级)

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

1) 获取前 10 个最喜欢的专辑(标题、缩略图、观看次数、喜欢次数、 作者和日期)与分页。 如果用户点击下一步,则获取下 10 个最喜欢的专辑等

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

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

4) 获取最近创建的相册列表,分页但最多100个 相册

5) 获取给定用户的所有相册(标题、缩略图、浏览量、喜欢程度、 作者和日期)

6) 获取特定专辑的详细信息并仅显示前 10 条评论 寻呼。 Next 将加载接下来的 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)
}

我已将评论移动到单独的集合中(而不是将其嵌入专辑中),因为目前在 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 条评论。 Next 将加载接下来的 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]}} ] } )

注意:使用 $in 运算符,您可以按多个标签名称进行搜索。

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 语言?

关于sql - 在从 RDBMS 切换之前需要 MongoDB 专家/开发人员的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5478045/

有关sql - 在从 RDBMS 切换之前需要 MongoDB 专家/开发人员的建议的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby-on-rails - Ruby on Rails with Haml - 如何从 erb 切换 - 2

    我正在从erb文件切换到HAML。我将hamlgem添加到我的系统中。我创建了app/views/layouts/application.html.haml文件。我应该只删除application.html.erb文件吗?此外,仍然有/public/index.html文件被呈现为默认页面。我想创建自己的默认index.html.haml页面。我应该把它放在哪里以及如何使系统呈现该文件而不是默认索引文件?谢谢! 最佳答案 是的,您可以删除任何已转换为HAML的View的ERB版本。至于你的另一个问题,删除public/index/h

  3. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  4. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  5. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  6. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

  7. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  8. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  9. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  10. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

随机推荐