我的应用程序是关于大学搜索的,会有两种用户,一种是搜索大学的最终用户,另一种是大学所有者。
我正在为这两种类型的用户维护一个共同的"用户"集合。它的架构如下所示
{
_id : ObjectId(),
display_name: String,
email: String,
password_hash: String,
type :Number
}
现在,此应用程序的管理员想要向用户推送通知,此通知可能针对所有用户或特定用户或大学所有者或一组用户。
通知文档由以下三部分组成,
{
_id : ObjectId(),
notification_message: String,
date: Date
}
现在我想做的是点击一个 api,它为我提供了特定用户的所有通知,以及每个通知的标志字段,该字段表示通知是已读还是未读。
现在,我的数据库设计应该如何?
我想到了两个选择,
- 我想维护一个通知
集合并为通知的每个预期用户重复通知文档,我还会在此文档中维护一个字段为"标记为已读",文档将如下所示
{ _id : ObjectId(), notification_message: String, date: Date, to_user_id : ObjectId(), mark_as_read: Boolean }
优点:查询特定用户的通知会更快
缺点:对于每个通知,"通知"收集将增加 当我在重复相同的通知时,我非常积极地重复相同的通知 通知针对其通知的多个用户的通知集合 是有意的。
2.我想维护一个通知集合,对于每个通知文档,我维护该通知的用户数组和已阅读此通知的用户数组
优点:通知集合大小可能更小
缺点: 通知文档可能会达到 16 MB 的最大大小
这只是我能想到的两件事,还有其他更好的方法吗?您的帮助将不胜感激。
这个怎么样?
{
sender: Object, // user object
receiver: [ String ] //array of user _ids
message: String, // any description of the notification message
read_by: [{ readerId: String, read_at: Date }],
created_at: Date,
}