我了解了很多有关在MongoDB中嵌入的信息,但是我仍然不知道何时使用它。我想到了一些情况:
我有一个名为UserGroups的集合,其中包含以下字段:
现在,我要将用户添加到“用户”集合:
我应该在Users集合中有一个 groupName 字段,并在UserGroups集合得到更新时对其进行更新。
我应该在Users集合中添加 groupId 字段,并在需要UserGroups.name时执行连接。
我应该将用户文档作为嵌入式文档添加到UserGroups集合中。
或者我应该将userGroup文档作为嵌入式文档添加到Users集合中。但是,我认为我不应该这样做。
我应该使用哪个选项?
答案 0 :(得分:4)
由于MongoDB模式的灵活性,开发人员不再需要先设计数据库模式,即Entity Relationship Diagram。首先进行应用程序的设计,然后设计数据库架构以匹配应用程序的使用情况(查询,写入,更新等)。另请参见Data Modelling。
这就是为什么数据库模式设计没有正确/错误答案的原因。 MongoDB有多种用例,不同的应用程序可以利用不同的模型。
我们何时应该在MongoDB中使用嵌入式文档?
在不完全知道您的应用程序将如何与数据交互的情况下,以下答案只是一般准则或方法:
赞成嵌入,除非有理由不这样做。
首先尝试将UserGroup
规范化为User
。例如:
{ userid: 1001,
name: "Reza Tayebi",
group: {id: 10,
name: "Developer"
}
}
这种关系是一对一的(不是很多,不是无限的)。
如果用户可以属于一个或几个组,则以上示例适用。如果有多个但限于5个以下,则可以引入一个数组。但是,如果一个用户可以有20个以上的组,或者可以有不限数量的组,则应开始考虑将组分成另一个集合。
很可能会同时发生检索。
如果UserGroups
的检索始终与用户相关联。例如,Query some users with their respective groups
或Query some users given a specific group(s)
。
可能同时发生更新。
如果您可能同时更新Users
和UserGroups
。
尽管从MongoDB 4.0开始,但是如果Users
和UserGroups
未嵌入,则可以使用multi-documents transactions,但单个文档事务将更有效。另请参见Atomicity and Transactions。
该字段很少更新。
如果组名在集合中很少更新。例如,如果经常需要将整个Developers
集合的组名Web Developers
更新为Users
,则嵌入UserGroups
是不合适的。
同样,以上只是设计架构之前应考虑的一般准则,另请参阅以下资源: