- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在开发一个社交网站,用户可以在其中发布状态、分享/喜欢/评论其他人的帖子以及其他功能。我正在使用 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/
我正在构建一个 RCP 应用程序,其中每个季度都会更新功能/插件。因此,如果用户选择自动更新功能/插件,则会下载更新插件的新 jar,但旧插件仍在使用我不再使用的磁盘空间。 我厌倦了删除包含旧 jar
我如何从外部 Controller 功能中调用 Controller 内部的功能,例如电话间隙回调功能 这是 Controller 外部定义的功能 function onDeviceReady()
如果某个功能(例如 MediaSource)可用,我如何使用 Google Dart 检查。 new MediaSource() 抛出一个错误。如何以编程方式检查此类或功能是否存在?有任何想法吗?是否
我正在尝试运行 Azure Orchestrations,突然我开始从 statusQueryGetUri 收到错误: 协调器函数“UploadDocumentOrchestrator”失败:函数“U
我见过 iPhone 上的应用程序,如果在 3.0 上运行,将使用 3.0 功能/API,例如应用内电子邮件编辑器,如果在 2.x 上运行,则不使用这些功能,并退出应用程序以启动邮件相反。 这是怎么做
这是 DB 规范化理论中的一个概念: Third normal form is violated when a non-key field is a fact about another non-ke
如果我定义 #if SOMETHING #endif 而且我还没有在任何地方定义 SOMETHING。 #if 中的代码会编译吗? 最佳答案 当#if的参数表达式中使用的名称未定义为宏时(在所有其他宏
我刚刚澄清了 A* 路径查找应该如何在两条路径具有相等值的 [情况] 下运行,无论是在计算期间还是在结束时,如果有两条相等的短路径。 例如,我在我的起始节点,我可以扩展到两个可能的节点,但它们都具有相
Java有没有类似下面的东西 宏 一种遍历所有私有(private)字段的方法 类似于 smalltalk symbols 的东西——即用于快速比较静态字符串的东西? 请注意,我正在尝试为 black
这个程序应该将华氏度转换为摄氏度: #include int main() { float fahrenheit, celsius; int max, min, step;
当打开PC缓存功能后, 软件将采用先进先出的原则排队对示波器采集的每一帧数据, 进行帧缓存。 当发现屏幕中有感兴趣的波形掠过时, 鼠标点击软件的(暂停)按钮, 可以选择回看某一帧的波形
我有一个特殊的(虚拟)函数,我想在沙盒环境中使用它: disable.system.call eval(parse(text = 'model.frame("1 ~ 1")'), envir = e
使用新的 Service 实现,我是否必须为我的所有服务提供一个 Options 方法? 使用我的所有服务当前使用的旧 ServiceBase 方法,OPTIONS 返回 OK,但没有 Access-
我正在阅读 Fogus 的关于 Clojure 的喜悦的书,在并行编程章节中,我看到了一个函数定义,它肯定想说明一些重要的事情,但我不知道是什么。此外,我看不到这个函数有什么用 - 当我执行时,它什么
我有大量的 C 代码,大部分代码被注释掉和/或 #if 0。当我使用 % 键匹配 if-else 的左括号和右括号时,它也匹配注释掉的代码。 有没有办法或vim插件在匹配括号时不考虑注释掉或#if 0
我有这个功能: map(map(fn x =>[x])) [[],[1],[2,3,4]]; 产生: val it = [[],[[1]],[[2],[3],[4]]] 我不明白这个功能是如何工作的。
我使用 Visual Studio 代码创建了一个函数应用程序,然后发布了它。功能应用程序运行良好。我现在在功能门户中使用代码部署功能(KUDU)并跳过构建。下面是日志 9:55:46 AM
我有一个数据框df: userID Score Task_Alpha Task_Beta Task_Charlie Task_Delta 3108 -8.00 Easy Easy
我真的无法解决这个问题: 我有一个返回数据框的函数。但是,数据框仅打印在我的控制台中,尽管我希望将其存储在工作空间中。我怎样才能做到这一点? 样本数据: n <- 32640 t <- seq(3*p
有没有办法找出所有可能的激活器命令行选项? activator -help仅提供最低限度的可用选项/功能列表,但所有好的东西都隐藏起来,即使在 typesafe 网站在线文档中也不可用。 到目前为止,
我是一名优秀的程序员,十分优秀!