Khóa ngoại MongoDB

Sử dụng BlockFi, không chỉ mua tiền điện tử - hãy bắt đầu kiếm tiền từ nó. Mở một tài khoản lãi với tối đa 8. 6% APY, giao dịch tiền tệ hoặc vay tiền mà không cần bán tài sản của bạn


Khóa ngoại MongoDB

Tham gia CoinBase. Cả hai chúng ta sẽ nhận được 10 đô la Bitcoin miễn phí khi họ mua hoặc bán 100 đô la đầu tiên của mình trên Coinbase. Có sẵn ở Ấn Độ cũng. Sử dụng giới thiệu Tham gia coinbase


Khóa ngoại MongoDB

đầu tư ngay bây giờ. Nhận cổ phiếu vốn chủ sở hữu miễn phí (chỉ ở Hoa Kỳ, Vương quốc Anh)

Sử dụng ứng dụng Robinhood để đầu tư vào cổ phiếu. Nó an toàn và bảo mật. Sử dụng liên kết Giới thiệu để nhận cổ phiếu miễn phí khi bạn đăng ký

Trước khi khám phá các lược đồ nâng cao hơn trong cuốn sách này, điều quan trọng là phải xem lại các khái niệm cơ bản về lược đồ. Trong chương này, chúng ta sẽ khám phá các mối quan hệ cơ bản từ cơ sở dữ liệu quan hệ truyền thống và cách chúng liên quan đến mô hình tài liệu trong MongoDB

Chúng ta sẽ bắt đầu với cái nhìn về One-To-One (1. 1) sau đó chuyển sang mối quan hệ Một-Nhiều (1. N) và cuối cùng là Many-To-Many (N. M)

Một Đối Một (1. 1)

1. 1 mối quan hệ mô tả mối quan hệ giữa hai thực thể. Trong trường hợp này, Tác giả có một mối quan hệ Địa chỉ duy nhất trong đó Tác giả sống tại một Địa chỉ duy nhất và Địa chỉ chỉ chứa một Tác giả duy nhất

Khóa ngoại MongoDB

1. 1 mối quan hệ có thể được mô hình hóa theo hai cách bằng MongoDB. Đầu tiên là nhúng mối quan hệ dưới dạng tài liệu, thứ hai là liên kết đến tài liệu trong một bộ sưu tập riêng biệt. Hãy xem xét cả hai cách lập mô hình mối quan hệ 1-1 bằng hai tài liệu sau

Mô hình

{
  name: "Peter Wilkinson",
  age: 27
}

Nhân vật. Ví dụ Tài liệu người dùng

{
  street: "100 some road",
  city: "Nevermore"
}

Nhân vật. Ví dụ Tài liệu địa chỉ

nhúng

Cách tiếp cận đầu tiên đơn giản là nhúng tài liệu Địa chỉ dưới dạng tài liệu nhúng vào tài liệu Người dùng

{
  name: "Peter Wilkinson",
  age: 27,
  address: {
    street: "100 some road",
    city: "Nevermore"
  }
}

Nhân vật. Ví dụ Tài liệu người dùng có Địa chỉ được nhúng

Điểm mạnh của việc nhúng tài liệu Địa chỉ trực tiếp vào tài liệu Người dùng là chúng ta có thể truy xuất người dùng và địa chỉ của nó trong một thao tác đọc thay vì phải đọc tài liệu người dùng trước rồi mới đến tài liệu địa chỉ cho người dùng cụ thể đó. Vì các địa chỉ có mối quan hệ mật thiết với tài liệu người dùng nên việc nhúng có ý nghĩa ở đây

liên kết

Cách tiếp cận thứ hai là liên kết địa chỉ và tài liệu người dùng bằng cách sử dụng một

{
  name: "Peter Wilkinson",
  age: 27,
  address: {
    street: "100 some road",
    city: "Nevermore"
  }
}
0

{
  _id: 1,
  name: "Peter Wilkinson",
  age: 27
}

Nhân vật. Ví dụ Tài liệu người dùng

{
  user_id: 1,
  street: "100 some road",
  city: "Nevermore"
}

Nhân vật. Ví dụ Tài liệu địa chỉ có khóa ngoại

