我正在开发一个社交网站,用户可以在其中发布状态、分享/喜欢/评论其他人的帖子以及其他功能。我正在使用 mongodb + nodejs,我遇到了是否嵌入或引用用于存储这些数据的文档的问题。
我有一个名为“事件”的集合,它存储用户执行的所有事件,例如分享/发布/喜欢/评论,其中包含一个“类型”字段,该字段指定用户执行的事件类型。如果我执行“评论”操作,我应该如何存储该信息?我希望评论帖子的用户也可以将该帖子分享给他/她的 friend ,以便他们可以同时看到评论和帖子。我应该复制用户共享的相同内容并将其嵌入到一个类型为“共享”的新文档中,还是应该只存储对该内容的引用?
示意性地,我应该怎么做:
嵌入:
var activity = new Schema({
type:String // specifies the type of activity
content: [{
// the object that user share/like/comments on.
}]
});
或
2.引用:
var activity = new Schema({
type:String // in this case would be "share",
content_id: Schema.Types.ObjectId // the id of the thing I share.
});
使用嵌入方法,嵌入的“评论”内容将不包含最新评论,因为它是原始评论的副本,并且共享后的任何新评论都会更新。
使用引用方法,如果没有乱七八糟的回调,我很难检索这些结果(因为引用的某些对象也引用其他对象,例如帖子将引用评论)。
在我的情况下,最佳做法应该是什么?
最佳答案
杰里米,
您可能需要回答以下几个问题,以便更好地了解您将来可能最终如何使用这些数据。解决其中一些问题还将引导您进入模式设计的特定方向:
用户的事件类型是否有限制?即这里的主要目的是确定一个非常活跃的用户是否会达到 16MB 的文档大小限制。如果是这样,嵌入一系列事件可能无济于事。
这些记录(事件数组)将来会被索引/查询吗?即这里的目的是通过导致重定位和索引更新的文档大小的变化来识别缓慢/大量更新(添加新事件)。随着用户的事件数组大小的增长,性能会逐渐受到影响,因为它需要维护索引条目的数量。
从用户的角度来看,这些事件的使用情况如何,这些事件是同时查看的,还是分页的。如果分页,可能会复制主文档中最近的“N”个事件条目的事件,其他事件则单独存储。
我还建议查看在 http://docs.mongodb.org/ecosystem/use-cases/storing-comments/ 中定义的评论用例.
希望这能帮助您做出对您长期有益的决定。
关于facebook - 具有共享/喜欢/评论功能的社交网站的 mongodb 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20943149/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我有一个rubyonrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token
我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use