Embedding cho 1:1/1:few data truy cập cùng nhau (1 query, nhanh); referencing cho M:N, data update độc lập; giới hạn 16MB/document — embed quá nhiều sẽ hit limit.
- Embedding (nested document): dùng khi data được truy cập cùng nhau thường xuyên (one query, no joins), quan hệ 1:1 hoặc 1:few, data ít thay đổi, subdocuments không cần exist độc lập.
- Giới hạn quan trọng: MongoDB document size limit là 16MB — embedding quá nhiều dẫn đến hit limit.
- Referencing (separate documents với ObjectId): dùng khi data lớn, quan hệ many-to-many, data được truy cập/update độc lập — nhưng cần $lookup (LEFT JOIN) hoặc application-side join, tốn thêm round trip.
- Data duplication trade-off: embedding duplicate data (ví dụ user info trong mỗi order document) — read nhanh hơn nhưng update tốn công (phải update nhiều documents).
- Schema design patterns: Bucket pattern — nhóm time-series data vào buckets (ví dụ nhóm sensor readings theo giờ thay vì một document per reading) để giảm document count; Outlier pattern — handle edge cases riêng khi 90% documents nhỏ nhưng 10% có thể rất lớn (ví dụ celebrity posts có millions of likes). $lookup performance: thêm index trên lookup field, tránh $lookup trong large collections không có index.