2015-10-22 68 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文檔(父文檔)。否則,新的值不會出現在這裏。假設有數千個這樣的「父母」文件,那將是一種矯枉過正的方式。有沒有更好的方法來實現這一目標? –