在哪里存储对其他数据模型的引用(在 mongoDB 中)以获得最佳性能

Where to store a reference to other data models (in mongoDB) for best performance

在我的项目中,我有用户和圈子。圈子可以有多个用户,一个用户可以在多个圈子中。最后是事件。每个事件在一个圈子中可以有多个用户。之后,事件会获取很多内容,因此会加载很多东西(图片、评论等)。

我认为这些将是一个很好的数据模型:

User =  {
        _id: "uuid",
        name: "string",
        password: "string",
        circles: [Circle._id],
}

Event = {
    _id: "uuid",
    name: "string",
    location: "string",
    circles:Circle._id,
    participants: [User._id],
}

Circle = {
    _id: "uuid",
    name: "string"
}

用户登录后,he/she选择他的圈子之一,将显示该圈子中的用户和事件。

使用这些数据模型(我认为)的 API 意味着从一个圈子中获取用户和事件,数据库必须搜索所有用户和事件并检查他们是否在该圈子中.有很多用户和事件,我认为这可能不是最有效的方法?

所以我想像这样将用户和事件放入圆的数组中:

User =  {
      _id: "uuid",
      name: "string",
      password: "string",
}

Event = {
     _id: "uuid",
     name: "string",
     location: "string",
     participants: [User._id],
}

Circle = {
     _id: "uuid",
     name: "string",
     users:[User._id],
     events:[Event._id]
}

现在,当用户选择圆圈时,圆圈加载速度较慢,因为必须先加载用户和事件。但我在想,现在搜索用户和事件会更快。这是正确的 approach/thinking 吗?在用户和事件数据模型中保留对特定圈子 ID 的引用是否有意义?

如果您想充分利用 mongoDb,我强烈建议您对数据进行反规范化处理。

如果您规范化数据,则可能必须使用 $lookup 来合并多个集合。即使你在硬盘上存钱,你最终也会有相对较重的计算。

假设应用程序通常有 90% 的读取命中和 10% 的写入命中,以读取友好的方式对数据建模是有意义的。因此,高度非规范化您的数据,直到确实有必要创建对其他集合的引用。稍后可以通过索引和缓存实现优化,但请考虑以下场景。

User =  {
        _id: "uuid",
        name: "string",
        password: "string",
        circles: ["circle1","circle2"],
        events : ["event1","event2"]
}

Event = {
     _id: "uuid",
     name: "string",
     location: "string"
}

Circle = {
     _id: "uuid",
     name: "string"
}

尝试事先了解您的查询,将大部分数据存档在 User 集合中。 circlesevents 字段在 User 集合中也可以是一个对象数组 [{},{}] 如果要存储更多的属性。

我敢肯定,你收集的集合越多,你的查询就会越复杂,计算量也会越大。

我不建议将 userId 存储在 circleevent 集合中,因为用户可能会随着时间的推移而增长,并且您不希望最终得到一个包含一个文档的文档的集合,其中一个字段存储了数千个数组元素.相反,一个用户可以成为 100 多个圈子和事件的一部分,如果我们将这些数据存储在 User 集合中,查询和管理就会变得非常容易。

长话短说:不要将 nosql 数据库视为关系数据库。它永远不会适应。为您的数据库建模,牢记您未来的查询。高度非规范化您的数据以使您的阅读更简单,即避免引用。