Mối quan hệ một đối một mongodb

Các quan hệ của mongodb là các NoSQL tương đương với các liên kết trong cơ sở dữ liệu quan hệ. Tuy họ đều thực hiện các mục đích tương tự nhau, xuất hiện ở những trường hợp tương tự nhau nhưng bản chất về hành vi xử lý của họ hoàn toàn khác nhau

Mối quan hệ NoSQL so với các hiệp hội RDBMS

Các Relation (quan hệ) liên kết dữ liệu từ mô hình này với mô hình khác. Sâu hơn nữa thì đây chính là những gì dành cho các RDBMS liên kết. Tùy ý, cái cách mà dữ liệu được liên kết trong NoSQL lại hoàn toàn khác. Trong cơ sở dữ liệu quan hệ truyền thống, các quan hệ được sử dụng để liên kết giữa bảng này với các bảng khác. MongoDB và các nền tảng NoSQL tương đương nhau là "hướng tài liệu" (tức là không có bảng nào cả mà chỉ là những bản ghi thôi). Do đó, các liên kết được vẽ nằm giữa các "bản ghi"

ActiveRecord

class Post < ActiveRecord::Base
  belongs_to :author
  has_many :comments
end

Mongoid (tham khảo)

class Post
  include Mongoid::Document
  belongs_to :author
  has_many :comments
end

Mongoid (nhúng)

class Post
  include Mongoid::Document
  embedded_in :author
  embeds_many :comments
end

Tất cả những lớp trên về cơ bản đều thực hiện liên kết giữa 1 tác giả có nhiều bài đăng, 1 bài đăng lại có nhiều bình luận. Nhìn vào đoạn mã trên ta có thể thấy

embeds_many <=> has_many

embeds_in <=> belongs_to

Nhưng điều này đã làm đơn giản hóa nó đi

ActiveRecord

Cơ sở dữ liệu quan hệ sẽ xử lý các liên kết thông qua khóa ngoại trừ tham chiếu tới 1 hàng duy nhất của bảng khác. Ví dụ. một bài viết sẽ có một tác giả tham khảo ID của bản ghi trong bảng tác giả mà nó thuộc về. Nếu một tác giả có nhiều bài viết, nhiều bản viết bài sẽ có cùng tác giả. tác giả không có post_ids

Mối quan hệ một đối một mongodb

Lược đồ cơ sở dữ liệu quan hệ

Tài liệu tham khảo Mongoid

Có một cách cơ sở dữ liệu NoQuery xử lý một số mối quan hệ là thông qua các mối quan hệ. Tham chiếu tương tự như các hiệp hội trong cơ sở dữ liệu quan hệ hơn là nhúng (phần này sẽ được giải thích ở bên dưới). Mối quan hệ cũng sử dụng các từ khóa ngoại vi, tuy nhiên chúng ta trỏ từ tài liệu này sang tài liệu khác, thay vì một bản ghi trong một bảng này đến một bản ghi trong một bảng khác

// An author document.
{
  "_id" : ObjectId("4d3ed089fb60ab534684b7e9"),
  "name" : "Pat Whitrock"
}

// A post document.
{
  "_id" : ObjectId("4d3ed089fb60ab534684b7e0"),
  "author_id" : ObjectId("4d3ed089fb60ab534684b7e9"),
  "name" : "Mongo Stuff"
}

// A comment document.
{
  "_id" : ObjectId("4d3ed089fb60ab534684b7e8"),
  "post_id" : ObjectId("4d3ed089fb60ab534684b7e0"),
  "content" : "Lots of stuff about Mongo."
}

Mongoid nhúng

Một cách khác để xây dựng cơ sở dữ liệu NoQuery xử lý các mối quan hệ này với nhiều mối quan hệ là thông qua việc nhúng các tài liệu. Một tài liệu được nhúng trong một tài liệu khác, dẫn đến cơ bản là một hàm băm (hàm băm) với. Ví dụ. tác giả sẽ nhúng nhiều tài liệu bài đăng và mỗi tài liệu bài đăng sẽ nhúng nhiều bình luận. Mỗi tác giả là một hàm băm chứa một mảng các bài đăng, mỗi tài liệu chứa một mảng các bình luận

// An author document.
{
  "_id" : ObjectId("4d3ed089fb60ab534684b7e9"),
  "name" : "Pat Whitrock",
  "posts" : [
    // An embedded post document.
    {
      "_id" : ObjectId("4d3ed089fb60ab534684b7e0"),
      "name" : "Mongo Stuff",
      "comments" : [
        // An embedded comment document.
        {
          "_id" : ObjectId("4d3ed089fb60ab534684b7e8"),
          "content" : "Lots of stuff about Mongo."
        }
      ]
    }
  ]
}

Nhúng so với tham chiếu

Tại sao Mongo cần có nhiều cách để xác định cùng một mối quan hệ với nhiều mối quan hệ khi các ORM như ActiveRecord chỉ yêu cầu một? . Có một số điều cần được xem xét trước khi đưa ra quyết định

Dữ liệu của bạn sẽ được kết nối từ nhiều điểm? . 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ì Nhúng là cách để đi. Cũng quan trọng để xem xét tính nhất quán dữ liệu và kích thước tài liệu. Tài liệu MongoDB có thể bị giới hạn ở kích thước tối đa 4 MB, tuy nhiên, rất khó có thể đây là vấn đề bạn sẽ gặp phải sớm