Chúng tôi đang lướt qua các mẫu chống mẫu thiết kế lược đồ MongoDB. Cho đến giờ trong loạt bài này, chúng ta đã thảo luận về bốn trong số sáu phản mẫu
Bình thường hóa dữ liệu và chia nhỏ dữ liệu thành các phần khác nhau để tối ưu hóa không gian và giảm trùng lặp dữ liệu có thể giống như bản chất thứ hai đối với những người có nền tảng cơ sở dữ liệu quan hệ. Tuy nhiên, việc tách dữ liệu thường được truy cập cùng nhau thực sự là một phản mẫu trong MongoDB. Trong bài đăng này, chúng ta sẽ tìm hiểu lý do tại sao và thảo luận về những việc bạn nên làm để thay thế
Nếu bạn thích học qua video [hoặc bạn chỉ thích nghe tôi lặp lại, "Dữ liệu được truy cập cùng nhau nên được lưu trữ cùng nhau"], hãy xem video ở trên
Tách dữ liệu được truy cập cùng nhau
Giống như bạn sẽ sử dụng một join
để kết hợp thông tin từ các bảng khác nhau trong cơ sở dữ liệu quan hệ, MongoDB có một thao tác cho phép bạn kết hợp thông tin từ nhiều bảng. $lookup
rất phù hợp cho các hoạt động không thường xuyên, hiếm khi được sử dụng hoặc các truy vấn phân tích có thể chạy qua đêm mà không bị giới hạn thời gian. Tuy nhiên, $lookup
không tuyệt lắm khi bạn thường xuyên sử dụng nó trong các ứng dụng của mình. Tại sao?
Các hoạt động $lookup
chậm và tốn nhiều tài nguyên so với các hoạt động không cần kết hợp dữ liệu từ nhiều bộ sưu tập
Quy tắc ngón tay cái khi lập mô hình dữ liệu của bạn trong MongoDB là
Dữ liệu được truy cập cùng nhau nên được lưu trữ cùng nhau
Thay vì phân tách dữ liệu thường được sử dụng cùng nhau giữa nhiều bộ sưu tập, hãy tận dụng tính năng nhúng và mảng để giữ dữ liệu cùng nhau trong một bộ sưu tập duy nhất
Ví dụ: khi lập mô hình một tệp , bạn có thể nhúng tài liệu từ một bộ sưu tập dưới dạng tài liệu phụ vào tài liệu từ một bộ sưu tập khác. Khi lập mô hình một , bạn có thể nhúng thông tin từ nhiều tài liệu trong một bộ sưu tập dưới dạng một mảng tài liệu trong một bộ sưu tập khác
Nếu việc kết hợp dữ liệu từ các bộ sưu tập riêng biệt thành một bộ sưu tập duy nhất sẽ dẫn đến các mảng lớn, không có giới hạn hoặc tài liệu cồng kềnh, bạn có thể muốn giữ các bộ sưu tập riêng biệt và sao chép một số dữ liệu được sử dụng thường xuyên cùng nhau trong cả hai bộ sưu tập. Bạn có thể sử dụng Mẫu tập hợp con để sao chép một tập hợp con các tài liệu từ một bộ sưu tập này sang một bộ sưu tập khác. Bạn cũng có thể sử dụng Mẫu tham chiếu mở rộng để sao chép một phần dữ liệu trong mỗi tài liệu từ bộ sưu tập này sang bộ sưu tập khác. Trong cả hai mẫu, bạn có tùy chọn tạo tham chiếu giữa các tài liệu trong cả hai bộ sưu tập. Hãy nhớ rằng bất cứ khi nào bạn cần kết hợp thông tin từ cả hai bộ sưu tập, bạn có thể sẽ cần sử dụng $lookup
. Ngoài ra, bất cứ khi nào bạn sao chép dữ liệu, bạn chịu trách nhiệm đảm bảo dữ liệu được sao chép luôn đồng bộ
Như chúng tôi đã nói trong suốt loạt bài này, mỗi trường hợp sử dụng là khác nhau. Khi bạn lập mô hình lược đồ của mình, hãy xem xét cẩn thận cách bạn sẽ truy vấn dữ liệu và dữ liệu bạn sẽ lưu trữ sẽ trông như thế nào trên thực tế
Một bài đăng Anti-Pattern sẽ ra sao nếu không có ví dụ từ Công viên và Giải trí? . Vì vậy, hãy trở lại với Leslie
Leslie quyết định tổ chức một Liên Hợp Quốc kiểu mẫu cho học sinh trung học địa phương và tuyển một số đồng nghiệp của cô ấy cũng tham gia. Mỗi người tham gia sẽ đóng vai trò là đại biểu cho một quốc gia trong sự kiện. Cô chỉ định Andy và Donna làm đại biểu cho Phần Lan
Leslie quyết định lưu trữ thông tin liên quan đến Model United Nations trong cơ sở dữ liệu MongoDB. Cô ấy muốn lưu trữ thông tin sau trong cơ sở dữ liệu của mình
Số liệu thống kê cơ bản về mỗi quốc gia
Danh sách các tài nguyên mà mỗi quốc gia có sẵn để giao dịch
Danh sách đại biểu của mỗi quốc gia
Tuyên bố chính sách cho mỗi quốc gia
Thông tin về từng sự kiện Model United Nations mà cô ấy điều hành
Với thông tin này, cô ấy muốn có thể nhanh chóng tạo các báo cáo sau
Báo cáo quốc gia bao gồm các số liệu thống kê cơ bản, tài nguyên hiện có để giao dịch, danh sách đại biểu, tên và ngày của năm tài liệu chính sách gần đây nhất và danh sách tất cả các sự kiện Mô hình Liên hợp quốc mà quốc gia này đã tham gia
Một báo cáo sự kiện có chứa thông tin về sự kiện và tên của các quốc gia đã tham gia
Sự kiện Model United Nations bắt đầu và Andy rất hào hứng tham gia. Anh ta quyết định không muốn bất kỳ nguồn tài nguyên "nhàm chán" nào của đất nước mình, vì vậy anh ta bắt đầu giao dịch với các quốc gia khác để có được tất cả những con sư tử trên thế giới
Leslie quyết định tạo các bộ sưu tập cho từng loại thông tin mà cô ấy cần lưu trữ trong cơ sở dữ liệu của mình. Sau khi Andy giao dịch xong, Leslie có tài liệu như sau
Khi Leslie muốn tạo một báo cáo về Phần Lan, cô ấy phải sử dụng $lookup
để kết hợp thông tin từ cả năm bộ sưu tập. Cô ấy muốn tối ưu hóa hiệu suất cơ sở dữ liệu của mình, vì vậy, cô ấy quyết định tận dụng tính năng nhúng để kết hợp thông tin từ năm bộ sưu tập của mình thành một bộ sưu tập duy nhất
Leslie bắt đầu làm việc để cải thiện sơ đồ của cô ấy dần dần. Khi cô ấy nhìn vào lược đồ của mình, cô ấy nhận ra rằng cô ấy có mối quan hệ một đối một giữa các tài liệu trong bộ sưu tập Countries
của mình và bộ sưu tập Resources
của cô ấy. Cô ấy quyết định nhúng thông tin từ bộ sưu tập Resources
dưới dạng tài liệu phụ vào các tài liệu trong bộ sưu tập Countries
của mình
Bây giờ tài liệu cho Phần Lan trông giống như sau
Như bạn có thể thấy ở trên, cô ấy đã giữ thông tin về các tài nguyên cùng nhau dưới dạng tài liệu phụ trong tài liệu của mình cho Phần Lan. Đây là một cách dễ dàng để sắp xếp dữ liệu
Cô ấy không cần bộ sưu tập Resources
của mình nữa, vì vậy cô ấy xóa nó đi
Tại thời điểm này, cô ấy có thể truy xuất thông tin về một quốc gia và tài nguyên của quốc gia đó mà không cần phải sử dụng $lookup
Leslie tiếp tục phân tích lược đồ của mình. Cô ấy nhận ra rằng cô ấy có mối quan hệ một-nhiều giữa các quốc gia và đại biểu, vì vậy cô ấy quyết định tạo một mảng có tên $lookup
2 trong tài liệu Countries
của mình. Mỗi mảng $lookup
2 sẽ lưu trữ các đối tượng có thông tin đại biểu. Bây giờ tài liệu của cô ấy cho Phần Lan trông giống như sau
Leslie cảm thấy tự tin về việc lưu trữ thông tin đại biểu trong tài liệu quốc gia của mình vì mỗi quốc gia sẽ chỉ có một số ít đại biểu [có nghĩa là mảng của cô ấy sẽ không phát triển vô hạn] và cô ấy sẽ không thường xuyên truy cập thông tin về các đại biểu riêng biệt từ các quốc gia liên kết của họ
Leslie không còn cần bộ sưu tập $lookup
5 của mình nữa, vì vậy cô ấy đã xóa nó
Leslie tiếp tục tối ưu hóa lược đồ của mình và bắt đầu xem bộ sưu tập $lookup
6 của mình. Cô ấy có mối quan hệ một-nhiều giữa các quốc gia và chính sách. Cô ấy cần đưa tiêu đề và ngày của năm tài liệu chính sách gần đây nhất của mỗi quốc gia vào báo cáo của mình. Cô ấy cân nhắc nhúng tài liệu chính sách vào tài liệu quốc gia của mình, nhưng tài liệu có thể nhanh chóng trở nên khá lớn tùy theo độ dài của chính sách. Cô ấy không muốn rơi vào cái bẫy của Anti-Pattern Tài liệu cồng kềnh, nhưng cô ấy cũng muốn tránh sử dụng $lookup
mỗi khi chạy báo cáo
Leslie quyết định tận dụng Mẫu tập hợp con. Cô ấy lưu tên và ngày của năm tài liệu chính sách gần đây nhất trong tài liệu quốc gia của mình. Cô ấy cũng tạo một tham chiếu đến tài liệu chính sách, vì vậy cô ấy có thể dễ dàng thu thập tất cả thông tin cho từng chính sách khi cần. Cô ấy để nguyên bộ sưu tập $lookup
6 của mình. Cô ấy biết rằng cô ấy sẽ phải duy trì một số thông tin trùng lặp giữa các tài liệu trong bộ sưu tập Countries
và bộ sưu tập $lookup
6, nhưng cô ấy quyết định sao chép một ít thông tin là một sự đánh đổi tốt để đảm bảo truy vấn nhanh.
Tài liệu của cô ấy cho Phần Lan bây giờ giống như sau
Leslie tiếp tục kiểm tra truy vấn của cô ấy cho báo cáo của cô ấy về từng quốc gia. $lookup
cuối cùng cô ấy đã kết hợp thông tin từ bộ sưu tập Countries
và bộ sưu tập $lookup
3. Cô ấy có mối quan hệ nhiều-nhiều giữa các quốc gia và sự kiện. Cô ấy cần có khả năng tạo báo cáo tổng thể về từng sự kiện một cách nhanh chóng, vì vậy cô ấy muốn giữ bộ sưu tập $lookup
3 riêng biệt. Cô ấy quyết định sử dụng Mẫu tham chiếu mở rộng để giải quyết tình trạng khó xử của mình. Cô ấy bao gồm thông tin cô ấy cần về từng sự kiện trong tài liệu quốc gia của mình và duy trì tham chiếu đến tài liệu sự kiện hoàn chỉnh để cô ấy có thể nhận thêm thông tin khi cần. Cô ấy sẽ sao chép ngày sự kiện và chủ đề sự kiện trong cả hai bộ sưu tập Countries
và $lookup
3, nhưng cô ấy cảm thấy thoải mái với điều này vì dữ liệu đó rất khó thay đổi
Sau tất cả các cập nhật của cô ấy, tài liệu của cô ấy cho Phần Lan bây giờ giống như sau
Dữ liệu được truy cập cùng nhau nên được lưu trữ cùng nhau. Nếu bạn sẽ thường xuyên đọc hoặc cập nhật thông tin cùng nhau, hãy cân nhắc việc lưu trữ thông tin cùng nhau bằng cách sử dụng các tài liệu hoặc mảng lồng nhau. Xem xét cẩn thận trường hợp sử dụng của bạn và cân nhắc những lợi ích và hạn chế của việc sao chép dữ liệu khi bạn tập hợp dữ liệu lại với nhau
Hãy chú ý đến một bài đăng về mẫu chống mẫu thiết kế lược đồ MongoDB cuối cùng
Khi bạn đã sẵn sàng xây dựng lược đồ trong MongoDB, hãy xem MongoDB Atlas, cơ sở dữ liệu dưới dạng dịch vụ được quản lý hoàn toàn của MongoDB. Atlas là cách dễ nhất để bắt đầu với MongoDB và có một cấp độ hào phóng, miễn phí mãi mãi