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

MongoDB - Tạo mối quan hệ

Để tạo mối quan hệ trong MongoDB, hãy nhúng một tài liệu BSON vào một tài liệu khác hoặc tham chiếu nó từ một tài liệu khác.

Cơ sở dữ liệu MongoDB hoạt động khác với cơ sở dữ liệu quan hệ. Điều này cũng đúng với các mối quan hệ.

Trong MongoDB, bạn có thể tạo mối quan hệ bằng một trong hai phương pháp sau:

  • Tài liệu được nhúng.
  • Tài liệu tham khảo.

Phương pháp bạn sử dụng sẽ phụ thuộc vào dữ liệu và cách bạn định truy vấn dữ liệu đó.

Mối quan hệ được nhúng

Với MongoDB, bạn có thể nhúng tài liệu vào bên trong tài liệu. Do đó, một tài liệu có thể chứa các mối quan hệ riêng của nó.

Trên thực tế, chúng tôi đã tạo mối quan hệ bằng phương pháp này khi chúng tôi tạo tài liệu lần đầu tiên.

Mối quan hệ một-một

mối quan hệ 1-1 là nơi tài liệu mẹ có một phần tử con và phần tử con có một phần cha mẹ.

Ví dụ:một quy tắc kinh doanh có thể nói rằng một nghệ sĩ chỉ có thể có một địa chỉ và địa chỉ đó chỉ có thể thuộc về một nghệ sĩ.

Đoạn mã sau tạo mối quan hệ 1-1, được nhúng trong tài liệu.

db.artists.insert(
    {
        _id : 2,
        artistname : "Prince",
        address :   {
                        street : "Audubon Road",
                        city : "Chanhassen",
                        state : "Minnesota",
                        country : "United States"
                    }
    }
)

Kết quả:

WriteResult({ "nInserted" : 1 })

Mối quan hệ một-nhiều

một-nhiều Mối quan hệ là nơi tài liệu mẹ có thể có nhiều tài liệu con, nhưng các tài liệu con chỉ có thể có một tài liệu mẹ.

Vì vậy, một quy tắc kinh doanh khác có thể nói rằng một nghệ sĩ có thể có nhiều album, nhưng một album chỉ có thể thuộc về một nghệ sĩ.

Chạy mã sau sẽ tạo mối quan hệ một-nhiều:

db.artists.insert(
    {
        _id : 3,
        artistname : "Moby",
        albums : [
                    {
                        album : "Play",
                        year : 1999,
                        genre : "Electronica"
                    }, 
                    {
                        album : "Long Ambients 1: Calm. Sleep.",
                        year : 2016,
                        genre : "Ambient"
                    }
                ]
    }
)

Kết quả:

WriteResult({ "nInserted" : 1 })

Mối quan hệ được tham chiếu đến tài liệu

Bạn có thể sử dụng tham chiếu tài liệu để tạo mối quan hệ. Thay vì nhúng tài liệu con vào tài liệu mẹ (như chúng tôi đã làm ở trên), bạn tách tài liệu con ra thành tài liệu độc lập của riêng nó.

Vì vậy, chúng tôi có thể làm điều này:

Tài liệu gốc

db.artists.insert(
    {
        _id : 4,
        artistname : "Rush"
    }
)

Tài liệu con

Chúng tôi sẽ chèn 3 tài liệu con - một tài liệu cho mỗi thành viên ban nhạc:

db.musicians.insert(
    {
        _id : 9,
        name : "Geddy Lee",
        instrument : [ "Bass", "Vocals", "Keyboards" ],
        artist_id : 4
    }
)
db.musicians.insert(
    {
        _id : 10,
        name : "Alex Lifeson",
        instrument : [ "Guitar", "Backing Vocals" ],
        artist_id : 4
    }
)
db.musicians.insert(
    {
        _id : 11,
        name : "Neil Peart",
        instrument : "Drums",
        artist_id : 4
    }
)

Truy vấn mối quan hệ

Sau khi chèn hai tài liệu trên, bạn có thể sử dụng $lookup để thực hiện phép nối ngoài cùng bên trái trên hai bộ sưu tập.

Điều này, kết hợp với aggregate()$match để chỉ định nghệ sĩ cụ thể mà bạn quan tâm, sẽ trả về các tài liệu mẹ và con trong một.

db.artists.aggregate([
    {
      $lookup:
        {
          from: "musicians",
          localField: "_id",
          foreignField: "artist_id",
          as: "band_members"
        }
   },
   { $match : { artistname : "Rush" } }
]).pretty()

Kết quả:

{
	"_id" : 4,
	"artistname" : "Rush",
	"band_members" : [
		{
			"_id" : 9,
			"name" : "Geddy Lee",
			"instrument" : [
				"Bass",
				"Vocals",
				"Keyboards"
			],
			"artist_id" : 4
		},
		{
			"_id" : 10,
			"name" : "Alex Lifeson",
			"instrument" : [
				"Guitar",
				"Backing Vocals"
			],
			"artist_id" : 4
		},
		{
			"_id" : 11,
			"name" : "Neil Peart",
			"instrument" : "Drums",
			"artist_id" : 4
		}
	]
}

