处理一对多关系MongoDB模式设计

处理一对多关系MongoDB模式设计,mongodb,database-design,Mongodb,Database Design,我目前正在为事件管理系统设计MongoDB模式。ER图如下所示: 这个概念相当简单: 一个公司可以创建一个或多个事件(估计500个公司) 一个客户可以参加多家公司的一个或多个活动(估计每个客户参加x200个活动,也估计每个客户参加X1000个活动) 这是经典的多对多关系,对吗 现在我来自RDBMS背景,所以我构造MongoDB模式的直觉可能是不正确的。但是,我喜欢MongoDB灵活的文档特性,因此我尝试提出以下模型结构: Company model { _id: <CompanyI

我目前正在为事件管理系统设计MongoDB模式。ER图如下所示:

这个概念相当简单:

  • 一个公司可以创建一个或多个事件(估计500个公司)
  • 一个客户可以参加多家公司的一个或多个活动(估计每个客户参加x200个活动,也估计每个客户参加X1000个活动)
  • 这是经典的多对多关系,对吗

    现在我来自RDBMS背景,所以我构造MongoDB模式的直觉可能是不正确的。但是,我喜欢MongoDB灵活的文档特性,因此我尝试提出以下模型结构:

    Company model
    { 
      _id: <CompanyID1>,
      name: "Foo Bar",
      events: [<EventID1>, <EventID2>, ...]
    }
    
    Event model
    { _id: <EventID1>,
      name: "Rockestra",
      location: LocationSchema, // (model below)
      eventDate: "01/01/2019",
      clients: [<ClientID1>, <ClientID2>, ...]
    }
    
    Client model
    { _id: <ClientID1>,
      name: "Joe Borg"
    }
    
    Location model
    { _id: <LocationID1>,
      name: "London, UK"
    }
    
    公司模式
    { 
    _id:,
    名称:“富吧”,
    事件:[,…]
    }
    事件模型
    {u id:,
    名称:“洛克斯特拉”,
    位置:LocationSchema,//(以下型号)
    事件日期:“2019年1月1日”,
    客户:[,…]
    }
    客户机模型
    {u id:,
    姓名:“乔·博格”
    }
    位置模型
    {u id:,
    名称:“英国伦敦”
    }
    
    我的典型查询场景可能是:

  • 列出特定公司组织的所有活动(包括地点详情)
  • 列出特定事件的所有已注册客户端

  • 考虑到我上面提到的基数,这种设计和方法是否合理?我想这种设计的一个缺陷是,如果我只是查询事件模型,就无法获得公司的详细信息。

    除非多家公司可以创建一个事件,否则它不是多对多的。看起来你是在描述一对多

    这就是我的方法

    公司模式

    { 
       _id:
       name: 
    }
    
    客户机模型

    { 
       _id: 
       name:
    }
    
    客户模型

    {
       _id
       clientId
       eventId
    }
    
    事件模型

    { 
       _id:
       companyId:   
       name:
       locationId: 
       eventDate:
     }
    
    位置模型

    { 
       _id:
       name: "London, UK"
    }
    
    我愿意

    Company model
    { 
      _id: <CompanyID1>,
      name: "Foo Bar"
    }
    
    Event model
    { _id: <EventID1>,
      name: "Rockestra",
      location: LocationSchema, // embedded, not a reference
      eventDate: "01/01/2019",
      company: <CompanyID1>     // indexed reference.
    }
    
    Client model
    { _id: <ClientID1>,
      name: "Joe Borg",
      events: [<EventID1>, <EventID2>, ...] // with index on events
    }
    
    公司模式
    { 
    _id:,
    名称:“富吧”
    }
    事件模型
    {u id:,
    名称:“洛克斯特拉”,
    位置:LocationSchema,//嵌入,不是引用
    事件日期:“2019年1月1日”,
    公司://索引参考。
    }
    客户机模型
    {u id:,
    姓名:“乔·博格”,
    事件:[,…]//带有事件索引
    }
    
    列出特定公司组织的所有活动(包括地点详情):

    db.events.find({company:})
    
    列出特定事件的所有已注册客户端:

    db.clients.find({events:<EventID1>})
    
    db.clients.find({events:})
    
    你的回答实际上是我的第一直觉。然而,客户模型是不是有点过于RDBMS'ey?我的意思是,从我所读到的内容来看,我不应该将模式标准化太多,而是尝试在单个文档中嵌入尽可能多的内容。在Mongo中这样做很有诱惑力,因为它“可以”做到这一点。当我尝试嵌入所有这些东西时,我发现自己编写了3-4倍的代码来处理它。在我看来,关系结构简单明了。MongoDb将通过聚合$lookups来支持它。这个查询是如何工作的,比如第二个参数是什么?find({u id:},{u id:0,events:1}。我打字比思考快=)查看我的更新。当然应该是相反的。当您“列出所有事件”时,它是
    db.events.find
    db.clients.find({events:<EventID1>})