我想知道什么是用户/通知类场景的最佳方案,如下所示:

  • 你有多个用户.
  • 您有多个通知,可能针对单个用户、某些用户或所有用户.
  • 您需要在存储器中输入一个通知"读取"条目,以了解用户是否已读取通知.

选项一

嵌入式通知方案

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个查询.

问题

  1. 你认为这两个方案中最好的是什么?
  2. 我是否遗漏了一些或一些基本的NoSQL知识?
  3. 有人能提出更好的方案吗?

提前谢谢你,我很抱歉发了这么长的帖子,但我想我不能再简单地解释了.

推荐答案

选项1看起来可能会导致大量文档的过度增长和移动,这对性能不利,因为您的大多数写入操作都会进入嵌入式文档(通知).

选项2我不完全清楚你的策略——如果你已经在notifications表中按ID引用用户,那么有这3个集合,但也按objectId嵌入一个通知列表似乎是多余的.您可以在Notifications表中索引用户,然后消除Users表中的嵌套array.

(编辑)

三个系列的外观如下:

Users:
   _id: objectid
   username : string
   name: string

Notifications:
   _id:  objectid
   to (indexed):   objectid referencing _id in "users" collection
   read: boolean

Global Notifications:
   _id: objectid
   read_by: [objectid referencing _id in users]

对于针对单个用户的通知,请在针对该用户的通知中插入.对于多个用户, for each 用户插入一个(或者,您可以将"to"字段设置为一个数组,并存储所有收件人的_id,然后维护另一个包含所有已阅读该字段的收件人的列表).要向所有用户发送通知,请插入到全局通知集合中.当用户读取时,将其用户的_id添加到read_by字段.

Mongodb相关问答推荐

GO:如何在MongoDB中区分空字符串和nil

MongoDB:如何通过增量向量递增整数向量

为什么我的Mongoose更新找不到匹配?

在MongoDB集合中按文档内的频率对数组排序

MongoDB 投影按数组中的字符串长度排序

如何在MongoDB中搜索有序子集的方法?

Mongo按最大分组排序

Mongodb,在一个查询中用正则表达式更新部分字符串

MongoDB:通过嵌套数组中的最后一个元素值获取文档

为什么 MongoDB 配置服务器必须只有一个或三个?

使用 MongoDB 进行分页

mongod 和 mongo 命令在 Windows 10 上不起作用

如何知道 MongoDB 集合大小?

Mongodb Atlas:管理员未授权执行命令

使用命令行从 MongoDB 数据库中的所有集合中删除所有索引

MongoTemplate upsert - 从 pojo 进行更新的简单方法(哪个用户已编辑)?

MongoDB 的 MMAPV1、WiredTiger 或 In-Memory StorageEngine 如何 Select ?

用 MongoDB 中的属性表示多对多关系的最佳模型

查找聚合性能差

有没有办法执行更新操作的dry run?