

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 從多個資料表聯結資料以擷取至一個文件
<a name="aurora-denormalized-joins"></a>

RDS 來源外掛程式中的`joins`組態可將標準化關聯式資料表自動取消標準化為單一 OpenSearch 文件。設定後，管道會從多個相關資料表讀取變更資料擷取 (CDC) 事件，並使用 Painless 指令碼型 upserts 將其合併至父文件。

本主題說明如何在 Aurora 和 Amazon RDS 擷取管道中設定資料表聯結，包括聯結類型、先決條件、組態語法、版本追蹤和疑難排解常見問題。

## 先決條件
<a name="aurora-joins-prerequisites"></a>
+ 對關聯式資料庫概念的基本了解，包括主索引鍵、外部索引鍵和資料表關係。
+ 具有外部金鑰關係的資料表 （父子）。
+ 中的所有資料表`relations`都必須列在 中`tables.include`。
+ 父資料表必須具有主索引鍵。
+ 子資料表必須具有參考父主索引鍵的資料欄。
+ 子資料表必須擁有自己的主索引鍵 (`child_primary_key`)，以識別 upsert 中的個別記錄。

## 支援的聯結模式
<a name="aurora-joins-supported-patterns"></a>
+ 父項 → 子項 (1：1)
+ 父項 → 子項 (1：N)
+ 每個父系有多個子系

## 範例組態
<a name="aurora-joins-configuration"></a>

下列 YAML 組態顯示如何定義 Aurora 來源外掛程式的父子資料表關係。此範例使用不同的聯結類型，設定具有兩個子資料表的父資料表：

```
version: "2"
aurora-joins-pipeline:
  source:
    rds:
      db_identifier: "my-aurora-cluster"
      engine: "aurora-mysql"
      database: "my_database"
      tables:
        include:
          - "parent_table"
          - "child_table_1"
          - "child_table_2"
      s3_bucket: "my-pipeline-bucket"
      s3_region: "us-east-1"
      s3_prefix: "rds-export"
      export:
        kms_key_id: "my-kms-key-id"
        iam_role_arn: "arn:aws:iam::123456789012:role/my-export-role"
      stream: true
      aws:
        sts_role_arn: "arn:aws:iam::123456789012:role/my-pipeline-role"
        region: "us-east-1"
      authentication:
        username: ${{aws_secrets:secret:username}}
        password: ${{aws_secrets:secret:password}}
      joins:
        version_field: "__versions"
        relations:
          - parent: "parent_table"
            child: "child_table_1"
            parent_key: "id"
            child_key: "parent_id"
            child_primary_key: "child_id"
            join_type: "one_to_many"
            max_child_records: 100
          - parent: "parent_table"
            child: "child_table_2"
            parent_key: "id"
            child_key: "parent_id"
            child_primary_key: "child_id"
            join_type: "one_to_one"
  sink:
    - opensearch:
        hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"]
        index: "my-joined-index"
        document_id: "${getMetadata(\"primary_key\")}"
        action: "${getMetadata(\"opensearch_action\")}"
        aws:
          sts_role_arn: "arn:aws:iam::123456789012:role/my-pipeline-role"
          region: "us-east-1"
extension:
  aws:
    secrets:
      secret:
        secret_id: "arn:aws:secretsmanager:us-east-1:123456789012:secret:my-db-secret"
        region: "us-east-1"
        sts_role_arn: "arn:aws:iam::123456789012:role/my-pipeline-role"
        refresh_interval: PT1H
```

## 聯結類型
<a name="aurora-joins-types"></a>

one\_to\_one  
子欄位會在父文件的根層級扁平化。當每個父系只有一個相關的子記錄時使用 。  

```
Parent table: orders (order_id, customer_name, total)
Child table:  shipping (shipping_id, order_id, tracking_number, carrier)

Result document:
{
  "order_id": 1,
  "customer_name": "Alice",
  "total": 299.99,
  "shipping_id": "1",
  "tracking_number": "TRK-1",
  "carrier": "FedEx"
}
```

one\_to\_many  
子記錄會以巢狀陣列形式存放在父文件中。當每個父系可以有多個相關的子記錄時，請使用 。  

```
Parent table: orders (order_id, customer_name, total)
Child table:  order_items (item_id, order_id, product_name, quantity, price)

Result document:
{
  "order_id": 1,
  "customer_name": "Alice",
  "total": 299.99,
  "order_items": [
    {"item_id": 10, "product_name": "Keyboard", "quantity": 1, "price": 149.99},
    {"item_id": 11, "product_name": "Mouse", "quantity": 1, "price": 29.99}
  ]
}
```

## 文件結構
<a name="aurora-joins-document-structure"></a>

文件 ID  
OpenSearch 文件`_id`設定為父資料表主索引鍵的值。相同父系的所有子項記錄都會合併到此單一文件中。

版本追蹤  
`version_field` （預設：`__versions`) 會儲存每個資料表版本計數器的映射：  

```
"__versions": {
  "orders": 12345678901,
  "order_items": 12345678902,
  "shipping": 12345678903
}
```
每個資料表的版本衍生自匯出時間戳記或 binlog 時間戳記。匯出或 CDC 事件送達時，無痕指令碼會檢查傳入版本是否比該特定資料表的預存版本更新。如果較舊，則會略過事件。這可確保：  
+ 等冪處理 - 系統會安全地忽略重播的事件。
+ 獨立版本控制 - 訂單更新不會影響項目更新。
+ 並行安全性 - 正確處理相同父項的多個子插入。

文件 \_version  
OpenSearch `_version` 欄位會隨著每個成功的 upsert 遞增。對於具有 1 個父項 \+ N 個項目 \+ 1 個運送記錄的文件， `_version` = N \+ 2。

## 限制
<a name="aurora-joins-limitations"></a>
+ 僅限單一層級聯結 - 父 → 子項。不支援多層級 （父 → 子 → 孫子）。
+ 每個管道一個父資料表。所有子資料表都會聯結至相同的父系。
+ 子資料表不能屬於同一管道中的多個父系。
+ `max_child_records` 會限制`one_to_many`聯結的陣列大小。超過此限制的記錄會被捨棄。

**欄位名稱衝突**  
對於`one_to_one`聯結，子欄位會在根層級扁平化。如果子資料表具有與父資料欄同名的資料欄，則子值會覆寫父值。在父資料表和`one_to_one`子資料表之間使用不同的資料欄名稱。  
對於`one_to_many`聯結，子欄位會巢狀在以子資料表命名的陣列中，因此衝突不是問題。

## 疑難排解
<a name="aurora-joins-troubleshooting"></a>

文件遺失子記錄  
+ `__versions` 檢查 文件。如果缺少子資料表的版本，則子事件尚未處理。
+ 確認管道處於作用中狀態，且`changeEventsProcessed`指標為非零。

未出現在 OpenSearch 的文件  
+ 檢查來源資料表中是否存在父系記錄。
+ 確認`tables.include`清單包含所有必要的資料表。
+ 檢查管道日誌是否有擷取失敗和組態問題：`/aws/vendedlogs/{{pipeline-log-group}}`。