Modele relacionamentos um-para-muitos com documentos incorporados
Visão geral
Esta página descreve um modelo de dados que usa documentosincorporados 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 aplicação receba todas as informações necessárias em uma única operação de leitura.
Padrão de documento incorporado
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.
Padrão de subconjunto
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 aplicação, 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.
Trocas do padrão de subconjunto
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.
Outros exemplos de casos de uso
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.