【发布时间】:2012-04-15 11:17:06
【问题描述】:
我想知道什么是用户/通知类场景的最佳方案,如下所示:
- 您有多个用户。
- 您有多个通知,可能针对单个用户、某些用户或所有用户。
- 您需要存储中的通知“已读”条目,以了解用户是否已阅读通知。
选项一
嵌入式通知方案
Notifications = new Schema ( {
message : String,
date : { type : Date, default: Date.now() }
read : { type: Boolean, default : false }
});
User = new Schema( {
username : String,
name : String,
notifications : [Notifications]
});
优点:
- 显示数据非常容易,因为调用 User.find() 会将通知显示为数组对象。
缺点:
- 为每个用户创建通知时,您需要对每个嵌入的通知执行 .push
- 每个用户的多个通知条目(数据库中的多个数据)
- 巨大的嵌入式文档(我读过一些关于
- 由于它是嵌入式文档 - ( mongoose DocumentArray ),您无法搜索或跳过。每次访问用户时都会加载每个通知。
选项二
填充(类似 DBRef)对象
Notification = new Schema ({
message : String,
date : { type : Date, default : Date.now() }
});
UserNotification = new Schema ({
user : { type : Schema.ObjectId, ref : 'User' },
notification : { type : Schema.ObjectId, ref : 'Notification' },
read : { type : Boolean, default : false }
});
User = new Schema( {
username : String,
name : String,
notifications : [ { type : Schema.ObjectID, ref : 'UserNotification' } ]
});
优点:
- 最适合查询
- 没有重复数据
- 支持大量通知
缺点:
- 您有 3 个收藏,而不是其中的一个(选项一只有一个收藏)
- 您每次访问该集合时都有 3 个查询。
问题
- 您认为这两者中最好的方案是什么?
- 我是否缺少某些东西或某种基本的 NoSQL 知识?
- 谁能提出更好的方案?
提前谢谢你,很抱歉发了这么长的帖子,但我想我不能更简单地解释它。
【问题讨论】:
-
我想知道您是否为每个
User文档考虑了一个notifications嵌入对象。基本上,您根本不需要单独的通知模型......只需在用户上拥有一个对象,并在需要出现通知时更新它。