用户评级架构 - 键/值数据库

2024-04-05

我们正在使用 MongoDB,我正在研究一个用于存储评级的模式。

  • 评级的值为 1-5。
  • 我想存储其他值,例如fromUser

这很好,但我的主要问题是对其进行设置,以便重新计算平均值尽可能有效。


解决方案 1 - 单独的额定值等级

第一个想法是创建一个单独的Ratings类并存储指向的指针数组Ratings in the User班级。我第二次猜测的原因是我们必须查询所有Ratings每次新对象Rating进来以便我们可以计算平均值

...

解决方案 2 - 用户类中的字典

第二个想法是将字典存储在User直接存储这些的类Ratings对象。这比解决方案 1 稍微轻一些,但我们会重写整个解决方案Ratings每次我们更新时每个用户的历史记录。这看起来很危险。

...

解决方案 3 - 在用户类别中具有单独平均值的单独评级类别

我们拥有的混合选项Ratings在他们自己的类中,以及指向它们的指针数组,但是,我们在用户类中保留两个值 -ratingsAve and ratingsCount。这样,当设置新的评级时,我们保存该对象,但我们可以重新计算ratingsAve easily.


解决方案 3 对我来说听起来最好,但我只是想知道我们是否需要通过重新查询评级历史记录来重置定期校准ratingsAve只是为了确保一切顺利。

我可能想得太多了,但我不太擅长创建数据库模式,这似乎是一个我应该知道如何实现的标准模式问题。

哪个是确保一致性和重新计算效率的最佳选择?


首先,“用户类中的字典”不是一个好主意。为什么?添加额外的速率对象需要将新项目推送到数组中,这意味着旧项目将被删除,这种插入称为“移动文档”。移动文档的速度很慢,而且 MongoDB 不太擅长重用空白空间,因此频繁移动文档可能会导致大量空数据文件(《MongoDB 权威指南》一书中的一些文字)。

那么正确的解决方案是什么:假设您有一个名为博客的集合,并且想要为您的博客文章实现评级解决方案,并另外跟踪每个基于用户的评级操作。

博客文档的架构如下:

{
   _id : ....,
   title: ....,
   ....
   rateCount : 0,
   rateValue : 0,
   rateAverage: 0
}

您需要具有此文档架构的另一个集合(费率):

{
    _id: ....,
    userId: ....,
    postId:....,
    value: ..., //1 to 5
    date:....   
}

你需要为它定义一个合适的索引:

db.Rates.ensureIndex({userId : 1, postId : 1})// very useful. it will result in a much faster search operation in case you want to check if a user has rated the post previously

当用户想要评分时,首先需要检查用户是否对帖子进行了评分。假设用户是'user1',那么查询将是

var ratedBefore = db.Rates.find({userId : 'user1', postId : 'post1'}).count()

并基于ratedBefore, if !ratedBefore然后将新的评分文档插入到评分集合中并更新博客状态,否则用户不允许评分

if(!ratedBefore)
{
    var postId = 'post1'; // this id sould be passed before by client driver
    var userId = 'user1'; // this id sould be passed before by client driver
    var rateValue = 1; // to 5
    var rate = 
    {       
       userId: userId,
       postId: postId,
       value: rateValue,
       date:new Date()  
    };

    db.Rates.insert(rate);
    db.Blog.update({"_id" : postId}, {$inc : {'rateCount' : 1, 'rateValue' : rateValue}});
}

那么会发生什么rateAverage? 我强烈建议根据rateCount and rateValue在客户端,很容易更新rateAverage with mongoquery,但你不应该这样做。为什么?简单的答案是:对于客户来说,处理此类工作是一件非常容易的工作,并且对每个博客文档进行平均需要进行不必要的更新操作。

平均查询将计算为:

var blog = db.Blog.findOne({"_id" : "post1"});
var avg = blog.rateValue / blog.rateCount;
print(avg);

通过这种方法,您将获得 mongodb 的最大性能,并且您可以根据用户、帖子和日期跟踪每个费率。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用户评级架构 - 键/值数据库 的相关文章

