Hướng dẫn embedded mongodb - mongodb nhúng

Tính linh hoạt để xác định lược đồ của bạn theo bất kỳ cách nào hoạt động cho bất kỳ ứng dụng nào là đặc điểm xác định của cơ sở dữ liệu tài liệu như MongoDB và các tài liệu làm tổ trong nhau là một kỹ thuật chính để tạo các lược đồ tối ưu. Thay vì xây dựng ứng dụng của bạn để phù hợp với mô hình dữ liệu được xác định nghiêm ngặt, bạn có thể xây dựng một mô hình dữ liệu phù hợp với chức năng sử dụng và chức năng ứng dụng của bạn.

Các tài liệu nhúng trong MongoDB là gì?

Trong một cơ sở dữ liệu quan hệ, bạn lưu trữ từng thực thể riêng lẻ trong bảng riêng của mình và liên kết chúng với nhau thông qua các khóa nước ngoài. Mặc dù MongoDB chắc chắn hỗ trợ các tài liệu tham khảo từ tài liệu này sang tài liệu khác và thậm chí cả đa tài liệu tham gia, nhưng đó là một sai lầm khi sử dụng cơ sở dữ liệu tài liệu giống như cách bạn sử dụng một tài liệu quan hệ.

Ví dụ, hãy để Lôi nhìn vào một cấu trúc đơn giản với người dùng và địa chỉ của họ. Một cách để cấu trúc mối quan hệ giữa hai thực thể là sử dụng các tài liệu tham khảo:

> db.user.findOne()
{
    _id: 111111,
    email: “”,
    name: {given: “Jane”, family: “Han”},
}

> db.address.find({user_id: 111111})
{
    _id: 121212,
    street: “111 Elm Street”,
    city: “Springfield”,
    state: “Ohio”,
    country: “US”,
    zip: “00000”
}

Tuy nhiên, nếu địa chỉ này chỉ được truy cập liên quan đến người dùng này hoặc cần thường xuyên cùng lúc với người dùng, thì nó đơn giản hơn nhiều khi chỉ nhúng tài liệu địa chỉ vào tài liệu người dùng, như SO:


> db.user.findOne({_id: 111111})
    
{    
    _id: 111111,    
    email: “”,    
    name: {given: “Jane”, family: “Han”},    
    address: {    
    street: “111 Elm Street”,    
    city: “Springfield”,    
    state: “Ohio”,    
    country: “US”,    
    zip: “00000”,    
    }    
}

Bây giờ, thay vì phải thực hiện một truy vấn riêng đối với bộ sưu tập địa chỉ để truy xuất địa chỉ Jane Han, bạn có thể truy cập nó dưới dạng tài liệu phụ của hồ sơ người dùng của cô ấy.

Lưu trữ nhiều địa chỉ cũng đơn giản tương tự:

> db.user.findOne({_id: 111111})
    
{    
    _id: 111111,    
    email: “”,    
    name: {given: “Jane”, family: “Han”},    
    addresses: [    
    {    
    label: “Home”,    
    street: “111 Elm Street”,    
    city: “Springfield”,    
    state: “Ohio”,    
    country: “US”,    
    zip: “00000”,    
    },    
    {label: “Work”, ...}    
    ]    
}

Bạn thậm chí có thể cập nhật các địa chỉ riêng lẻ, sử dụng toán tử vị trí:

> db.user.update(    
    {_id: 111111,    
    “addresses.label”: “Home”},    
    {$set: {“addresses.$.street”: “112 Elm Street”}}    
    )

