Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

Modele relacionamentos um-para-muitos com documentos incorporados

Nesta página

  • Visão geral
  • Padrão de documento incorporado
  • Padrão de subconjunto

Esta página descreve um Modelo de dados Realm que usa documento incorporado para descrever um relacionamento de um para muitos entre dados conectados. A incorporação de dados conectados em um único documento pode reduzir o número de operações de leitura necessárias para obter dados. Em geral, você deve estruturar seu esquema para que seu aplicativo receba todas as informações necessárias em uma única operação de leitura.

Considere o seguinte exemplo que associa o usuário e múltiplos relacionamentos de endereço. O exemplo ilustra a vantagem da incorporação sobre a referência se você precisar ver muitas entidades de dados no contexto de outra. Neste relacionamento um-para-muitos entre patron e dados do address , o patron tem múltiplas entidades do address .

No Modelo de dados Realm, os documento address contêm uma referência ao documento patron .

// patron document
{
_id: "joe",
name: "Joe Bookreader"
}
// address documents
{
patron_id: "joe", // reference to patron document
street: "123 Fake Street",
city: "Faketon",
state: "MA",
zip: "12345"
}
{
patron_id: "joe",
street: "1 Some Other Street",
city: "Boston",
state: "MA",
zip: "12345"
}

Se a sua aplicação recuperar frequentemente os dados address com as informações name, a sua aplicação precisará emitir várias query para resolver as referências. Um esquema mais ideal seria incorporar as entidades de dados address nos dados patron , como no documento a seguir:

{
"_id": "joe",
"name": "Joe Bookreader",
"addresses": [
{
"street": "123 Fake Street",
"city": "Faketon",
"state": "MA",
"zip": "12345"
},
{
"street": "1 Some Other Street",
"city": "Boston",
"state": "MA",
"zip": "12345"
}
]
}

Com o Modelo de dados Realm incorporado, sua aplicação pode recuperar as informações completas do usuário com uma query.

Um possível problema com opadrão do documento incorporado do é que ele pode levar a documentos grandes, especialmente se o campo incorporado não estiver limitado. Nesse caso, utilize o padrão de subconjunto para acessar somente os dados exigidos pelo aplicativo, em vez de todo o conjunto de dados incorporados.

Considere um site de comércio eletrônico com uma lista de avaliações de um produto:

{
"_id": 1,
"name": "Super Widget",
"description": "This is the most useful item in your toolbox.",
"price": { "value": NumberDecimal("119.99"), "currency": "USD" },
"reviews": [
{
"review_id": 786,
"review_author": "Kristina",
"review_text": "This is indeed an amazing widget.",
"published_date": ISODate("2019-02-18")
},
{
"review_id": 785,
"review_author": "Trina",
"review_text": "Nice product. Slow shipping.",
"published_date": ISODate("2019-02-17")
},
...
{
"review_id": 1,
"review_author": "Hans",
"review_text": "Meh, it's okay.",
"published_date": ISODate("2017-12-06")
}
]
}

As revisões são classificadas em ordem cronológica inversa. Quando um usuário visita uma página de produto, o aplicativo carrega as dez avaliações mais recentes.

Em vez de armazenar todas as avaliações com o produto, você pode fazer a divisão da collection em duas collection:

  • A collection product armazena informações sobre cada produto, incluindo as dez avaliações mais recentes do produto:

    {
    "_id": 1,
    "name": "Super Widget",
    "description": "This is the most useful item in your toolbox.",
    "price": { "value": NumberDecimal("119.99"), "currency": "USD" },
    "reviews": [
    {
    "review_id": 786,
    "review_author": "Kristina",
    "review_text": "This is indeed an amazing widget.",
    "published_date": ISODate("2019-02-18")
    }
    ...
    {
    "review_id": 777,
    "review_author": "Pablo",
    "review_text": "Amazing!",
    "published_date": ISODate("2019-02-16")
    }
    ]
    }
  • A collection review armazena todas as avaliações. Cada revisão contém uma referência ao produto para o qual foi escrita.

    {
    "review_id": 786,
    "product_id": 1,
    "review_author": "Kristina",
    "review_text": "This is indeed an amazing widget.",
    "published_date": ISODate("2019-02-18")
    }
    {
    "review_id": 785,
    "product_id": 1,
    "review_author": "Trina",
    "review_text": "Nice product. Slow shipping.",
    "published_date": ISODate("2019-02-17")
    }
    ...
    {
    "review_id": 1,
    "product_id": 1,
    "review_author": "Hans",
    "review_text": "Meh, it's okay.",
    "published_date": ISODate("2017-12-06")
    }

Ao armazenar as dez avaliações mais recentes na collection product , somente o subconjunto necessário dos dados gerais é retornado na chamada para a collection product . Se um usuário quiser ver avaliações adicionais, a aplicação fará uma chamada para a collection review .

Dica

Ao considerar onde deverá fazer a divisão dos dados, a parte mais acessada dos dados deverá ficar na collection que a aplicação carrega primeiro. Neste exemplo, a divisão do esquema é em dez revisões porque esse é o número de revisões visíveis na aplicação por padrão.

Dica

Veja também:

Para saber como usar o padrão de subconjunto para modelar relacionamento um-para-um entre collection, consulte Modelar relacionamento um-para-um com documento incorporado.

O uso de documentos menores contendo dados acessados com mais frequência reduz o tamanho geral do conjunto de trabalho. Esses documentos menores resultam no melhor desempenho de leitura para os dados que o aplicativo acessa com mais frequência.

No entanto, o padrão de subconjunto resulta em duplicação de dados. No exemplo, as avaliações são mantidas na collection product e na collection reviews . Devem ser executadas etapas extras para garantir que as avaliações sejam consistentes entre todas as collection. Por exemplo, quando um cliente edita a análise, a aplicação pode precisar realizar duas operações de gravação: uma para atualizar a collection do product e outra para atualizar a collection das reviews .

Você também deve implementar lógica na aplicação para garantir que as avaliações na collection product sejam sempre as dez avaliações mais recentes para esse produto.

Além das avaliações de produtos, o padrão de subconjunto também pode ser uma boa opção para armazenar:

  • Comentário em uma postagem de blog, quando você deseja mostrar apenas os comentários mais recentes ou mais bem avaliados por padrão.

  • Membros do elenco em um filme quando você deseja mostrar apenas os membros do elenco com os maiores papéis por padrão.

← Modelar relacionamentos de um para um com documentos incorporados