Menu Docs

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

Modelar relacionamentos de um para um 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 utiliza documento incorporado para descrever uma relação de um-para-um 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 exemplo a seguir que associa relacionamentos entre usuários e endereços. O exemplo ilustra a vantagem da incorporação sobre a referência se você precisar exibir uma entidade de dados no contexto da outra. Nesta relação um-para-um entre patron e dados address , o address pertence ao patron.

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

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

Se os dados address forem recuperados com frequência com as informações name , com a referência, seu aplicativo precisará emitir várias consultas para resolver a referência. O melhor modelo de dados seria incorporar os dados address nos dados patron , como no documento a seguir:

{
_id: "joe",
name: "Joe Bookreader",
address: {
street: "123 Fake Street",
city: "Faketon",
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 o padrão de documento incorporado é que ele pode levar a documentos grandes contendo campos de que o aplicativo não precisa. Esses dados desnecessários podem causar carga extra em seu servidor e desacelerar as operações de leitura. Em vez disso, utilize o padrão de subconjunto para recuperar o subconjunto de dados acessado com mais frequência em uma única chamada de reconhecimento de data center.

Considere um aplicativo que apresente informações sobre filmes. O banco de dados contém uma coleção de movie com o seguinte esquema:

{
"_id": 1,
"title": "The Arrival of a Train",
"year": 1896,
"runtime": 1,
"released": ISODate("01-25-1896"),
"poster": "http://ia.media-imdb.com/images/M/MV5BMjEyNDk5MDYzOV5BMl5BanBnXkFtZTgwNjIxMTEwMzE@._V1_SX300.jpg",
"plot": "A group of people are standing in a straight line along the platform of a railway station, waiting for a train, which is seen coming at some distance. When the train stops at the platform, ...",
"fullplot": "A group of people are standing in a straight line along the platform of a railway station, waiting for a train, which is seen coming at some distance. When the train stops at the platform, the line dissolves. The doors of the railway-cars open, and people on the platform help passengers to get off.",
"lastupdated": ISODate("2015-08-15T10:06:53"),
"type": "movie",
"directors": [ "Auguste Lumière", "Louis Lumière" ],
"imdb": {
"rating": 7.3,
"votes": 5043,
"id": 12
},
"countries": [ "France" ],
"genres": [ "Documentary", "Short" ],
"tomatoes": {
"viewer": {
"rating": 3.7,
"numReviews": 59
},
"lastUpdated": ISODate("2020-01-09T00:02:53")
}
}

Atualmente, a collection movie contém vários campo que a aplicação não precisa para mostrar uma visão geral simples de um filme, como fullplot e informações de classificação. Em vez de armazenar todos os dados do filme em uma única collection, você pode fazer a divisão da collection em duas collections:

  • A collection movie contém informações básicas sobre um filme. Esses são os dados que o aplicativo carrega por padrão:

    // movie collection
    {
    "_id": 1,
    "title": "The Arrival of a Train",
    "year": 1896,
    "runtime": 1,
    "released": ISODate("1896-01-25"),
    "type": "movie",
    "directors": [ "Auguste Lumière", "Louis Lumière" ],
    "countries": [ "France" ],
    "genres": [ "Documentary", "Short" ],
    }
  • A coleção movie_details contém dados adicionais acessados com menos frequência para cada filme:

    // movie_details collection
    {
    "_id": 156,
    "movie_id": 1, // reference to the movie collection
    "poster": "http://ia.media-imdb.com/images/M/MV5BMjEyNDk5MDYzOV5BMl5BanBnXkFtZTgwNjIxMTEwMzE@._V1_SX300.jpg",
    "plot": "A group of people are standing in a straight line along the platform of a railway station, waiting for a train, which is seen coming at some distance. When the train stops at the platform, ...",
    "fullplot": "A group of people are standing in a straight line along the platform of a railway station, waiting for a train, which is seen coming at some distance. When the train stops at the platform, the line dissolves. The doors of the railway-cars open, and people on the platform help passengers to get off.",
    "lastupdated": ISODate("2015-08-15T10:06:53"),
    "imdb": {
    "rating": 7.3,
    "votes": 5043,
    "id": 12
    },
    "tomatoes": {
    "viewer": {
    "rating": 3.7,
    "numReviews": 59
    },
    "lastUpdated": ISODate("2020-01-29T00:02:53")
    }
    }

Esse método melhora o desempenho da leitura porque exige que o aplicativo leia menos dados para atender à sua solicitação mais comum. O aplicativo pode fazer uma chamada de banco de dados adicional para buscar os dados acessados com menos frequência, se necessário.

Dica

Ao considerar onde deverá dividir os dados, a parte mais acessada dos dados deverá ficar na coleção que o aplicativo carrega primeiro.

Dica

Veja também:

Para saber como usar o padrão de subconjunto para modelar relacionamentos um-para-muitos entre coleções, consulte Modelar relacionamentos um-para-muitos com documentos incorporados.

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 e deixam mais memória disponível para o aplicativo.

No entanto, é importante conhecer a aplicação e saber como ela carrega os dados. Se você fizer a divisão dos seus dados em várias collection incorretamente, normalmente a aplicação precisará fazer várias viagens ao reconhecimento de data center e confiar em operações de JOIN para recuperar todos os dados necessários.

Além disso, a divisão dos dados em muitas collection pequenas pode aumentar a manutenção necessária do reconhecimento de data center, pois pode tornar-se difícil rastrear quais dados são armazenados em qual collection.

← Modelar relacionamentos entre documentos