Điều này tương tự như cách cơ sở dữ liệu quan hệ truyền thống sẽ lưu trữ dữ liệu. Điều quan trọng cần lưu ý là MongoDB không thực thi bất kỳ ràng buộc khóa ngoại nào nên mối quan hệ chỉ tồn tại như một phần của lược đồ mức ứng dụng

quan trọng

{
  name: "Peter Wilkinson",
  age: 27,
  address: {
    street: "100 some road",
    city: "Nevermore"
  }
}
1

Trong mối quan hệ 1-1 Nhúng là cách ưa thích để lập mô hình mối quan hệ vì việc truy xuất tài liệu sẽ hiệu quả hơn

Một-Nhiều (1. N)

1. Mối quan hệ N mô tả mối quan hệ mà một bên có thể có nhiều hơn một mối quan hệ trong khi mối quan hệ ngược lại chỉ có thể là một bên. Một ví dụ là một Blog trong đó một blog có thể có nhiều Bình luận nhưng một Bình luận chỉ liên quan đến một Blog duy nhất

Khóa ngoại MongoDB

1. Mối quan hệ N có thể được mô hình hóa theo nhiều cách khác nhau bằng MongoDB. Trong chương này, chúng ta sẽ khám phá ba cách khác nhau để lập mô hình 1. mối quan hệ N. Đầu tiên là nhúng, thứ hai là liên kết và thứ ba là chiến lược xô hữu ích cho các trường hợp như chuỗi thời gian. Hãy sử dụng mô hình của

{
  name: "Peter Wilkinson",
  age: 27,
  address: {
    street: "100 some road",
    city: "Nevermore"
  }
}
2 và
{
  name: "Peter Wilkinson",
  age: 27,
  address: {
    street: "100 some road",
    city: "Nevermore"
  }
}
3 của nó

Mô hình

{
  title: "An awesome blog",
  url: "http://awesomeblog.com",
  text: "This is an awesome blog we have just started"
}

Nhân vật. Một ví dụ về tài liệu Blog Post

Bài đăng trên blog là một tài liệu duy nhất mô tả một bài đăng trên blog cụ thể

{
  name: "Peter Critic",
  created_on: ISODate("2014-01-01T10:01:22Z"),
  comment: "Awesome blog post"
}
{
  name: "John Page",
  created_on: ISODate("2014-01-01T11:01:22Z"),
  comment: "Not so awesome blog"
}

Nhân vật. Một số ví dụ Nhận xét tài liệu

Đối với mỗi Bài đăng trên Blog, chúng tôi có thể có một hoặc nhiều Nhận xét

nhúng

Cách tiếp cận đầu tiên là nhúng Nhận xét vào

{
  name: "Peter Wilkinson",
  age: 27,
  address: {
    street: "100 some road",
    city: "Nevermore"
  }
}
2

{
  title: "An awesome blog",
  url: "http://awesomeblog.com",
  text: "This is an awesome blog we have just started",
  comments: [{
    name: "Peter Critic",
    created_on: ISODate("2014-01-01T10:01:22Z"),
    comment: "Awesome blog post"
  }, {
    name: "John Page",
    created_on: ISODate("2014-01-01T11:01:22Z"),
    comment: "Not so awesome blog"
  }]
}

Nhân vật. Bài đăng trên blog có tài liệu được nhúng

Việc nhúng

{
  name: "Peter Wilkinson",
  age: 27,
  address: {
    street: "100 some road",
    city: "Nevermore"
  }
}
5 vào bài đăng trên Blog có nghĩa là chúng tôi có thể dễ dàng truy xuất tất cả các nhận xét thuộc về một bài đăng trên Blog cụ thể. Thêm nhận xét mới đơn giản như thêm tài liệu nhận xét mới vào cuối mảng
{
  name: "Peter Wilkinson",
  age: 27,
  address: {
    street: "100 some road",
    city: "Nevermore"
  }
}
5

