MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

chỉnh sửa mối quan hệ N-N của các subocments trong mongodb

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kết nối với MongoDB không thành công khi sử dụng .NET Core chạy trên Linux

  2. làm thế nào để chuyển các biến $ tid, $ id vào hàm raw?

  3. giới hạn và sắp xếp từng nhóm theo mongoDB bằng cách sử dụng tổng hợp

  4. Meteor:Mã thoát mongo không mong muốn 100. Đang khởi động lại. Không thể khởi động máy chủ mongo

  5. Hợp tác tải chậm MongoDB với Jackson @JsonIgnore trong SpringBoot Rest Controller