La manera en que usted asigna las relaciones entre las entidades de datos afecta el rendimiento y la escalabilidad de su aplicación.
La forma recomendada de gestionar datos relacionados es incrustarlos en un subdocumento. Incrustar datos relacionados permite a la aplicación consultar los datos que necesita con una sola operación de lectura y evitar la lentitud. $lookup operaciones.
Para algunos casos de uso, puede utilizar una referencia para señalar datos relacionados en una colección separada.
Acerca de esta tarea
Para determinar si debe incrustar datos relacionados o usar referencias, considere la importancia relativa de los siguientes objetivos para su aplicación:
- Mejorar queries en datos relacionados
- Si su aplicación consulta frecuentemente a una entidad para devolver datos sobre otra entidad, incruste los datos para evitar la necesidad de tener operaciones
$lookupfrecuentes. - Mejorar los datos devueltos por diferentes entidades
- Si su aplicación devuelve datos de entidades relacionadas juntas, incruste los datos en una única colección.
- Mejorar el rendimiento de actualización
- Si su aplicación actualiza con frecuencia datos relacionados, considere almacenar los datos en su propia colección y utilizar una referencia para acceder a ellos. Cuando utiliza una referencia, reduce la carga de trabajo de guardado de su aplicación al necesitar actualizar los datos solo en un único lugar.
Para obtener más información sobre los beneficios de los datos y referencias integrados, consulte Vincular datos relacionados.
Pasos
Identifique los datos relacionados en su esquema
Identifique los datos que su aplicación consulta y cómo se relacionan las entidades entre sí.
Considere las operaciones que identificó de la carga de trabajo de su aplicación en el paso "Identificar la carga de trabajo de la aplicación". Observe la información que estas operaciones escriben y devuelven, y qué información se superpone entre varias operaciones.
Cree un mapa de esquema para sus datos relacionados
El mapa de su esquema debería mostrar los campos de datos relacionados y el tipo de relación entre esos campos (uno a uno, uno a muchos, muchos a muchos).
Su mapa de esquema puede parecerse a un modelo entidad-relación.
Elija si desea incrustar datos relacionados o usar referencias
La decisión de incrustar datos o usar referencias depende de las consultas comunes de su aplicación. Revise las consultas identificadas en el primer paso del proceso de diseño del esquema y utilice las directrices mencionadas anteriormente en esta página para diseñar su esquema.
Configure sus bases de datos, colecciones y lógica de aplicaciones para que coincidan con el enfoque que elija.
Ejemplos
Considere el siguiente mapa de esquema para una aplicación de blog:

Los siguientes ejemplos muestran cómo optimizar su esquema para diferentes queries, según las necesidades de su aplicación.
Optimizar queries para artículos
Si su aplicación consulta principalmente artículos para obtener información como el título, incorpore la información relacionada en la colección articles para devolver todos los datos que necesita la aplicación en una sola operación.
El siguiente documento está optimizado para queries sobre artículos:
db.articles.insertOne( { title: "My Favorite Vacation", date: ISODate("2023-06-02"), text: "We spent seven days in Italy...", tags: [ { name: "travel", url: "<blog-site>/tags/travel" }, { name: "adventure", url: "<blog-site>/tags/adventure" } ], comments: [ { name: "pedro123", text: "Great article!" } ], author: { name: "alice123", email: "alice@mycompany.com", avatar: "photo1.jpg" } } )
Optimice queries para artículos y autores
Si su aplicación devuelve la información de los artículos y de los autores por separado, considere almacenar los artículos y los autores en colecciones separadas. Este diseño de esquema reduce el trabajo necesario para devolver la información del autor y le permite devolver solo la información del autor sin incluir campos innecesarios.
En el siguiente esquema, la colección articles contiene un campo authorId, que es una referencia a la colección authors.
Colección de Artículos
db.articles.insertOne( { title: "My Favorite Vacation", date: ISODate("2023-06-02"), text: "We spent seven days in Italy...", authorId: 987, tags: [ { name: "travel", url: "<blog-site>/tags/travel" }, { name: "adventure", url: "<blog-site>/tags/adventure" } ], comments: [ { name: "pedro345", text: "Great article!" } ] } )
Colección de autores
db.authors.insertOne( { _id: 987, name: "alice123", email: "alice@mycompany.com", avatar: "photo1.jpg" } )
Próximos pasos
Después de asignar las relaciones para los datos de su aplicación, el siguiente paso en el proceso de diseño de esquema es aplicar patrones de diseño para optimizar su esquema. Vea Aplicar patrones de diseño.