Tuy nhiên, có ba vấn đề tiềm ẩn liên quan đến phương pháp này mà người ta nên lưu ý.

  • Đầu tiên là mảng
    {
      name: "Peter Wilkinson",
      age: 27,
      address: {
        street: "100 some road",
        city: "Nevermore"
      }
    }
    
    5 có thể phát triển lớn hơn kích thước tài liệu tối đa là
    {
      name: "Peter Wilkinson",
      age: 27,
      address: {
        street: "100 some road",
        city: "Nevermore"
      }
    }
    
    8
  • Các khía cạnh thứ hai liên quan đến hiệu suất viết. Khi các bình luận được thêm vào Bài đăng trên blog theo thời gian, MongoDB sẽ khó dự đoán phần đệm tài liệu chính xác sẽ áp dụng khi một tài liệu mới được tạo. MongoDB sẽ cần phân bổ không gian mới cho tài liệu đang phát triển. Ngoài ra, nó sẽ phải sao chép tài liệu vào vị trí bộ nhớ mới và cập nhật tất cả các chỉ mục. Điều này có thể gây ra nhiều tải IO hơn và có thể ảnh hưởng đến hiệu suất ghi tổng thể

quan trọng

Điều quan trọng cần lưu ý là điều này chỉ quan trọng đối với lưu lượng ghi cao và có thể không phải là vấn đề đối với các ứng dụng nhỏ hơn. Điều gì có thể không được chấp nhận đối với ứng dụng có khối lượng ghi cao có thể chấp nhận được đối với ứng dụng có tải ghi thấp

  • Vấn đề thứ ba lộ ra khi một người cố gắng thực hiện phân trang các bình luận. Không có cách nào để giới hạn các bình luận được trả về từ
    {
      name: "Peter Wilkinson",
      age: 27,
      address: {
        street: "100 some road",
        city: "Nevermore"
      }
    }
    
    2 bằng cách sử dụng các tìm kiếm bình thường, vì vậy chúng tôi sẽ phải truy xuất toàn bộ tài liệu blog và lọc các bình luận trong ứng dụng của chúng tôi

liên kết

Cách tiếp cận thứ hai là liên kết các nhận xét với

{
  name: "Peter Wilkinson",
  age: 27,
  address: {
    street: "100 some road",
    city: "Nevermore"
  }
}
2 bằng cách sử dụng khóa
{
  _id: 1,
  name: "Peter Wilkinson",
  age: 27
}
1 truyền thống hơn

{
  _id: 1,
  title: "An awesome blog",
  url: "http://awesomeblog.com",
  text: "This is an awesome blog we have just started"
}

Nhân vật. Một ví dụ về tài liệu Blog Post

{
  blog_entry_id: 1,
  name: "Peter Critic",
  created_on: ISODate("2014-01-01T10:01:22Z"),
  comment: "Awesome blog post"
}
{
  blog_entry_id: 1,
  name: "John Page",
  created_on: ISODate("2014-01-01T11:01:22Z"),
  comment: "Not so awesome blog"
}

Nhân vật. Một số ví dụ Comment tài liệu với Foreign Keys

Một lợi thế của mô hình này là các nhận xét bổ sung sẽ không phát triển tài liệu gốc

{
  name: "Peter Wilkinson",
  age: 27,
  address: {
    street: "100 some road",
    city: "Nevermore"
  }
}
2, khiến các ứng dụng ít có khả năng chạy ở kích thước tài liệu tối đa là
{
  name: "Peter Wilkinson",
  age: 27,
  address: {
    street: "100 some road",
    city: "Nevermore"
  }
}
8. Việc trả lại các nhận xét được phân trang cũng dễ dàng hơn nhiều vì ứng dụng có thể cắt và chia nhỏ các nhận xét dễ dàng hơn. Mặt khác, nếu chúng tôi có 1000 nhận xét trên một bài đăng trên blog, chúng tôi sẽ cần truy xuất tất cả 1000 tài liệu gây ra nhiều lượt đọc từ cơ sở dữ liệu

Cách tiếp cận thứ ba là sự kết hợp của hai cách trên. Về cơ bản, nó cố gắng cân bằng giữa tính cứng nhắc của chiến lược nhúng với tính linh hoạt của chiến lược liên kết. Đối với ví dụ này, chúng tôi sẽ chia các nhận xét thành các nhóm với tối đa 50 nhận xét trong mỗi nhóm

