我想知道什么是用户/通知类场景的最佳方案,如下所示:
- 你有多个用户.
- 您有多个通知,可能针对单个用户、某些用户或所有用户.
- 您需要在存储器中输入一个通知"读取"条目,以了解用户是否已读取通知.
选项一
嵌入式通知方案
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]
});
赞成的意见:
- 由于呼叫用户,显示数据非常容易.find()将通知显示为数组对象.
欺骗:
- 当 for each 用户创建通知时,需要执行以下操作.推送到每个嵌入式通知
- 每个用户都有多个通知条目(数据库中有多个数据)
- 巨大的嵌入式文档(我读到了一些关于4MB限制的内容)
- 因为它是一个嵌入式文档-(mongoose DocumentArray),所以不能搜索或跳过.每次访问用户时都会加载每个通知.
Select 二
填充(类似于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个Collection ,而不是1/选项一(选项一只有一个Collection )
- 每次访问集合时都有3个查询.
问题
- 你认为这两个方案中最好的是什么?
- 我是否遗漏了一些或一些基本的NoSQL知识?
- 有人能提出更好的方案吗?
提前谢谢你,我很抱歉发了这么长的帖子,但我想我不能再简单地解释了.