Lưu ý rằng bạn cần bao bọc bất kỳ truy vấn hoặc khóa cập nhật nào có chứa dấu chấm (như địa chỉ trên mạng. Phần truy vấn của bản cập nhật cần bao gồm trường mảng mà bạn đang cập nhật và sau đó bản cập nhật sẽ áp dụng cho phần tử đầu tiên khớp với mảng.

Tại sao (và khi nào) bạn nên thích nhúng vào tham chiếu

Các tài liệu nhúng là một cách hiệu quả và sạch sẽ để lưu trữ dữ liệu liên quan, đặc biệt là dữ liệu mà thường xuyên truy cập cùng nhau. Nói chung, khi thiết kế các lược đồ cho MongoDB, bạn nên thích nhúng theo mặc định và sử dụng các tài liệu tham khảo và phía ứng dụng hoặc phía cơ sở dữ liệu chỉ tham gia khi chúng có giá trị. Khối lượng công việc thường xuyên hơn có thể lấy một tài liệu duy nhất và có tất cả dữ liệu cần thiết, ứng dụng của bạn sẽ có hiệu suất cao hơn.

Có một vài mẫu khác nhau để nhúng:

Mẫu tài liệu nhúng

Đây là mô hình chung của việc thích nhúng các cấu trúc phụ phức tạp trong các tài liệu mà họ đã sử dụng. Quy tắc điển hình là:

Những gì bạn sử dụng cùng nhau, lưu trữ cùng nhau.

Mẫu tập hợp con nhúng

Một trường hợp lai, mẫu tập hợp con xuất hiện khi bạn có một bộ sưu tập riêng cho một danh sách rất dài các mục liên quan, nhưng bạn muốn giữ một số mục đó một cách dễ dàng để hiển thị cho người dùng. Hãy nhìn vào một ví dụ:

> db.movie.findOne()
    
{    
    _id: 333333,    
    title: “The Big Lebowski”
}
        
> db.review.find({movie_id: 333333})
    
{    
    _id: 454545,    
    movie_id: 333333,    
    stars: 3    
    text: “it was OK”    
}    

{    
    _id: 565656,    
    movie_id: 333333,    
    stars:5,    
    text: “the best”    
}    
...

Bây giờ hãy tưởng tượng bạn có hàng ngàn đánh giá, nhưng bạn luôn hiển thị hai bài gần đây nhất khi bạn hiển thị một bộ phim. Trong trường hợp này, thật hợp lý khi lưu trữ tập hợp con đó như một danh sách trên tài liệu phim.

> db.movie.findOne({_id: 333333})
    
{    
    _id: 333333,    
    title: “The Big Lebowski”,    
    recent_reviews: [    
    {_id: 454545, stars: 3, text: “it was OK”},    
    {_id: 565656, stars: 5, text: “the best”}    
    ]    
}

Nếu bạn thường xuyên truy cập một tập hợp các mục liên quan, hãy nhúng tập hợp con đó.

Mẫu tham chiếu mở rộng

Một trường hợp lai khác được gọi là tham chiếu mở rộng. Nó có phần giống như mẫu tập hợp con, trong đó nó tối ưu hóa một lượng nhỏ thông tin thường xuyên được truy cập để được lưu trữ trên tài liệu nơi nó cần. Trong trường hợp này, thay vì một danh sách, nó được sử dụng khi một tài liệu đề cập đến một tài liệu khác trong bộ sưu tập của riêng nó, nhưng cũng lưu trữ một số trường từ tài liệu khác để dễ truy cập.

Example:

> db.movie.findOne({_id: 444444})
    
{    
    _id: 444444,    
    title: “One Flew Over the Cuckoo's Nest”,    
    studio_id: 999999,    
    studio_name: “Fantasy Films”    
}

Như bạn có thể thấy, studio_id được lưu trữ để bạn có thể tìm kiếm thêm thông tin trên studio làm phim, nhưng tên studio cũng được sao chép vào tài liệu này để dễ trưng bày. Lưu ý rằng nếu bạn nhúng thông tin từ các tài liệu thay đổi thường xuyên, bạn cần nhớ cập nhật các tài liệu nơi bạn đã sao chép thông tin đó khi nó thay đổi.

Nếu bạn thường xuyên truy cập một vài trường từ một tài liệu được tham chiếu, hãy nhúng các trường đó.

Danh sách không giới hạn

Lưu trữ danh sách ngắn các thông tin liên quan trong tài liệu mà chúng thuộc về ý nghĩa to lớn, nhưng nếu danh sách của bạn có thể phát triển không được kiểm soát, việc đưa nó vào một tài liệu không chỉ không khôn ngoan, thì nó không thể thực hiện được! MongoDB có giới hạn kích thước của một tài liệu, nhưng cũng vậy, nếu tài liệu được truy cập với bất kỳ tần số nào, bạn sẽ bắt đầu thấy tác động tiêu cực từ việc sử dụng bộ nhớ quá mức.

Nếu một danh sách có thể phát triển một cách không giới hạn, hãy đặt nó vào bộ sưu tập của riêng nó.

Truy cập độc lập

Một lần khác, bạn nên lưu trữ các công cụ phụ trong bộ sưu tập của riêng họ là khi bạn muốn truy cập chúng một cách độc lập với tài liệu mẹ mà bạn sẽ làm tổ chúng. Ví dụ, hãy xem xét một sản phẩm do một công ty sản xuất. Nếu công ty chỉ bán một số ít sản phẩm, bạn có thể muốn lưu trữ chúng như một phần của tài liệu công ty. Tuy nhiên, nếu bạn muốn truy cập trực tiếp các sản phẩm đó bằng SKU hoặc sử dụng lại chúng trên khắp các công ty, bạn cũng muốn lưu trữ chúng trong bộ sưu tập của riêng họ.

Nếu bạn thường xuyên truy cập hoặc thao túng một thực thể một cách độc lập, hãy đặt nó vào bộ sưu tập của riêng nó.

Xem thêm

Nhúng biểu đồ MongoDB trong các ứng dụng tùy chỉnh.

Thử nghiệm tích hợp với khởi động mùa xuân và MongoDB nhúng

Nội dung liên quan:

  • Hướng dẫn dành cho người mới bắt đầu: Cơ bản MongoDB
  • 5 thực hành tốt nhất cho bảo mật MongoDB
  • Sao chép trong MongoDB là gì?
  • Sử dụng các giao dịch axit trong MongoDB
  • Ví dụ mongoDB