Implementing Schema Design Patterns

1. Using Attribute Pattern

AspectDetail
Use whenMany similar fields with sparse values
FormArray of {k, v} pairs
Index{"attrs.k": 1, "attrs.v": 1}
{ _id, attrs: [ {k: "color", v: "red"}, {k: "size", v: "M"} ] }

2. Using Bucket Pattern

AspectDetail
Use whenTime-series / IoT data
FormOne doc per (entity, time-bucket) with array of measurements
BenefitFewer docs, better compression
Modern alternativeTime Series Collections (built-in)

3. Using Computed Pattern

AspectDetail
Use whenExpensive aggregations done frequently
FormStore pre-computed values (totals, counts)
MaintenanceUpdate on write or via change streams

4. Using Document Versioning Pattern

AspectDetail
Use whenAudit trail / time travel needed
FormCurrent doc + history collection of prior versions
TriggersChange streams write to history

5. Using Extended Reference Pattern

AspectDetail
Use whenReference + frequently-accessed fields
FormStore ref id + duplicated hot fields (name, avatar)
DrawbackMust update on source change

6. Using Outlier Pattern

AspectDetail
Use whenMost docs are small, a few huge
FormFlag outliers; overflow into linked collection
BenefitKeeps common path fast

7. Using Polymorphic Pattern

AspectDetail
Use whenSimilar but varied entities (vehicles: car/bike/truck)
FormSingle collection, type field, varied fields per type
IndexesOn type + common queryable fields

8. Using Subset Pattern

AspectDetail
Use whenEmbedded array too large; only top-N needed for typical reads
FormTop-N embedded + full set in separate collection

9. Using Tree Patterns

PatternBest For
Parent referenceSimple insert, no descendants query without $graphLookup
Child referencesEasy descendants, hard insert
Array of ancestorsEasy ancestor & descendants
Materialized pathPath string ("/a/b/c"); fast prefix queries
Nested setsRead-heavy, rare changes

10. Using Schema Versioning Pattern

AspectDetail
FormAdd schema_version field
MigrationLazy upgrade on read OR batch update
CodeHandle multiple versions in app layer