代码之家  ›  专栏  ›  技术社区  ›  Chase Thorpe

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

  •  1
  • Chase Thorpe  · 技术社区  · 6 年前

    我设想了三个实体:用户、容器和照片,它们的结构如下:

    用户集合:

    {
      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”
    }
    

    我只想知道我是否遗漏了一些重要的细节,这些细节会在我花了几个星期来构建这个模型之前打破它。

    非常感谢:)

    1 回复  |  直到 6 年前
        1
  •  3
  •   mickl    6 年前

    这里有很多因素可以考虑。首先,您不需要认为每个“实体”都应该有一个单独的集合(如在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 -更难维护(更新有点复杂,比如 here )但更好的阅读性能,因为你不需要查找。

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