【发布时间】:2015-03-09 04:17:24
【问题描述】:
将冗余数据存储在一个索引中更好还是有两个索引然后交叉引用它们更好?即,用户想在电影院看电影。
由于用户有兴趣按影院查找电影,我们可以有一个包含电影nested_type 的影院索引:
// 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,然后只查询 Postgres 数据库中的这些 ID。虽然这可能比通过电影索引单独查询它们要慢?
【问题讨论】:
标签: javascript node.js elasticsearch denormalization