elasticsearch,denormalization,Javascript,Node.js,elasticsearch,Denormalization" /> elasticsearch,denormalization,Javascript,Node.js,elasticsearch,Denormalization" />

Javascript elasticsearch:保留冗余(非规范化)数据或保留ID列表以供交叉引用?

Javascript elasticsearch:保留冗余(非规范化)数据或保留ID列表以供交叉引用?,javascript,node.js,elasticsearch,denormalization,Javascript,Node.js,elasticsearch,Denormalization,将冗余数据存储在一个索引中,还是有两个索引然后交叉引用它们更好?也就是说,用户想在电影院看电影 由于用户对按影院查找电影感兴趣,我们可以有一个影院索引,其电影类型为: // Here, movies field will be a Nested Type, not Object Type. eclient.index({ index: 'myindex', type: 'theater', id: 1, body: { name: "Grand

将冗余数据存储在一个索引中,还是有两个索引然后交叉引用它们更好?也就是说,用户想在电影院看电影

由于用户对按影院查找电影感兴趣,我们可以有一个影院索引,其电影类型为:

// Here, movies field will be a Nested Type, not Object Type.

eclient.index({
    index: 'myindex',
    type: 'theater',
    id: 1,
    body: {
        name: "Grand Cinema",
        description: "Come watch movies!",
        movies: [
           {
               title: "Red November",
               description: "A submarine hunt",
               rated: "R",
               score: 10.0
           },
           {
               title: "Cinderbrella",
               description: "A burnt umbrella",
               rated: "PG",
               score: 8.8
           }
        ]

    }
});
这使得按影院显示电影的简短列表变得很容易,因为数据在影院是非规范化的

我们还可以有一个电影索引,其中包含有关电影的更详细信息:

eclient.index({
    index: 'myindex',
    type: 'movie',
    id: 1,
    body: {
        title: "Red November",
        description: "A submarine hunt",
        rated: "R",
        score: 10.0,
        actors: ["Bob", "Alice", "Carol"],
        // other details...
    }
});
因此,当用户点击一部电影以获取更多信息时,我可以查询电影索引并获取其详细信息(即演员)

正如你所看到的,剧院拥有大量冗余数据。如果一部电影获得了一个更新的字段,那么重新编制索引也会让人感到痛苦。将有两个地方重新编制索引:影院索引中的电影和电影索引本身。例如,一部电影会得到最新的分数

我想我可以更改它,使影院索引包含一组电影ID,并使电影包含一组影院ID:

// theater index
type: 'theater',
id: 1,
body: {
    name: ...
    description: ...
    movies: [ 1, 2 ]
}

// movie index
type: 'movie',
id: 1,
body: {
    title: ...
    description: ...
    theaters: [ 1, 2, 3]
}
但在这种情况下,我如何有效地从影院查询电影信息?我必须获得电影ID,然后在电影索引上逐个查询它们,以便在影院页面上显示一些有限的电影信息。然而,如果某部电影的某个字段发生了变化,那么重新编制索引的工作量就会小得多

哪一个是更好的解决方案?我更倾向于认为后者,因为即使电影很少改变其数据,对每一家影院重新编制容纳该特定电影的索引,并对电影索引本身重新编制索引,可能是对计算能力的巨大浪费(瓶颈?)


第三种解决方案是让影院拥有电影ID,然后只需在这些ID上查询Postgres数据库。虽然这可能比通过电影索引单独查询它们要慢?

但您要查找的是父子关系类型

在同一索引下,可以将一种类型定义为另一种类型的父类型。 在这种情况下,您可以将所有电影文档保留在“电影类型”下,将“剧院文档”保留在“剧院类型”下。 这种方法的优点是

  • 您可以根据影院文档的条件搜索电影。例如:请给我所有在印度影院上映的电影。 链接-
  • 你可以根据电影搜索影院,例如:,给我所有电影《回到未来》发行的影院。 链接-
  • 您可以找到有关父子关系的更多信息

    父子关系相对于嵌套文档的优势

  • 您可以编辑/更新电影文档,而无需触摸影院信息
  • 您可以添加/删除/编辑影院文档,而无需触摸电影信息

  • 谢谢,我完全错过了那部分。不过,他们的网页确实建议谨慎使用亲子关系,因为亲子关系往往会消耗大量的记忆。我想如果它不能很好地与数据进行扩展,那么我可以求助于从db查询ID(我的第三个选择),除非这真的很糟糕?您应该获得父子关系的下降性能。同样,这些都是依赖于数据的。警告:孩子们只能有一个家长,因此这意味着一部电影不能连接到多个影院,这种情况就是这样。你明白了吗?