Skip to content

Latest commit

 

History

History
180 lines (146 loc) · 7.64 KB

modelar-relaciones-de-uno-a-varios-con-documentos-incrustados.md

File metadata and controls

180 lines (146 loc) · 7.64 KB

Modelar relaciones de uno a varios con documentos incrustados

Descripción general

Esta página describe un modelo de datos que utiliza documentos incrustados para describir una relación de uno a varios entre los datos conectados. Incrustar 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 requerida en una sola operación de lectura.

Patrón de documento incrustado

Considere el siguiente ejemplo que mapea las relaciones entre usuarios y direcciones múltiples. El ejemplo ilustra la ventaja de incrustar sobre las referencias si necesita ver muchas entidades de datos en el contexto de otra. En esta relación de uno a muchos entre patrony addressdatos, el patrontiene varias addressentidades.

En el modelo de datos normalizado, los addressdocumentos contienen una referencia al patrondocumento.

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

Si su aplicación recupera con frecuencia los addressdatos con la nameinformación, entonces su aplicación necesita emitir múltiples consultas para resolver las referencias. Un esquema más óptimo sería incrustar las addressentidades de datos en los patrondatos, como en el siguiente documento:

{
   "_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"
                }
              ]
 }

Con el modelo de datos integrado, su aplicación puede recuperar la información completa del usuario con una sola consulta.

Patrón de subconjunto

Un problema potencial con el patrón de documento incrustado es que puede dar lugar a documentos grandes, especialmente si el campo incrustado no está acotado. En este caso, puede usar el patrón de subconjunto para acceder solo a los datos que requiere la aplicación, en lugar del conjunto completo de datos incrustados.

Considere un sitio de comercio electrónico que tenga una lista de reseñas de un producto:

{
  "_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")
    }
  ]
}

Las reseñas están ordenadas en orden cronológico inverso. Cuando un usuario visita la página de un producto, la aplicación carga las diez reseñas más recientes.

En lugar de almacenar todas las reseñas con el producto, puede dividir la colección en dos colecciones:

  • La productcolección almacena información sobre cada producto, incluidas las diez revisiones más recientes del producto:
{
  "_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": 776,
      "review_author": "Pablo",
      "review_text": "Amazing!",
      "published_date": ISODate("2019-02-16")
    }
  ]
}
  • La reviewcolección almacena todas las reseñas. Cada reseña contiene una referencia al producto para el que fue 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")
}

Al almacenar las diez revisiones más recientes en la product colección, solo el subconjunto requerido de los datos generales se devuelve en la llamada a la productcolección. Si un usuario desea ver reseñas adicionales, la aplicación realiza una llamada a la review colección.

CONSEJO

Al considerar dónde dividir sus datos, la parte de los datos a la que se accede con mayor frecuencia debe ir a la colección que la aplicación carga primero. En este ejemplo, el esquema se divide en diez revisiones porque ese es el número de revisiones visibles en la aplicación de forma predeterminada.

CONSEJO

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

Compensaciones del patrón de subconjunto

El uso de documentos más pequeños que contienen datos a los que se accede con más frecuencia reduce el tamaño general del conjunto de trabajo. Estos documentos más pequeños dan como resultado un rendimiento de lectura mejorado para los datos a los que la aplicación accede con más frecuencia.

Sin embargo, el patrón de subconjunto da como resultado la duplicación de datos. En el ejemplo, las reseñas se mantienen tanto en la productcolección como en la reviewscolección. Deben tomarse medidas adicionales para garantizar que las revisiones sean coherentes entre cada recopilación. Por ejemplo, cuando un cliente edita su reseña, es posible que la aplicación deba realizar dos operaciones de escritura: una para actualizar la productcolección y otra para actualizar la reviewscolección.

También debe implementar la lógica en su aplicación para asegurarse de que las reseñas de la productcolección sean siempre las diez reseñas más recientes de ese producto.

Otros casos de uso de muestra

Además de las reseñas de productos, el patrón de subconjunto también puede ser una buena opción para almacenar:

  • Comentarios en una publicación de blog, cuando solo desea mostrar los comentarios más recientes o mejor calificados de forma predeterminada.
  • Miembros del elenco en una película, cuando solo quieres mostrar a los miembros del elenco con los roles más grandes de forma predeterminada.