2015-10-22 67 views
3

假设我有如下表:ElasticSearch映射表与SQL表的外键

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

如果我那么有:

`title` 
- id 
- name 
- tv_series_id 

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

我可以在ElasticSearch使用以下JSON结构容易映射此第二个表叫做tv_seriestitle表中引用的一个外键,例如:

`tv_series` 
- id 
- name 

Example: 
id=4, name='Friends' 

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

回答

3

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

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

取而代之的是,主要想法是denormalize your data,这样您的文档将“可用”来执行您的特定用例。人们不应该害怕保留冗余的数据副本。更一般地说,您需要问自己以下两个问题(其中包括许多其他问题):

  1. 需要向用户显示哪些数据/字段?
  2. 您需要执行哪些查询来检索上述数据?

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

    这是标题Friends将被包含在236没什么大不了:

在您强调简单的情况下,我肯定会用一个包含JOIN的两个表的文件去文件,这个想法是,你可以检索任何情节,它包含你需要知道的所有数据。

+0

感谢您的回应,所以在这种情况下,我需要做一个'LEFT OUTER JOIN',以防万一项目没有'tv_series_id'。否则,如果我们执行了“INNER JOIN”,它会从结果中排除该项目。或者我应该做另一种类型的连接? – David542

+0

当然,JOIN的类型显然取决于你的数据模型,如果你认为你的剧集不属于某个特定系列,那么你需要和OUTER JOIN,否则如果所有剧集都与一个系列相关,那么一个左加入是好的。底线是你需要找到一种方法来规范你的数据。 – Val

+1

但是在TVSeriesName被更新的情况下。我将不得不更新整个Episode文档(父文档)。否则,新的值不会出现在这里。假设有数千个这样的“父母”文件,那将是一种矫枉过正的方式。有没有更好的方法来实现这一目标? –