Elegir entre embedding y referencing no consiste en seguir una regla universal. La decisión debe partir de los access patterns, el ownership, la cardinalidad, el crecimiento y las garantías que necesita la operación.
Texto
¿Se leen juntos?
¿Se modifican juntos?
¿Comparten lifecycle?
¿El crecimiento está acotado?
¿Se necesita atomicidad?
¿La duplicación tiene una política clara?
Un mismo dominio puede combinar ambas estrategias. De hecho, los modelos más sólidos suelen hacerlo.
dominio
↓
access patterns
↓
ownership y lifecycle
↓
cardinalidad y crecimiento
↓
atomicidad y consistencia
↓
embedding, reference o combinación
No se decide observando únicamente el diagrama de entidades. Dos relaciones one-to-many pueden necesitar modelos distintos porque sus lecturas, cambios y crecimiento son diferentes.
Pregunta cómo será el documento después de años, no solo al crearlo.
Texto
10 elementos hoy
→ 1.000 en un año
→ 100.000 en un tenant outlier
Un array sin límite conocido es una señal fuerte para separar, aplicar buckets o conservar solo un subset.
También importa la frecuencia de cambio. Un array pequeño actualizado miles de veces por segundo puede ser más problemático que uno mayor pero casi inmutable.
Duplicar un dato casi inmutable puede ser barato. Duplicar un valor que cambia constantemente en millones de documentos puede crear fan-out operativo.
Ejemplo:
Texto
category.name cambia rara vez
→ duplicación parcial podría ser viable
inventory.stock cambia continuamente
→ no debe copiarse en cada documento consumidor
Embedding puede hacer autosuficiente el documento, pero también aumentar tamaño y transferencia.
Si una query necesita solo tres campos de un documento de varios megabytes, la proyección reduce payload, aunque el diseño del documento y el coste interno siguen importando.
Separar datos grandes que se usan raramente puede mejorar el hot path. Por ejemplo, un perfil básico y un historial extenso pueden tener boundaries distintos.
Un modelo optimizado para operaciones no tiene que resolver cualquier reporte de forma perfecta.
Embeber snapshots puede facilitar auditoría histórica. Referenciar current state puede facilitar administración central. Para analytics complejos pueden utilizarse pipelines, colecciones derivadas, exports o sistemas especializados.
No sacrifiques el hot path por reportes poco frecuentes sin evaluar alternativas.
La colección comments conserva la relación completa. recentComments es un subset derivado y commentCount un computed value. Debe definirse cómo se actualizan y reconcilian.
Embedding y referencing son herramientas complementarias. La mejor decisión hace explícitos lectura, escritura, crecimiento, consistencia y operación. Un buen modelo no busca pureza; busca que los datos representen correctamente el dominio y sirvan el workload con costes conocidos.
Comprueba lo aprendido
¿Por qué order.items y product.stock suelen requerir estrategias distintas?
¿Qué diferencia existe entre duplicar un snapshot y duplicar current state?
¿Cómo modelarías comentarios ilimitados mostrando tres recientes?
¿Qué factores podrían volver un documento hotspot?
¿Cuándo una transacción es razonable y cuándo puede indicar un boundary trasladado desde SQL?
¿Cómo influye una futura shard key en esta decisión?