Bạn có thể thấy rằng hai trường đầu tiên là từ bộ sưu tập nghệ sĩ và phần còn lại của nó là từ bộ sưu tập nhạc sĩ.

Vì vậy, nếu bạn chỉ truy vấn bộ sưu tập nghệ sĩ của chính nó:

db.artists.find( { artistname : "Rush" } )

Bạn chỉ nhận được điều này:

{ "_id" : 4, "artistname" : "Rush" }

Không có dữ liệu liên quan nào được trả lại.

Khi nào sử dụng Tài liệu nhúng và Tài liệu Tham chiếu

Cả hai phương pháp tạo mối quan hệ đều có ưu và khuyết điểm. Đôi khi, bạn có thể sử dụng tài liệu nhúng và những lần khác, bạn sẽ sử dụng tài liệu được tham chiếu.

Khi nào sử dụng Mối quan hệ được nhúng

Một trong những lợi ích chính của việc sử dụng phương pháp quan hệ nhúng là hiệu suất. Khi mối quan hệ được nhúng trong tài liệu, các truy vấn sẽ chạy nhanh hơn so với khi chúng được dàn trải trên nhiều tài liệu. MongoDB chỉ cần trả về một tài liệu, thay vì kết hợp nhiều tài liệu để truy xuất các mối quan hệ. Điều này có thể cung cấp một sự thúc đẩy hiệu suất lớn - đặc biệt là khi làm việc với nhiều dữ liệu.

Các mối quan hệ nhúng cũng làm cho các truy vấn dễ viết hơn. Thay vì viết các truy vấn phức tạp kết hợp nhiều tài liệu thông qua mã định danh duy nhất của chúng, bạn có thể trả về tất cả dữ liệu liên quan trong một truy vấn duy nhất.

Một lưu ý khác cần lưu ý là MongoDB chỉ có thể đảm bảo tính nguyên tử ở cấp độ tài liệu. Cập nhật tài liệu cho một tài liệu luôn là nguyên tử, nhưng không phải cho nhiều tài liệu.

Khi nhiều người dùng đang truy cập dữ liệu, luôn có khả năng hai hoặc nhiều người dùng cố gắng cập nhật cùng một tài liệu với các dữ liệu khác nhau. Trong trường hợp này, MongoDB sẽ đảm bảo rằng không có xung đột nào xảy ra và mỗi lần chỉ có một bộ dữ liệu được cập nhật. MongoDB không thể đảm bảo điều này trên nhiều tài liệu.

Vì vậy, nói chung, các mối quan hệ nhúng có thể được sử dụng trong hầu hết các trường hợp, miễn là tài liệu vẫn nằm trong giới hạn kích thước (16 megabyte tại thời điểm viết) và / hoặc giới hạn lồng của nó (sâu 100 cấp tại thời điểm viết).

Tuy nhiên, các mối quan hệ được nhúng không thích hợp cho tất cả dịp. Có thể có những tình huống mà việc tạo một mối quan hệ được tham chiếu đến tài liệu sẽ có ý nghĩa hơn.

Khi nào sử dụng Mối quan hệ được Tham chiếu

Đối với dữ liệu cần được lặp lại trên nhiều tài liệu, có thể hữu ích nếu có chúng trong tài liệu riêng của chúng. Điều này có thể giảm thiểu lỗi và giúp giữ cho dữ liệu nhất quán (đồng thời lưu ý rằng các bản cập nhật nhiều tài liệu không phải là nguyên tử).

Sử dụng ví dụ trên, một nhạc sĩ có thể là thành viên (hoặc cựu thành viên) của nhiều ban nhạc. Một số cũng có thể sản xuất album cho các nghệ sĩ khác, dạy học sinh, điều hành phòng khám, v.v. Ngoài ra, rất nhiều dữ liệu có thể được lưu trữ về mỗi nhạc sĩ. Vì vậy, việc có một tài liệu riêng cho từng nhạc sĩ rất có ý nghĩa trong trường hợp này.

Ngoài ra, nếu bạn cho rằng tài liệu nhúng của mình có thể vượt quá giới hạn kích thước tệp do MongoDB áp đặt, thì bạn sẽ cần lưu trữ một số dữ liệu trong các tài liệu riêng biệt.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Chuyển đổi dự phòng cho MySQL Replication (và những thứ khác) - Nó có nên được Tự động hóa không?

  2. node.js không thể tìm thấy mô-đun 'mongodb'

  3. chỉ mục thưa thớt và giá trị null trong mongo

  4. DeprecationWarning:collection.findAndModify không được dùng nữa. Sử dụng findOneAndUpdate, findOneAndReplace hoặc findOneAndDelete thay thế?

  5. Giao dịch trong MongoDB