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(我的第三个选择),除非这真的很糟糕?您应该获得父子关系的下降性能。同样,这些都是依赖于数据的。警告:孩子们只能有一个家长,因此这意味着一部电影不能连接到多个影院,这种情况就是这样。你明白了吗?