ElasticSearch使用外键映射两个sql表

时间:2015-10-22 18:49:39

标签: sql elasticsearch

假设我有下表:

`title`
- id
- name
- tv_series_id

Example:
id=1, name="Episode 2", tv_series_id=4

我可以使用以下JSON结构轻松地在ElasticSearch中映射它:

{
    "ID": 1,
    "Name": "Episode 2",
    "TVSeriesID": 4
}

如果我有一个名为tv_series的第二个表,则表示外键中引用的title表,例如:

`tv_series`
- id
- name

Example:
id=4, name='Friends'

我如何在Elasticsearch中映射该关系?是否存在一种通用方法,可以在Elasticsearch中映射具有一个或多个外键关系的两个表?例如,通过执行某个连接语句?

1 个答案:

答案 0 :(得分:4)

在SQL世界中,一切都是为了保持表之间的关系,使数据永远不会重复两次(或尽可能少),因此主键/外键方法。

在NoSQL世界中,特别是在Elasticsearch中,您的索引和类型之间没有明确的关系。有一些方法可以在文档之间创建关系(例如parent-childnested objects),但是没有JOIN的概念。

相反,主要的想法是denormalize your data以这样的方式使您的文件可以使用"执行您的具体用例。人们不应该害怕保留冗余的数据副本。更一般地说,你需要问自己以下两个问题(以及许多其他问题):

  1. 您需要向用户显示哪些数据/字段?
  2. 您需要执行哪些查询来检索上述数据?
  3. 在您突出显示的简单案例中,我肯定会使用包含两个表的JOIN的文档:

    {
        "ID": 1,
        "Name": "Episode 2",
        "TVSeriesID": 4,
        "TVSeriesName": "Friends"
    }
    

    标题Friends将包含在236个文档中没什么大不了的,这个想法是你可以检索任何一集,它包含你需要知道的所有数据。