随机推荐

  • 如何围绕未正确发布的值演示竞争条件?

    我正在阅读 Java 并发实践 并查看第 51 页的示例代码 根据该书 这段代码如果没有正确发布 就有失败的风险 因为我喜欢编写示例代码并分解它们以证明它们是如何工作的 我尝试让它抛出 AssertionError 但失败了 引导我走向我的
  • Prolog,如何在 write() 中显示多个输出

    go match Mn Fn write Matching Result nl write Mn write match with write Fn match Mn1 Fn1 person may female 25 blue perso
  • 如何在java中打开所有以特定前缀开头的文件?

    有没有办法在Java中打开以特定名称开头的目录中的某些文本文件 例如 在我的目录中 我有以下文件 Ab 01 txt Ab 02 txt Ab 03 txt Ab 04 txt SomethingElse txt NotRelated tx
  • 学说问题(映射不一致)

    我正忙于 Symfony 中的一个项目 我只是检查分析器选项卡并看到 2 个错误不断弹出 它们如下 The mappings MyBundle MainBundle Entity School provinceId and MyBundle
  • 在 netbeans 中创建/访问库

    我是新的 netbeans 用户 在导入用户创建的库时遇到问题 我创建了一个名为 MyLibrary 的库 然后 我将一个包含我保存的项目 名为 netbeansProjects 的文件夹添加到类路径中 该文件夹是我在 netbeans I
  • mysql_connect 在远程主机连接上返回“无法通过套接字连接到本地 MySQL 服务器”?

    我有一台服务器返回一个意外的间歇性错误 想知道是否有人以前经历过它或者可以猜测可能会发生什么 到目前为止我的搜索还没有结果 我以通常的方式使用 mysql connect 连接到远程 mysql 服务器 但在过去 2 周 每天几次 与数据库
  • 我应该何时以及如何使用枚举类而不是枚举?

    一位开发人员最近开始在通常适合枚举的地方使用类模式而不是枚举 相反 他使用类似于下面的内容 internal class Suit public static readonly Suit Hearts new Suit public sta
  • 如何为 keras lstm 输入重塑数据?

    我是 Keras 新手 我发现很难理解 LSTM 层输入数据的形状 Keras 文档表示输入数据应该是形状为 nb samples timesteps input dim 的 3D 张量 我有808信号 每个信号有22个通道和2000个数据
  • 是否有可能调用 WriteFile 并且应用程序将永远等待回调?

    我调用该方法win32 WriteFile然后我打电话 WaitForSingleObject handle INFINITE 与我在中使用的相同手柄WriteFile call 是否可以有某种场景让我永远等待 然后WriteFile不会完
  • 带 url-loader 的 Webpack 内联字体

    我正在尝试将一些字体内联为 base64 编码的数据 URI 但我对 Webpack 的 url loader 没有什么运气 这很奇怪 因为 url loader 似乎只是为我的图像和 svg 文件执行此操作 我的设置如下 目录结构 roo
  • IO monad 的逻辑 AND 严格性

    我正在尝试用 Haskell 编写一个简单的程序 它基本上应该并行运行两个 shell 命令 这是代码 import System Cmd import System Exit import Control Monad exitCodeTo
  • 如何在 C# 应用程序中使用代理

    我正在使用 Microsoft Visual Studio 2010 C net 4 0 我有一个网络浏览器元素 我想做的是使用代理通过 Webbrowser 元素进行导航 我怎样才能做到这一点 谢谢 浏览器控件只是 IE 的一个实例 它将
  • 刷新页面会导致 404 错误 - Angular 6

    我正在构建一个应用程序的帮助Angular6并面临路由问题 一切routes当我单击特定选项卡时正在工作 但每当我refresh当前页面 它正在抛出404错误 我在堆栈溢出上看到了很多关于这个问题的帖子 但未能克服这个问题 下面是我的 ap
  • Regionprops 与 PodczeckShapes/DIPimage 圆度问题 - Matlab

    有人可以解释一下为什么Matlab中的 圆度 是通过 4 Area pi 周长 2 计算的 而在Podczeck Shape中它是Area Pi 4 sp 2 https qiftp tudelft nl dipref FeatureSha
  • 我应该默认推荐密封等级吗?

    在我工作的一个大项目中 我正在考虑建议其他程序员如果没有考虑如何对他们的类进行子类化 则始终密封他们的类 很多时候 经验不足的程序员从来不会考虑这一点 我觉得奇怪的是 在 Java 和 C 中 类默认是非密封 非最终的 我认为将类密封可以大
  • 登录后直接从 Websecurity 获取 CurrentUserID (C#/ASP.NET)

    我有这个网站 C ASP NET 其中有一个表单 用户可以在其中注册帐户 这是 VS11 的默认模板 填写完所有内容并且用户单击注册后 它会创建帐户并登录在用户中 效果很好 在此步骤之后 我想获取他分配的 UserID 但它不起作用 我在那
  • 如何为 git 正确设置 credential-osxkeychain

    我已按照以下说明进行操作如何设置git https help github com articles set up git将 OS X 钥匙串集成到 git 命令中 说明说密码提示应该再次出现 并且钥匙串访问窗口将会出现 密码提示出现 但钥
  • 即时加载 jQuery

    我无法弄清楚我的代码有什么问题 如果页面上不存在 jQuery 我会尝试动态加载它
  • spring hibernate异步任务问题未找到当前线程的会话

    这是我保存数据的方法 工作正常 public Future
  • 用户评级架构 - 键/值数据库

    我们正在使用 MongoDB 我正在研究一个用于存储评级的模式 评级的值为 1 5 我想存储其他值 例如fromUser 这很好 但我的主要问题是对其进行设置 以便重新计算平均值尽可能有效 解决方案 1 单独的额定值等级 第一个想法是创建一