{
  _id: 1,
  title: "An awesome blog",
  url: "http://awesomeblog.com",
  text: "This is an awesome blog we have just started"
}

Nhân vật. Một ví dụ về tài liệu Blog Post

{
  street: "100 some road",
  city: "Nevermore"
}
1

Nhân vật. Một số ví dụ Nhóm nhận xét

Lợi ích chính của việc sử dụng nhóm trong trường hợp này là chúng tôi có thể thực hiện một lần đọc để tìm nạp 50 nhận xét cùng một lúc, cho phép phân trang hiệu quả

quan trọng

{
  _id: 1,
  name: "Peter Wilkinson",
  age: 27
}
4

Khi bạn có khả năng chia nhỏ tài liệu của mình thành các lô kín đáo, bạn nên cân nhắc việc chia nhóm để tăng tốc độ truy xuất tài liệu

Các trường hợp điển hình mà việc tạo nhóm phù hợp là những trường hợp chẳng hạn như tạo nhóm dữ liệu theo giờ, ngày hoặc số lượng mục nhập trên một trang (như phân trang nhận xét)

Nhiều-Nhiều (N. M)

Một N. Mối quan hệ M là một ví dụ về mối quan hệ giữa hai thực thể trong đó cả hai có thể có nhiều mối quan hệ với nhau. Một ví dụ có thể là một cuốn sách được viết bởi nhiều tác giả. Đồng thời một Tác giả có thể đã viết nhiều Sách

Khóa ngoại MongoDB

N. M mối quan hệ được mô hình hóa trong cơ sở dữ liệu quan hệ bằng cách sử dụng bảng nối. Một ví dụ điển hình là mối quan hệ giữa sách và tác giả

  • Một tác giả có thể là tác giả của nhiều cuốn sách (1. N)
  • Một cuốn sách có thể có nhiều tác giả (1. M)

Điều này dẫn đến một N. Mối quan hệ giữa các tác giả sách. Hãy xem làm thế nào điều này có thể được mô hình hóa

Nhúng hai chiều

Nhúng sách vào tài liệu Tác giả

Mô hình

Trong

{
  _id: 1,
  name: "Peter Wilkinson",
  age: 27
}
5, chúng tôi sẽ bao gồm Sách
{
  _id: 1,
  name: "Peter Wilkinson",
  age: 27
}
6 trong trường
{
  _id: 1,
  name: "Peter Wilkinson",
  age: 27
}
7

{
  street: "100 some road",
  city: "Nevermore"
}
2

Nhân vật. Một số ví dụ Tác giả tài liệu

Phản ánh tài liệu Tác giả, đối với mỗi Sách, chúng tôi bao gồm Tác giả

{
  _id: 1,
  name: "Peter Wilkinson",
  age: 27
}
6 trong trường Tác giả

{
  street: "100 some road",
  city: "Nevermore"
}
3

Nhân vật. Một số ví dụ Sách tài liệu

Truy vấn

{
  street: "100 some road",
  city: "Nevermore"
}
4

ví dụ 1. Tìm nạp sách của một tác giả cụ thể

{
  street: "100 some road",
  city: "Nevermore"
}
5

ví dụ 2. Tìm nạp tác giả theo một cuốn sách cụ thể

Như có thể thấy, chúng ta phải thực hiện hai truy vấn theo cả hai hướng. Đầu tiên là tìm tác giả hoặc cuốn sách và thứ hai là thực hiện truy vấn $in để tìm sách hoặc tác giả

quan trọng

{
  _id: 1,
  name: "Peter Wilkinson",
  age: 27
}
9

Hãy chọn danh mục

{
  user_id: 1,
  street: "100 some road",
  city: "Nevermore"
}
0 có thể có hàng nghìn cuốn sách trong đó và có nhiều cuốn sách mới liên tục được thêm vào và xóa đi. Điều này làm cho việc nhúng tất cả các cuốn sách vào một tài liệu thể loại là không thể. Tuy nhiên, mỗi cuốn sách có thể dễ dàng có các danh mục được nhúng bên trong nó, vì tỷ lệ thay đổi danh mục cho một cuốn sách cụ thể có thể rất thấp

