Tham chiếu là một kĩ thuật cho phép sử dụng đặc điểm của một bản ghi để tham chiếu đến chính nó hoặc một bản ghi khác trong cơ sở dữ liệu khác. Trong các trường hợp mà một document chứa nhiều tham chiếu từ các collection khác nhau thì chúng ta có thể sử dụng DBRefs trong MongoDB. DBRefs cùng với Manual References là các loại tham chiếu trong MongoDB, cùng nhau tìm hiểu về chúng trong bài viết này nhé.

1. Tham chiếu database trong MongoDB

Đây là một phương pháp thiết kế Relationship tiêu chuẩn hóa. Khi thực hiện nó, các document trong từng collection khác nhau sẽ được duy trì riêng rẽ nhưng chúng sẽ có các trường mà có thể tham chiếu đến document khác. Ví dụ như, một document user sẽ chứa một trường để tham chiếu đến trường id của document address chẳng hạn.

{

    "_id": ObjectId("52ffc33cd85242f436000001"),

    "contact": "987654321",

    "dob": "01-01-1991",

    "name": "Tom Benzamin",

    "address_ids": [

        ObjectId("52ffc4a5d85242602e000000"),

        ObjectId("52ffc4a5d85242602e000001")

    ]

}

Như trên, user document chứa trường address_ids và chứa ObjectIds của địa chỉ tương ứng. 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"]}})

Cách thực hiện trên được gọi là Manual References, chúng ta sẽ lưu trữ id của các document được tham chiếu bên trong một Document khác. Tuy nhiên, giả sử có một Database dùng để lưu giữ các kiểu địa chỉ khác nhau (home, office, mailing…) trong các Collection khác nhau (address_home, address_office, address_mailing…), khi một user collection tham chiếu một địa chỉ, nó cũng cần xác định xem collection nào nó sẽ nhìn vào dựa trên kiểu địa chỉ. Trong tình huống như vậy, khi một Document tham chiếu tới Document khác từ nhiều Collection, chúng ta nên sử dụng DBRefs.

>>> 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

2. Sử dụng DBRefs trong MongoDB

Có 3 trường trong DBRefs:

$ref: Trường này xác định Collection của Document được tham chiếu.

$id: Trường này xác định trường _id của Document được tham chiếu.

$db: Trường này là một trường tùy ý, chứa tên của Database mà Document được tham chiếu ở trong đó. Giả sử một user document có trường address dạng DBRefs như sau:

{
   "_id":ObjectId("53402597d852426020000002"),
   "address": {
   "$ref": "address_home",
   "$id": ObjectId("534009e4d852427820000002"),
   "$db": "tutorialspoint"},
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin"
}

Trường address dạng DBRefs ở đây xác định rằng address document được tham chiếu ở trong address_home collection dưới tutorialspoint database và có một id là: 534009e4d852427820000002.

Phần code sau sẽ nhìn vào Collection được xác định bởi tham số $ref (là address_home trong trường hợp này) cho một Document với id được xác định bởi tham số $id trong DBRefs.

>var user = db.users.findOne({"name":"Tom Benzamin"})
>var dbRef = user.address
>db[dbRef.$ref].findOne({"_id":(dbRef.$id)})

Code trên trả về address document có mặt trong address_home collection:

{
   "_id" : ObjectId("534009e4d852427820000002"),
   "building" : "22 A, Indiana Apt",
   "pincode" : 123456,
   "city" : "Los Angeles",
   "state" : "California"
}

3. Ưu và nhược điểm của việc sử dụng DBRefs

3.1. Ưu điểm

  • Quản lý mối quan hệ dữ liệu: DBRefs cho phép bạn biểu diễn mối quan hệ giữa các Document một cách rõ ràng và dễ hiểu.
  • Tiết kiệm không gian lưu trữ: Thay vì lưu trữ thông tin trùng lặp, bạn chỉ cần lưu trữ một tham chiếu đến Document gốc, giúp giảm kích thước dữ liệu.
  • Truy cập dữ liệu linh hoạt: DBRefs cho phép bạn truy vấn và truy cập dữ liệu từ các Collection khác một cách dễ dàng.

3.2. Nhược điểm

  • Phức tạp hóa truy vấn: Việc sử dụng DBRefs có thể làm cho truy vấn trở nên phức tạp hơn do bạn cần thực hiện nhiều truy vấn để lấy thông tin từ các Document được tham chiếu.
  • Tăng tải cho hệ thống: Khi bạn có nhiều tham chiếu giữa các Collection, điều này có thể tạo áp lực lớn cho hệ thống khi cần phải tải nhiều Document khác nhau.

Kết

Trong bài viết này, chúng ta đã tìm hiểu về cách sử dụng tham chiếu Database trong MongoDB, cũng như so sánh nó với Manual References. Hi vọng bạn đã hiểu về cấu trúc của DBRefs và cách sử dụng chúng để tham chiếu các Document từ các Collection khác nhau.


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: