codememo

외국 열쇠가 몽고에 있다고?

tipmemo 2023. 2. 27. 22:39
반응형

외국 열쇠가 몽고에 있다고?

여기에 이미지 설명 입력

MongoDB에서 이런 스킴을 설계하려면 어떻게 해야 하나요?외국 열쇠가 없는 것 같아!

mongodb에서 어떻게 이런 테이블을 디자인할 수 있을까요?

먼저 명명 규칙을 명확히 합니다.는 MongoDB를 사용합니다.collectionstables.

외국 열쇠가 없는 것 같아!

다음 모델을 선택합니다.

student
{ 
  _id: ObjectId(...),
  name: 'Jane',
  courses: [
    { course: 'bio101', mark: 85 },
    { course: 'chem101', mark: 89 }
  ]
}

course
{
  _id: 'bio101',
  name: 'Biology 101',
  description: 'Introduction to biology'
}

분명히 제인의 코스 리스트는 몇 가지 특정 코스를 가리키고 있습니다.데이터베이스는 시스템에 어떠한 제약 조건(즉, 외부제약 조건)을 적용하지 않으므로 "삭제 캐스케이딩" 또는 "업데이트 캐스케이딩"은 없습니다.그러나 데이터베이스에는 올바른 정보가 포함되어 있습니다.

또한 MongoDB에는 DBRef 표준이 있어 이러한 참조를 표준화할 수 있습니다.실제로 이 링크를 보시면 비슷한 예가 있습니다.

이 작업은 어떻게 하면 해결할 수 있을까요?

분명히 하자면, MongoDB는 관계가 없습니다.표준 "정상형"은 없습니다.저장하는 데이터 및 실행할 쿼리에 적합한 데이터베이스를 모델링해야 합니다.

Mongoid나 MongoMapper와 같은 ORM을 사용하는 데 관심이 있을 수 있습니다.

http://mongoid.org/docs/relations/referenced/1-n.html

MongoDB와 같은 NoSQL 데이터베이스에는 '테이블'이 아니라 컬렉션이 있습니다.문서는 모음 내에 그룹화됩니다.모든 종류의 문서를 하나의 컬렉션에 저장할 수 있습니다.기본적으로 NoSQL 데이터베이스에서는 데이터와 그 관계를 구성하는 방법을 결정하는 것은 사용자의 몫입니다.

Mongoid와 MongoMapper가 하는 일은 관계를 쉽게 설정할 수 있는 편리한 방법을 제공하는 것입니다.내가 준 링크를 확인하고 무엇이든 물어보세요.

편집:

mongoid에서는 다음과 같이 스킴을 씁니다.

class Student
  include Mongoid::Document

    field :name
    embeds_many :addresses
    embeds_many :scores    
end

class Address
  include Mongoid::Document

    field :address
    field :city
    field :state
    field :postalCode
    embedded_in :student
end

class Score
  include Mongoid::Document

    belongs_to :course
    field :grade, type: Float
    embedded_in :student
end


class Course
  include Mongoid::Document

  field :name
  has_many :scores  
end

편집:

> db.foo.insert({group:"phones"})
> db.foo.find()                  
{ "_id" : ObjectId("4df6539ae90592692ccc9940"), "group" : "phones" }
{ "_id" : ObjectId("4df6540fe90592692ccc9941"), "group" : "phones" }
>db.foo.find({'_id':ObjectId("4df6539ae90592692ccc9940")}) 
{ "_id" : ObjectId("4df6539ae90592692ccc9940"), "group" : "phones" }

이 ObjectId를 사용하여 문서 간의 관계를 수행할 수 있습니다.

해서 이른바 '어울릴 수 없다'라는 것을 할 수 있습니다.foreign keyMongoDB에 있습니다.그러나 데이터 무결성은 우리가 직접 유지해야 합니다.예를들면,

student
{ 
  _id: ObjectId(...),
  name: 'Jane',
  courses: ['bio101', 'bio102']   // <= ids of the courses
}

course
{
  _id: 'bio101',
  name: 'Biology 101',
  description: 'Introduction to biology'
}

courses에는 드음음음음음음음음음 field field field field field field field가 들어있습니다._id물론입니다.일대다 관계를 정의하는 것은 쉽습니다. 그러나 학생의 과정 이름을 가져오려면 를 통해 문서를 가져오는 다른 작업을 수행해야 합니다.

가 ★★★★★★★★★★★★★★.bio101다른 .다른 조작을 실행하고, 를 갱신할 필요가 있습니다.coursesstudent★★★★★★ 。

상세: MongoDB 스키마 설계

MongoDB의 문서 유형 특성은 유연한 관계 정의 방법을 지원합니다.일대다 관계를 정의하려면:

임베디드 문서

  1. 1대 1로 적합.
  2. 장점: 다른 문서에 대한 추가 쿼리를 수행할 필요가 없습니다.
  3. 단점: 내장된 문서의 엔티티를 개별적으로 관리할 수 없습니다.

예:

student
{
  name: 'Kate Monster',
  addresses : [
     { street: '123 Sesame St', city: 'Anytown', cc: 'USA' },
     { street: '123 Avenue Q', city: 'New York', cc: 'USA' }
  ]
}

하위 참조

student/course를 참조해 주세요.

