代码之家  ›  专栏  ›  技术社区  ›  Tom

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

  •  0
  • Tom  · 技术社区  · 7 年前

    我在想这些会是一个很好的数据模型:

    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"
    }
    

    用户登录后,他/她选择一个圆圈,将显示该圆圈中的用户和事件。

    有这些数据模型的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]
    }
    

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

    0 回复  |  直到 7 年前
        1
  •  1
  •   HIRA THAKUR    7 年前

    如果您想充分利用mongoDb,我强烈建议您取消数据规范化。

    如果规范化数据,则可能需要使用$lookup来组合多个集合。即使你把钱存到硬盘上,你也会得到相对较重的计算量。

    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 收藏。 circles 和 events 用户 集合也可以是对象数组 [{},{}] 如果要存储更多属性。

    我敢肯定,你加入的集合越多,查询就越复杂,计算也就越多。

    我不建议将用户id存储在 circle 或 event 用户 集合,查询和管理变得非常容易。

    推荐文章