关于如何链接两个集合的Mongodb设计建议

关于如何链接两个集合的Mongodb设计建议,mongodb,Mongodb,所以我正在制作一个电影数据库。我原本打算在电影中嵌入与此类似的演员 { title : 'movie', actors : [ { name: 'actor', DOB : '1/1/1', }, { name: 'actor2', DOB : '1/1/1', } ], } 我很快就认定这是一个糟糕的决定。所以我的下一个想法是创建一个单独的演员集合,然后像这样将演员id嵌入电影文档中 { titl

所以我正在制作一个电影数据库。我原本打算在电影中嵌入与此类似的演员

{
  title : 'movie',
  actors : [
    {
      name: 'actor',
      DOB : '1/1/1',
    },
    {
      name: 'actor2',
      DOB : '1/1/1',
    }
  ],
}
我很快就认定这是一个糟糕的决定。所以我的下一个想法是创建一个单独的演员集合,然后像这样将演员id嵌入电影文档中

{
  title : 'movie',
  actors : [
    'actorid1',
    'actorid2',
  ],
}

这是一个糟糕的实现吗?如果我想记录一个演员演过的所有电影,我似乎还必须在演员文档中列出一个电影列表。只是创建一个链接表来将两者关联起来会更好吗?我不确定是否应该避免NoSQL数据库的相关SQL结构。在Mongodb中链接表不受欢迎吗

通常,在MongoDB中可以使用链接集合并进行连接来访问数据(关系数据模型)。然而,它只是使用不同的方法来建模数据。在许多情况下,用子文档和数组表示BSON文档(二进制JSON)中的数据会使链接集合和连接变得多余。此外,与关系数据模型相比,文档有两个优点。首先,不需要将关系模型映射到对象模型,这会增加复杂性并可能减慢开发速度。其次,文档提供了更好的性能和可伸缩性,因为整个文档可以从一个物理位置读取,无论是内存还是磁盘,并且当数据库分布在多个节点上时,可以消除跨节点连接

对于您的特殊情况,我假设对电影数据库的最频繁查询不是“从烂番茄中获取前十名电影的所有演员”,反之亦然,“从这些演员中获取最高评级的电影”在我看来,与主演一起看电影,或者让演员列出一系列电影都是非常重要的。然后,我认为下面的模式:

{
  title : 'movie',
  actors : [
    {
      _id: 'actor_id1',
      name: 'actor1'
    },
    {
      _id: 'actor_id'2,
      name: 'actor2'
    }
  ],
  plot: '...',
  reviews: [...],
  ...
}

{
  name : 'actor1',
  movies : [
    {
     _id: 'movie_id1',
     name: "movie1'
    },
    {
     _id: 'movie_id2',
     name: "movie2'
    }
 ],
 biography: '...',
 pictures: [...],
 ...
}


从电影到演员,从电影到演员,从演员到演员,从电影到演员,从演员到演员,从电影到演员,从演员到演员,从演员到演员,从电影到演员,从演员到演员,从演员到演员,从电影到演员到演员,从演员到演员,从演员到。还有演员和电影名称以及相应的_id,可以在一个请求中获取此数据。由于演员姓名和电影名称变化不频繁,因此打破一致性的可能性很低。

首先,您应该了解最需要访问的数据,即。E对您的数据最频繁的请求是什么。根据这一点,你可以决定是否需要单独的收藏,或者在其中嵌入什么。我计划平等地访问电影和演员,以及他们之间的关系。例如,我想做一个“从烂番茄中获得前十名电影的所有演员”,或者反之亦然,“从这些演员那里获得最高评级的电影”,等等。我知道这可以通过任何一种设计来实现,我认为最好的方法是创建一个将演员和电影联系起来的集合。我的问题是:这对NoSQL db是不赞成的吗?是的,这是。至少在MongoDB。与包含相关实体ID的数组的文档相比,使用链接集合时,您需要查询数据库更多次,因为没有联接。在您的情况下,您可能可以使用聚合执行联接操作(即,
$lookup:{}
)。这是和。否则,如果可能的话,我会切换到一些关系数据库(例如PostgreSQL)。啊,谢谢。这就是我一直在寻找的信息。mongodb不考虑数据冗余吗?模式似乎会涉及冗余,但总是如此,因为它为数据不一致性提供了机会。不过,在这种情况下,为了简单性和性能,您可以进行可接受的权衡,因为您可能不会更改演员和电影的名称。如果是,则必须确保两个集合中的名称都更改。