

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menggabungkan data dari beberapa tabel untuk dimasukkan ke dalam satu dokumen
<a name="aurora-denormalized-joins"></a>

`joins`Konfigurasi dalam plugin sumber RDS memungkinkan denormalisasi otomatis tabel relasional yang dinormalisasi menjadi dokumen tunggal. OpenSearch Saat dikonfigurasi, pipeline membaca peristiwa change data capture (CDC) dari beberapa tabel terkait dan menggabungkannya ke dalam dokumen induk menggunakan upserts berbasis skrip Painless.

Topik ini menjelaskan cara mengonfigurasi gabungan tabel di saluran konsumsi Aurora dan Amazon RDS, termasuk tipe gabungan, prasyarat, sintaks konfigurasi, pelacakan versi, dan pemecahan masalah umum.

## Prasyarat
<a name="aurora-joins-prerequisites"></a>
+ Pemahaman dasar konsep database relasional termasuk kunci primer, kunci asing, dan hubungan tabel.
+ Tabel dengan hubungan kunci asing (orang tua-anak).
+ Semua tabel di `relations` harus terdaftar di`tables.include`.
+ Tabel induk harus memiliki kunci utama.
+ Tabel anak harus memiliki kolom yang mereferensikan kunci utama orang tua.
+ Tabel anak harus memiliki kunci utama (`child_primary_key`) sendiri untuk mengidentifikasi catatan individu di upserts.

## Pola bergabung yang didukung
<a name="aurora-joins-supported-patterns"></a>
+ Orangtua → Anak (1:1)
+ Orangtua → Anak (1:N)
+ Beberapa anak per orang tua

## Contoh konfigurasi
<a name="aurora-joins-configuration"></a>

Konfigurasi YAMAL berikut menunjukkan cara mendefinisikan hubungan tabel induk-anak untuk plugin sumber Aurora. Contoh ini mengkonfigurasi tabel induk dengan dua tabel anak menggunakan jenis gabungan yang berbeda:

```
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
```

## Bergabunglah dengan tipe
<a name="aurora-joins-types"></a>

one\_to\_one  
Bidang anak diratakan pada tingkat root dokumen induk. Gunakan ketika setiap orang tua memiliki persis satu catatan anak terkait.  

```
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\_banyak  
Catatan anak disimpan sebagai array bersarang dalam dokumen induk. Gunakan saat setiap orang tua dapat memiliki beberapa catatan anak terkait.  

```
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}
  ]
}
```

## Struktur dokumen
<a name="aurora-joins-document-structure"></a>

ID Dokumen  
 OpenSearch Dokumen `_id` diatur ke nilai kunci utama tabel induk. Semua catatan anak untuk induk yang sama digabungkan ke dalam dokumen tunggal ini.

Pelacakan versi  
`version_field`(default:`__versions`) menyimpan peta penghitung versi per tabel:  

```
"__versions": {
  "orders": 12345678901,
  "order_items": 12345678902,
  "shipping": 12345678903
}
```
Versi setiap tabel berasal dari stempel waktu ekspor atau stempel waktu binlog. Ketika peristiwa ekspor atau CDC tiba, skrip Painless memeriksa apakah versi yang masuk lebih baru dari versi yang disimpan untuk tabel tertentu. Jika lebih tua, acara dilewati. Ini memastikan:  
+ Pemrosesan idempoten — acara yang diputar ulang diabaikan dengan aman.
+ Pembuatan versi independen—pembaruan pesanan tidak mengganggu pembaruan item.
+ Keamanan bersamaan — beberapa sisipan anak untuk induk yang sama ditangani dengan benar.

\_versi dokumen  
 OpenSearch `_version`Bidang bertambah dengan setiap peningkatan yang berhasil. Untuk dokumen dengan 1 orang tua\+N item\+1 catatan pengiriman, `_version` = N \+ 2.

## Batasan
<a name="aurora-joins-limitations"></a>
+ Single-level bergabung saja—orang tua → anak. Multi-level (orang tua → anak → cucu) tidak didukung.
+ Satu tabel induk per pipa. Semua tabel anak bergabung dengan orang tua yang sama.
+ Tabel anak tidak dapat dimiliki oleh banyak orang tua dalam pipeline yang sama.
+ `max_child_records`membatasi ukuran array untuk `one_to_many` bergabung. Catatan di luar batas ini dijatuhkan.

**Konflik nama bidang**  
Untuk `one_to_one` bergabung, bidang anak diratakan pada tingkat akar. Jika tabel anak memiliki kolom dengan nama yang sama dengan kolom induk, nilai anak menimpa nilai induk. Gunakan nama kolom yang berbeda di seluruh tabel induk dan `one_to_one` anak.  
Untuk `one_to_many` gabungan, bidang anak bersarang di dalam array yang dinamai tabel anak, jadi konflik tidak menjadi masalah.

## Pemecahan masalah
<a name="aurora-joins-troubleshooting"></a>

Dokumen yang hilang catatan anak  
+ Periksa `__versions` dokumen. Jika versi tabel anak hilang, peristiwa turunan belum diproses.
+ Verifikasi pipa aktif dan `changeEventsProcessed` metriknya bukan nol.

Dokumen tidak muncul di OpenSearch  
+ Periksa apakah catatan induk ada di tabel sumber.
+ Verifikasi `tables.include` daftar berisi semua tabel yang diperlukan.
+ Periksa log pipa untuk kegagalan konsumsi dan masalah konfigurasi:. `/aws/vendedlogs/{{pipeline-log-group}}`