

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Unindo dados de várias tabelas para ingerir em um único documento
<a name="aurora-denormalized-joins"></a>

A `joins` configuração no plug-in de origem do RDS permite a desnormalização automática de tabelas relacionais normalizadas em documentos únicos. OpenSearch Quando configurado, o pipeline lê eventos de captura de dados de alteração (CDC) de várias tabelas relacionadas e os mescla em um documento principal usando upserts baseados em script Painless.

Este tópico explica como configurar junções de tabelas nos pipelines de ingestão do Aurora e do Amazon RDS, incluindo tipos de junção, pré-requisitos, sintaxe de configuração, controle de versões e solução de problemas comuns.

## Pré-requisitos
<a name="aurora-joins-prerequisites"></a>
+ Compreensão básica dos conceitos de banco de dados relacional, incluindo chaves primárias, chaves estrangeiras e relacionamentos de tabelas.
+ Tabelas com relações de chave estrangeira (pai-filho).
+ Todas as tabelas `relations` devem estar listadas em`tables.include`.
+ A tabela principal deve ter uma chave primária.
+ As tabelas secundárias devem ter uma coluna referenciando a chave primária do pai.
+ As tabelas secundárias devem ter sua própria chave primária (`child_primary_key`) para identificar registros individuais em upserts.

## Padrões de junção suportados
<a name="aurora-joins-supported-patterns"></a>
+ Pai → Filho (1:1)
+ Pai → Filho (1:N)
+ Vários filhos por pai

## Exemplo de configuração
<a name="aurora-joins-configuration"></a>

A configuração YAML a seguir mostra como definir relacionamentos de tabela pai-filho para o plug-in de origem do Aurora. Este exemplo configura uma tabela principal com duas tabelas secundárias usando diferentes tipos de junção:

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

## Tipos de união
<a name="aurora-joins-types"></a>

um\_para-um  
Os campos secundários são nivelados no nível raiz do documento principal. Use quando cada pai tiver exatamente um registro filho relacionado.  

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

um\_para\_muitos  
Os registros secundários são armazenados como uma matriz aninhada no documento principal. Use quando cada pai puder ter vários registros infantis relacionados.  

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

## Estrutura do documento
<a name="aurora-joins-document-structure"></a>

ID do documento  
O OpenSearch documento `_id` é definido com o valor da chave primária da tabela principal. Todos os registros secundários do mesmo pai são mesclados nesse único documento.

Acompanhamento de versões  
O `version_field` (padrão:`__versions`) armazena um mapa dos contadores de versão por tabela:  

```
"__versions": {
  "orders": 12345678901,
  "order_items": 12345678902,
  "shipping": 12345678903
}
```
A versão de cada tabela é derivada do timestamp de exportação ou do timestamp do binlog. Quando chega um evento de exportação ou CDC, o script Painless verifica se a versão de entrada é mais recente do que a versão armazenada dessa tabela específica. Se for mais antigo, o evento será ignorado. Isso garante:  
+ Processamento idempotente — eventos repetidos são ignorados com segurança.
+ Controle de versão independente — uma atualização do pedido não interfere nas atualizações do item.
+ Segurança simultânea — vários encartes infantis para o mesmo pai são manuseados corretamente.

\_versão do documento  
O OpenSearch `_version` campo é incrementado com cada reviravolta bem-sucedida. Para um documento com 1 pai \+ N itens \+ 1 registro de remessa, `_version` = N \+ 2.

## Limitações
<a name="aurora-joins-limitations"></a>
+ Single-level só se junta — pai → filho. Multi-level (pai → filho → neto) não é suportado.
+ Uma tabela principal por pipeline. Todas as tabelas secundárias se juntam ao mesmo pai.
+ As tabelas secundárias não podem pertencer a vários pais no mesmo pipeline.
+ `max_child_records`limita o tamanho da matriz para `one_to_many` junções. Registros além desse limite são descartados.

**Conflitos de nome de campo**  
Para `one_to_one` junções, os campos secundários são nivelados no nível da raiz. Se uma tabela secundária tiver uma coluna com o mesmo nome da coluna principal, o valor secundário substituirá o valor principal. Use nomes de colunas distintos nas tabelas principal e `one_to_one` secundária.  
Para `one_to_many` junções, os campos secundários são aninhados dentro de uma matriz com o nome da tabela secundária, portanto, os conflitos não são um problema.

## Solução de problemas
<a name="aurora-joins-troubleshooting"></a>

Documentos que faltam registros infantis  
+ Verifique `__versions` o documento. Se a versão de uma tabela secundária estiver ausente, os eventos secundários ainda não foram processados.
+ Verifique se o pipeline está ativo e se a `changeEventsProcessed` métrica é diferente de zero.

Documentos que não aparecem em OpenSearch  
+ Verifique se o registro principal existe na tabela de origem.
+ Verifique se a `tables.include` lista contém todas as tabelas necessárias.
+ Verifique os registros do pipeline quanto a falhas de ingestão e problemas de configuração:`/aws/vendedlogs/{{pipeline-log-group}}`.