所以我正在制作电影数据库。我原本打算将电影中的演员嵌入到类似的内容中。
{
title : 'movie',
actors : [
{
name: 'actor',
DOB : '1/1/1',
},
{
name: 'actor2',
DOB : '1/1/1',
}
],
}
我很快就认定这是一个糟糕的决定。所以我的下一个想法是创建一个单独的actor集合,然后将actor ID嵌入到电影文档中。
{
title : 'movie',
actors : [
'actorid1',
'actorid2',
],
}
这是不好的实施?如果我想跟踪演员所在的所有电影,我似乎还必须在演员文档中制作一个电影列表。是否更好地创建一个链接表来关联这两个?我不确定是否应该避免NoSQL数据库的相关SQL结构。在Mongodb中链接表格不受欢迎吗?
答案 0 :(得分:2)
通常,在MongoDB中可以使用链接集合和连接来访问数据(关系数据模型)。然而,它只是使用不同的方法来建模数据。在许多情况下,使用子文档和数组在BSON文档(二进制JSON)中表示数据会使链接集合和连接变得多余。 Using the document model, embedded sub-documents and arrays effectively pre-JOIN data by aggregating related fields within a single data structure。此外,文档相对于关系数据模型具有几个优点。首先,不需要将关系模型映射到对象模型,这会增加复杂性并可能减慢开发速度。其次,文档提供了更好的性能和可伸缩性,因为整个文档可以从一个物理位置读取,无论是内存还是磁盘,并在数据库分布在多个节点上时消除跨节点 JOIN 。
至于你的具体情况,我认为“从腐烂的西红柿中获取前10名评级电影中的所有演员”或反之亦然“获得这些演员评分最高的电影”不是最常见的查询对于电影数据库。 在我看来,与主演的演员或有电影列表的演员合影。然后我会考虑以下架构:
{
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以在一个请求中获取此数据。由于演员的名字和电影名称的变化频率不高,因此打破一致性的可能性很小。