Trong trường hợp này, chúng ta nên coi

{
  user_id: 1,
  street: "100 some road",
  city: "Nevermore"
}
1 là một chiến lược

Nhúng một chiều

Chiến lược Nhúng một chiều chọn tối ưu hóa hiệu suất đọc của N. Mối quan hệ M bằng cách nhúng các tham chiếu vào một bên của mối quan hệ. Một ví dụ có thể là một vài cuốn sách thuộc về một vài danh mục nhưng một vài danh mục lại có nhiều sách. Hãy xem một ví dụ, kéo các danh mục ra một tài liệu riêng

Mô hình

{
  street: "100 some road",
  city: "Nevermore"
}
6

Nhân vật. Tài liệu chuyên mục

{
  street: "100 some road",
  city: "Nevermore"
}
7

Nhân vật. Một cuốn sách có khóa ngoại cho các danh mục

Lý do chúng tôi chọn nhúng tất cả các tham chiếu đến các danh mục trong sách là do có nhiều sách trong danh mục chính kịch hơn các danh mục trong một cuốn sách. Nếu một người nhúng sách vào tài liệu danh mục, thì dễ dàng thấy trước rằng người ta có thể phá vỡ kích thước tài liệu tối đa 16 MB đối với một số danh mục rộng nhất định

Truy vấn

{
  street: "100 some road",
  city: "Nevermore"
}
8

ví dụ 3. Tìm nạp danh mục cho một cuốn sách cụ thể

{
  street: "100 some road",
  city: "Nevermore"
}
9

Ví dụ 4. Tìm nạp sách cho một danh mục cụ thể

tiền boa

{
  user_id: 1,
  street: "100 some road",
  city: "Nevermore"
}
2

Thiết lập kích thước tối đa của

{
  user_id: 1,
  street: "100 some road",
  city: "Nevermore"
}
3 và kích thước của
{
  user_id: 1,
  street: "100 some road",
  city: "Nevermore"
}
4. Ví dụ: nếu
{
  user_id: 1,
  street: "100 some road",
  city: "Nevermore"
}
3 là tối đa 3 danh mục cho một cuốn sách và
{
  user_id: 1,
  street: "100 some road",
  city: "Nevermore"
}
4 là tối đa 500000 cuốn sách trong một danh mục, bạn nên chọn Nhúng một chiều. Nếu
{
  user_id: 1,
  street: "100 some road",
  city: "Nevermore"
}
3 có tối đa là 3 và
{
  user_id: 1,
  street: "100 some road",
  city: "Nevermore"
}
4 có tối đa là 5 thì tính năng Nhúng hai chiều có thể hoạt động tốt

MongoDB có khóa ngoại không?

Tài liệu tham khảo MongoDB . Các khóa ngoại có thể được sử dụng trong Cơ sở dữ liệu quan hệ để trực quan hóa dữ liệu từ nhiều bộ sưu tập cùng một lúc. Cách MongoDB lưu trữ dữ liệu cũng khác. Normally, MongoDB doesn't work with the concept of foreign keys. The foreign keys can be used in the Relational Databases for visualizing data from multiple collections simultaneously. The way MongoDB stores data is also different.

MongoDB có sử dụng khóa chính và khóa ngoại không?

Không. MongoDB không hỗ trợ mối quan hệ khóa chính-khóa ngoại . MongoDB có trường khóa _id cho mọi tài liệu xác định duy nhất tài liệu cụ thể.

Có khóa ngoại trong NoSQL không?

Cơ sở dữ liệu NoSQL không hỗ trợ khóa ngoại hoặc tham gia và không có khái niệm về tính toàn vẹn tham chiếu. Hãy cùng khám phá các loại cơ sở dữ liệu NoSQL khác nhau và khi nào thích hợp để sử dụng từng loại.

Khóa ngoại trong DB là gì?

Khóa ngoại (FK) là cột hoặc tổ hợp các cột được sử dụng để thiết lập và thực thi liên kết giữa dữ liệu trong hai bảng nhằm kiểm soát dữ liệu có thể được lưu trữ . .