Dưới đây là một số cân nhắc. Cuối cùng, nó phụ thuộc vào yêu cầu của bạn:
-
Xếp hạng là tùy chọn, phải không?
Nếu vậy, hãy tự hỏi bản thân xem bạn có muốn kết hợp một tính năng bắt buộc (lưu trữ liên kết giáo viên / sinh viên) với một tính năng tốt để có hay không. Mã triển khai một tính năng tốt đẹp hiện được ghi vào bộ sưu tập quan trọng nhất của bạn. Tôi nghĩ rằng bạn có thể cải thiện việc phân tách mối quan tâm trong mã của mình với một giản đồ db khác.
-
Bạn có cần nhiều tính năng hơn không ?
Giả sử bạn muốn cung cấp cho sinh viên danh sách xếp hạng mà họ đã đưa ra, xếp hạng trung bình mà sinh viên đã dành cho giáo viên và bạn muốn hiển thị sự phát triển của xếp hạng theo thời gian. Điều này sẽ rất lộn xộn với các tài liệu nhúng. Tài liệu được nhúng kém linh hoạt hơn .
-
Nếu bạn cần hiệu suất đọc cao nhất, bạn cần chuẩn hóa nhiều dữ liệu hơn
Nếu bạn muốn gắn bó với các tài liệu được nhúng, bạn có thể muốn sao chép nhiều dữ liệu hơn. Giả sử có một cái nhìn tổng quan về xếp hạng cho mỗi giáo viên, nơi bạn có thể thấy tên của học sinh. Sẽ rất hữu ích nếu bạn nhúng một đối tượng
{ studentId : ObjectId, rating: string, studentName: string, created: dateTime }
Là các lựa chọn thay thế, hãy xem xét
TeacherRating {
StudentId: id
TeacherId: id
Rating: number
Created: DateTime
}
Hiệp hội giáo viên / học sinh sẽ vẫn được lưu trữ trong đối tượng giáo viên, nhưng xếp hạng nằm trong một bộ sưu tập khác. Không thể tạo xếp hạng nếu không tìm thấy sự liên kết giữa giáo viên và học sinh.
hoặc
TeacherStudentClass {
StudentId: id
TeacherId: id
Class: id
ClassName: string // (denormalized, just an example)
Rating: number // (optional)
Created: DateTime
}
Để tìm tất cả học sinh cho một giáo viên nhất định, trước tiên bạn phải truy vấn tài liệu trình liên kết, sau đó thực hiện $in
truy vấn học sinh và ngược lại. Đó là một truy vấn nữa, nhưng nó đi kèm với sự linh hoạt rất lớn.