处理一对多关系MongoDB架构设计

时间:2018-02-02 15:36:58

标签: mongodb database-design

我目前正在为事件管理系统设计MongoDB架构。 ER图如下:

enter image description here

这个概念很简单:

  1. 公司可以创建一个或多个活动(估计x500s公司)
  2. 客户可以参加一个或多个来自众多公司的活动(估计每个客户x200 ...也估计x1000的客户)
  3. 这是经典的多对多关系,对吧?

    现在我来自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"
    }
    

    我的典型查询方案可能是:

    1. 列出特定公司组织的所有活动(包括位置详情)
    2. 列出特定活动的所有注册客户
    3. 鉴于我上面提到的基数,这种设计和方法是否合理使用?我想这个设计的一个缺陷是,如果我只查询事件模型,我无法得到公司的详细信息。

2 个答案:

答案 0 :(得分:1)

我愿意

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
}

列出特定公司组织的所有活动(包括地点详情):

db.events.find({company:<CompanyID1>})

列出特定活动的所有注册客户:

db.clients.find({events:<EventID1>})

答案 1 :(得分:0)

除非许多公司可以创建单个事件,否则它并不多对多。看起来你正在描述一对多。

这就是我接近它的方式。

公司模式

a.StartDate < b.EndDate and a.EndDate > b.StartDate

客户端模型

{ 
   _id:
   name: 
}

ClientEvents模型

{ 
   _id: 
   name:
}

活动模型

{
   _id
   clientId
   eventId
}

位置模型

{ 
   _id:
   companyId:   
   name:
   locationId: 
   eventDate:
 }