Quyết định theo cách truy cập dữ liệu và giới hạn tăng trưởng, không theo cảm tính "NoSQL thì embed".
Embed khi: dữ liệu con luôn được đọc cùng cha, số lượng có trần, và ít cập nhật riêng lẻ.
js
// đơn hàng: item luôn đọc cùng đơn, số dòng có trần, giá đã snapshot
{ _id, userId, items: [{ sku, name, price, qty }], total, status }Tách reference khi: dữ liệu con tăng không giới hạn, cần phân trang riêng, hoặc được truy vấn độc lập.
js
// bình luận: tăng vô hạn, cần phân trang, cần query theo tác giả
{ _id, postId, authorId, body, createdAt } // index { postId: 1, createdAt: -1 }Với bài viết + bình luận, cách thường dùng là lai: embed 3-5 comment mới nhất để render trang chi tiết trong một lần đọc, phần còn lại nằm ở collection comments và tải khi người dùng bấm "xem thêm".
Câu hỏi tự kiểm tra: "Dữ liệu này có bao giờ được đọc mà không cần cha không?" Nếu có, khả năng cao nên tách.