首页 > 解决方案 > 这是在 MongoDB 中建模数据的正确方法吗?

问题描述

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

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

用户收藏:

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

容器集合:

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

照片收藏:

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

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

非常感谢 :)

标签: mongodbdata-modeling

解决方案


这里确实有多个因素可以考虑。首先你不需要认为每个“实体”都应该有一个单独的集合(就像在 SQL 中一样) BSON 可以处理嵌套数组,如下所示:

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

“加入” ( $lookup ) MongoDB 中的数据是额外的开销,因此请保持合并,除非您有充分的理由将其划分为多个集合。

像上面那样建模数据使您可以使用$graphLookup来获取父子关系树。

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

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


推荐阅读