Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /
Relaciones de documentos

Modelar relaciones uno a uno con documentos incrustados

Esta página describe un modelo de datos que usa documentos incrustados para describir una relación uno a uno entre datos conectados. La integración de datos conectados en un solo documento puede reducir el número de operaciones de lectura necesarias para obtener datos. En general, debe estructurar su esquema para que su aplicación reciba toda la información que requiere en una sola operación de lectura.

Considera el siguiente ejemplo que asigna relaciones entre beneficiario y dirección. El ejemplo ilustra la ventaja de incrustar sobre la referencia si se necesita ver una entidad de datos en el contexto de otra. En esta relación uno a uno entre patron y los datos address, el address pertenece al patron.

En el modelo de datos normalizado, el documento address contiene una referencia al 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"
}

Si los datos de address se recuperan con frecuencia junto con la información de name, al referenciar, tu aplicación debe emitir varias consultas para resolver la referencia. El mejor modelo de datos sería incrustar los datos address en los datos patron, como en el siguiente documento:

{
_id: "joe",
name: "Joe Bookreader",
address: {
street: "123 Fake Street",
city: "Faketon",
state: "MA",
zip: "12345"
}
}

Con el modelo de datos embebido, tu aplicación puede recuperar la información completa del cliente con una sola query.

Un problema potencial con el patrón de documento incrustado es que puede conducir a documentos grandes que contienen campos que la aplicación no necesita. Estos datos innecesarios pueden provocar una carga extra en tu servidor y ralentizar las operaciones de lectura. En su lugar, puede utilizar el patrón de subconjunto para recuperar el subconjunto de datos a los que se accede con mayor frecuencia en una sola llamada a la base de datos.

Considera una aplicación que muestre información sobre películas. La base de datos contiene una colección movie con el siguiente 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")
}
}

Actualmente, la colección movie contiene varios campos que la aplicación no necesita para mostrar una visión general sencilla de una película, como la fullplot y la información de valoración. En lugar de almacenar todos los datos de la película en una sola colección, puedes dividir la colección en dos colecciones:

  • La colección movie contiene información básica sobre una película. Estos son los datos que la aplicación carga por defecto:

    // 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" ],
    }
  • La colección movie_details contiene datos adicionales a los que se accede con menos frecuencia para cada película:

    // 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")
    }
    }

Este método mejora el rendimiento de lectura porque requiere que la aplicación lea menos datos para satisfacer su solicitud más común. La aplicación puede hacer una llamada adicional a la base de datos para obtener los datos a los que se accede con menos frecuencia si es necesario.

Tip

Al considerar dónde dividir los datos, la porción de datos que se accede con mayor frecuencia debe ir en la colección que la aplicación carga primero.

Tip

Para aprender a usar el patrón de subconjunto para modelar relaciones uno-a-muchos entre colecciones, consulta Modelar relaciones uno-a-muchos con documentos incrustados.

Utilizar documentos más pequeños que contengan datos de acceso más frecuente reduce el tamaño total del conjunto de trabajo. Estos documentos más pequeños mejoran el desempeño de lectura y hacen que haya más memoria disponible para la aplicación.

Sin embargo, es importante entender su aplicación y la forma en que carga los datos. Si divides tus datos en varias colecciones de manera incorrecta, tu aplicación a menudo necesitará realizar múltiples viajes a la base de datos y depender de operaciones JOIN para recuperar todos los datos que necesita.

Además, dividir tus datos en varias colecciones más pequeñas puede aumentar el mantenimiento requerido en la base de datos, ya que podría llegar a ser difícil rastrear qué datos se almacenan en qué colección.

Volver

Relaciones de documentos

En esta página