假设我有下表:
`title`
- id
- name
- tv_series_id
Example:
id=1, name="Episode 2", tv_series_id=4
Run Code Online (Sandbox Code Playgroud)
我可以使用以下 JSON 结构轻松地将其映射到 ElasticSearch 中:
{
"ID": 1,
"Name": "Episode 2",
"TVSeriesID": 4
}
Run Code Online (Sandbox Code Playgroud)
如果我有第二个表,称为外键中引用tv_series的title表,例如:
`tv_series`
- id
- name
Example:
id=4, name='Friends'
Run Code Online (Sandbox Code Playgroud)
那么我将如何在 Elasticsearch 中映射这种关系?是否有一种通用方法可以在 Elasticsearch 中映射具有一个或多个外键关系的两个表?例如,通过执行某个连接语句?
在 SQL 世界中,一切都是关于以这样一种方式保持表之间的关系,即数据永远不会重复两次(或尽可能少),因此采用主键/外键方法。
在一般的 NoSQL 世界中,特别是在 Elasticsearch 中,索引和类型之间没有明确的关系。有多种方法可以在文档本身(例如父子或嵌套对象)之间创建关系,但没有 JOIN 的概念。
相反,主要思想是以这样一种方式非规范化您的数据,即您的文档将“可用于”执行您的特定用例。人们不应该害怕保留数据的冗余副本。更一般地说,您需要问自己以下两个问题(以及许多其他问题):
在您突出显示的简单情况下,我肯定会使用包含两个表的 JOIN 的文档:
{
"ID": 1,
"Name": "Episode 2",
"TVSeriesID": 4,
"TVSeriesName": "Friends"
}
Run Code Online (Sandbox Code Playgroud)
标题Friends将包含在 236 个文档中没什么大不了的,这个想法是您可以检索任何剧集,它包含您需要了解的所有数据。