Các cách Document có mối liên quan với nhau được gọi là Relationship trong MongoDB. Quan hệ có thể được mô hình hóa bằng các Embedded (lồng đối tượng) hoặc Referenced (tham chiếu).

Có một vài cách để hiện thực hóa Relationship trong MongoDB, trong bài viết này chúng ta sẽ tìm hiểu về các nội dung sau:

  • Mô hình 1-1 sử dụng Embedded Documents
  • Mô hình 1-N sử dụng Embedded Documents
  • Mô hình 1-N sử dụng Document References

1. Mô hình hóa 1-1 với Embedded Documents

Với phương pháp Embedded, chúng ta sẽ nhúng thông tin một thuộc tính của Document vào một Document khác. Ví dụ như nhúng một address document vào trong một user document.

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address": [
      {
         "building": "22 A, Indiana Apt",
         "pincode": 123456,
         "city": "Los Angeles",
         "state": "California"
      },
      {
         "building": "170 A, Acropolis Apt",
         "pincode": 456789,
         "city": "Chicago",
         "state": "Illinois"
      }]
} 

Phương pháp này tạo ra một model sử dụng một Document được nhúng vào trong nó để miêu tả một mối quan hệ 1-1 giữa các dữ liệu được kết nối với nhau. Việc nhúng các dữ liệu liên quan vào chung một document có thể làm giảm số lượng các thao tác đọc yêu cầu chúng ta phải lấy dữ liệu. Nói chung, cấu trúc schema có thể cho phép chương trình của chúng ta có thể nhận được đa số các dữ liệu liên quan mà chúng ta cần tìm từ một thao tác đọc duy nhất.

Mô hình có thể được áp dụng cho các quan hệ tiêu biểu dưới đây:

  • Country và capital city
  • Account của người dùng và địa chỉ email
  • Tòa nhà và địa chỉ

2. Mô hình hóa 1-N với Embedded Documents

Tại đây, ta sẽ tạo ra một model sử dụng các Document được nhúng vào để thể hiện một mối quan hệ 1-N giữa các dữ liệu có sự liên kết với nhau. Tương tự với mô hình trước, mô hình này cũng sẽ giúp chúng ta có thể giảm số lần thao tác đọc nhưng vẫn có khả năng đảm bảo được lượng dữ liệu lấy về.

Mô hình có thể được áp dụng cho các quan hệ tiêu biểu dưới đây:

  • Quốc gia và các thành phố lớn
  • Tác giả và các tác phẩm
  • Học sinh và các lớp học

Ví dụ về cách sử dụng mô hình này:

// patron document
{
   _id: "joe",
   name: "Joe Bookreader"
}

// address one
{
   street: "123 Fake Street",
   city: "Faketon",
   state: "MA",
   zip: "12345"
}

// address two
{
   street: "1 Some Other Street",
   city: "Boston",
   state: "MA",
   zip: "12345"
}

Để hiển thị thông tin các địa chỉ mà người tuần tra sẽ đi qua, chúng ta sẽ nhúng các Document address one và address two vào trong một Document patron:

{
   "_id": "joe",
   "name": "Joe Bookreader",
   "addresses": [
      {
         "street": "123 Fake Street",
         "city": "Faketon",
         "state": "MA",
         "zip": "12345"
      },
      {
         "street": "1 Some Other Street",
         "city": "Boston",
         "state": "MA",
         "zip": "12345"
      }
   ]
 }

>>> Xem thêm bài viết về MongoDB:

Tìm hiểu về cơ sở dữ liệu phi quan hệ MongoDB

Sử dụng map reduce trong MongoDB

Giới thiệu về GridFS trong MongoDB

3. Mô hình hóa 1-N sử dụng tham chiếu

Đây là phương pháp thiết kế Relationship tiêu chuẩn hóa. Trong phương pháp này, cả user và address document sẽ vẫn được duy trì một cách riêng rẽ, nhưng user document sẽ chứa một trường mà sẽ tham chiếu đến trường id của address document.

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
}

Sử dụng các ObjectIds này, chúng ta có thể truy vấn address document và lấy chi tiết địa chỉ từ đó. Với hướng tiếp cận này, chúng ta sẽ cần hai truy vấn, đầu tiên lấy các trường address_ids từ user document và sau đó là lấy các địa chỉ này từ address collection.

>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})

Stringee đã có một bài viết về tham chiếu trong MongoDB, để có thể hiểu rõ hơn về khái niệm này, bạn đọc vui lòng tham khảo bài viết tại đây.

Kết bài

Trên đây là hai phương pháp chính để chúng ta có thể thực hiện được việc mô hình hóa các quan hệ trong MongoDB. Nếu bạn cần truy cập dữ liệu của mình từ nhiều điểm, có lẽ bạn nên sử dụng Referencing. Nếu dữ liệu của bạn chỉ hữu ích liên quan đến tài liệu gốc của nó, thì Embedding là cách để đi. Cũng quan trọng để xem xét là tính nhất quán dữ liệu và kích thước tài liệu, với các dữ liệu quá lớn thì chúng ta không nên lạm dụng việc nhúng dữ liệu để mô hình hóa các quan hệ.

 


 

Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy,  Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: