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 incorporarlos en un subdocumento. La inserción de datos relacionados permite que tu aplicación haga una query de los datos que necesita con una única operación de lectura y evite 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 aprender más sobre los beneficios de los datos incrustados y las referencias, consulta Enlazar 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í.
Considera las operaciones que identificaste en la carga de trabajo de tu aplicación en el paso Identificar la carga de trabajo de la aplicación. Toma nota de la información que estas operaciones escriben y devuelven, así como de la información que 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).
Tu 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 utilizar referencias depende de las consultas comunes de tu aplicación. Revisa las queries que identificaste en el primer paso del proceso de diseño de esquema y utiliza las pautas mencionadas anteriormente en esta página para diseñar tu 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.