这是在 MongoDB 中建模数据的正确方法吗?

Is this the correct way to model data in MongoDB?

我是数据建模的新手,正在从事一个用户可以将照片上传到容器的个人项目。这些容器可以嵌套(例如:"Japan" 容器可能有一个名为 "Cats" 的子容器,您可以在其中存储您在日本看到的所有猫的照片)。

我设想了 3 个实体:用户、容器和照片,其结构如下:

用户Collection:

{
  User_id: userId101,
  userName: “Chase”,
  Email: “chase@email.com”,
  Containers: [{name: “Thailand”, parentContainer: null}, {name: “Food”, parentContainer:
                     “Thailand”],
}

容器Collection:

{
  Id: cont_01,
  Name: “Thailand”,
  ownedBy: userId101
  parentContainer: null,
  Photos: [“photoId1”, “photoId2”, etc.]
{

照片 Collection:

{
  Id: photo_01,
  userRef: userId101
  Url: “www.unsplash.com/1279178298”
}

我只是想知道在我花数周时间构建它之前我是否遗漏了任何会破坏它的主要细节。

非常感谢:)

这里确实有多个因素需要考虑。首先,你不需要认为每个 "entity" 都应该有一个单独的集合(如 SQL)BSON 可以处理如下嵌套数组:

{
    Id: cont_01,
    Name: "Thailand",
    ownedBy: userId101
    parentContainer: null,
    Photos: [ { id: "photo_01", "www.unsplash.com/1279178298" }]
}

"Joining" ($lookup) MongoDB 中的数据是一个额外的开销所以保持合并,除非你有充分的理由分成多个集合。

像上面那样对数据建模使您有可能使用 $graphLookup 获得父子关系树。

这就是我要开始的。作为下一步,您可以考虑将用户数据嵌入到每个容器中(非规范化)以避免使用 $lookups 或使用带有嵌入 photos 的容器数组的单个 user 文档 - 更难以维护(更新有点复杂,如 )但读取性能更好,因为您不需要查找。

拥有超大文档的缺点也​​是 16MB 的文档大小限制,这是很多,但最好记住这一点。