참조하는 부모

로그 메시지와 같은 1대 1 스퀴리언에 적합합니다.

host
{
    _id : ObjectID('AAAB'),
    name : 'goofy.example.com',
    ipaddr : '127.66.66.66'
}

logmsg
{
    time : ISODate("2014-03-28T09:42:41.382Z"),
    message : 'cpu is on fire!',
    host: ObjectID('AAAB')       // Reference to the Host document
}

★★★★★★★★★★★★★★★.host입니다.logmsg를합니다.host.id인 합니다.

참고 자료:

  1. 6 MongoDB 스키마 설계의 경험칙: 파트 1
  2. 6 MongoDB 스키마 설계의 경험칙: 파트 2
  3. 6 MongoDB 스키마 설계의 경험칙: 파트 3
  4. 문서 참조와의 일대다 관계 모델

Little MongoDB Book에서

조인(join)을 사용하는 또 다른 방법은 데이터를 정규화하는 것입니다.지금까지는 퍼포먼스에 민감한 코드 또는 (감사 로그와 같이) 데이터를 스냅샷해야 할 타이밍을 위해 정규화 해제 작업이 예약되어 있었습니다.그러나 가입하지 않은 NoSQL의 인기가 계속 높아지면서 일반 모델링의 일부로서의 정규화 해제는 점점 더 보편화되고 있습니다.이것은 모든 문서의 모든 정보를 복제해야 한다는 것을 의미하지는 않습니다.다만, 중복 데이터의 염려가 설계 결정을 재촉하는 것이 아니라, 어느 문서에 속하는 정보에 근거해 데이터를 모델화하는 것을 검토해 주세요.

그렇게,

student
{ 
    _id: ObjectId(...),
    name: 'Jane',
    courses: [
    { 
        name: 'Biology 101', 
        mark: 85, 
        id:bio101 
    },
  ]
}

RESTful API 데이터인 경우 과정 ID를 과정 리소스에 대한 GET 링크로 바꿉니다.

간단한 답변:ObjectId 속성을 사용하여 컬렉션 간에 "weak reference"를 사용해야 합니다.

참조는 한 문서에서 다른 문서로의 링크 또는 참조를 포함하여 데이터 간의 관계를 저장합니다.응용 프로그램은 이러한 참조를 해결하여 관련 데이터에 액세스할 수 있습니다.대체로 이것들은 정규화된 데이터 모델입니다.

https://docs.mongodb.com/manual/core/data-modeling-introduction/#참고 자료

이것은 물론 어떠한 참조 무결성도 확인하지 않을 것이다.사용자측(어플리케이션 레벨)에서 "데드 링크"를 처리해야 합니다.

ForeignKey의 목적은 필드 값이 ForeignKey와 일치하지 않을 경우 데이터가 생성되지 않도록 하는 것입니다.이를 위해 MongoDB에서 데이터의 일관성을 보장하는 Schema 미들웨어를 사용합니다.

서류를 봐주세요.https://mongoosejs.com/docs/middleware.html#pre

SQL 내부 조인 등의 뷰를 작성하기 위해 사용할 수 있는 집약 파이프라인이 있기 때문에 관계형 DB로 NOSQL DB를 사용할 수 없는 이유는 없습니다.

각 컬렉션에는 하나의 유형(예: 주문)이 포함되어야 하며 주문 세부 정보는 1:M 관계입니다.

주문 수집
id(PK) 유형: GUID
Order No(후보 또는 대체 PK)
주문 날짜
고객 ID (FK)
...더 많은 주문 필드

주문 상세 컬렉션
id(PK)
Orderid (FK)
프로덕트 ID(FK)
수량
...더 많은 필드

제품.
id(PK)
공급업체 ID(FK)
이름.
비용.

기타 등등.

단순히 관계형 데이터베이스를 사용하지 않는 이유는 NOSQL 데이터베이스에는 관계적으로 설계된 데이터 수집과 함께 사용할 수 있는 다른 기능이 있기 때문입니다.

관계를 구현하는 방법은 관계형 데이터베이스와 동일합니다.외부 키를 직접 추가하고(기본 키는 각 문서 오브젝트에 대해 자동으로 추가됨) 정규화된 조인 컬렉션을 작성해야 합니다.데이터베이스는 통상적으로 정규화되지 않습니다.

유일한 주의사항은 NOSQL은 아직 그렇게 하지 않기 때문에 참조 무결성을 직접 코드화할 필요가 있다는 것입니다.따라서 관리 UI에서 사용자가 자녀를 둔 부모를 삭제하려고 하면 먼저 자녀를 삭제해야 한다는 친숙한 오류가 발생합니다.어렵지는 않지만 DB 유틸리티를 사용할 때는 DB가 허용하기 때문에 자녀가 있는 부모를 삭제하지 않도록 주의해야 합니다.

외부 키 ID에는 항상 명명 규칙을 사용하십시오.예를 들어 다음과 같습니다.

주문 상세 컬렉션
id(PK)
Orderid (FK) ......이 명명 규칙을 준수하면 이 외부 키가 Order 컬렉션의 기본 키임을 쉽게 추론할 수 있습니다.

언급URL : https://stackoverflow.com/questions/6334048/foreign-keys-in-mongo

반응형