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