Dựa trên thông tin bạn đã cung cấp, tôi đề xuất hai cách tiếp cận khả thi, bắt đầu từ cùng một nền tảng:
Tôi muốn giới thiệu cách tiếp cận này nếu:
- Bạn có một số lượng lớn tài liệu bài viết cũng như các định dạng văn bản
-
Bạn muốn có thể quản lý cả hai thực thể một cách độc lập, đồng thời đồng bộ hóa các tham chiếu giữa chúng
// articles collection schema { "_id": ..., "title": "I am an article", ... "platforms": [ "platform_1", "platform_2", "platform_3" ], ... } // platforms collection schema { "_id": "platform_1", "name": "Platform 1", "url": "http://right/here", ... }, { "_id": "platform_2", "name": "Platform 2", "url": "http://right/here", ... }, { "_id": "platform_3", "name": "Platform 3", "url": "http://right/here", ... }
Ngay cả khi cách tiếp cận này khá linh hoạt, thì nó cũng phải trả giá - nếu bạn yêu cầu cả dữ liệu bài viết và nền tảng, bạn sẽ phải kích hoạt nhiều truy vấn hơn đến phiên bản MongoDB của mình, vì dữ liệu được chia thành hai bộ sưu tập khác nhau.
Ví dụ:khi tải một trang bài viết, bạn cũng muốn hiển thị danh sách platforms
, bạn sẽ phải kích hoạt một truy vấn tới articles collection
và sau đó cũng kích hoạt tìm kiếm trên platforms collection
để truy xuất tất cả các thực thể nền tảng mà bài báo đó được xuất bản thông qua các thành viên của nền tảng platform
mảng s trên article document
.
Tuy nhiên, nếu bạn chỉ có một tập hợp con nhỏ các thuộc tính nền tảng platform attributes
mà bạn cần có sẵn khi tải article document
, bạn có thể nâng cao platforms
mảng trên articles collection
để lưu trữ các thuộc tính đó ngoài _id
tham khảo các tài liệu nền tảng:
// enhanced articles collection schema
{
"_id": ...,
"title": "I am an article",
...
"platforms": [
{platform_id: "platform_1", name: "Platform 1"},
{platform_id: "platform_2", name: "Platform 2"},
{platform_id: "platform_3", name: "Platform 3"}
],
...
}
Phương pháp kết hợp này sẽ phù hợp nếu platform data attributes
mà bạn thường xuyên truy xuất để hiển thị cùng với dữ liệu cụ thể của bài viết không thường xuyên thay đổi.
Nếu không, bạn sẽ phải đồng bộ hóa tất cả các cập nhật được thực hiện cho các thuộc tính tài liệu nền tảng platform
trong platforms collection
với tập hợp con các thuộc tính mà bạn theo dõi như một phần của mảng nền tảng cho tài liệu bài viết.
Về việc quản lý danh sách bài viết cho các nền tảng riêng lẻ, tôi không khuyên bạn nên lưu trữ các tham chiếu N-to-N trong cả hai bộ sưu tập, vì cơ chế nói trên đã cho phép bạn trích xuất danh sách bài viết bằng cách truy vấn articles collection
sử dụng truy vấn tìm với _id
giá trị của platform document
:
Approach #1
db.articles.find({"platforms": "platform_1"});
Approach #2:
db.articles.find({"platforms.platform_id": "platform_1"});
Sau khi trình bày hai cách tiếp cận khác nhau, những gì tôi muốn giới thiệu bây giờ là để bạn phân tích các mẫu truy vấn và ngưỡng hiệu suất của ứng dụng của bạn và đưa ra quyết định có tính toán dựa trên các tình huống mà bạn gặp phải.