我目前正在为事件管理系统设计MongoDB架构。 ER图如下:
这个概念很简单:
这是经典的多对多关系,对吧?
现在我来自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"
}
我的典型查询方案可能是:
鉴于我上面提到的基数,这种设计和方法是否合理使用?我想这个设计的一个缺陷是,如果我只查询事件模型,我无法得到公司的详细信息。
答案 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:
}