MongoDB에서 스키마 정의

Tahseen Tauseef 2024년2월15일
  1. MongoDB의 스키마
  2. MongoDB에서 스키마 설계 시 고려 사항
  3. MongoDB에서 스키마 정의
  4. MongoDB 영역을 사용하여 스키마 적용
MongoDB에서 스키마 정의

이 기사에서는 MongoDB 스키마와 이를 정의하는 방법에 대해 설명합니다.

MongoDB의 스키마

데이터의 구조와 내용은 JSON 객체인 스키마에 의해 정의됩니다. JSON 스키마 표준을 확장하는 Realm의 BSON 스키마는 앱의 데이터 모델을 설계하고 문서가 생성, 변경 또는 삭제될 때마다 유효성을 검사하는 데 사용할 수 있습니다.

정확한 값 대신 스키마는 다양한 유형의 데이터를 나타냅니다. 많은 내장 스키마 유형이 Realm에서 지원됩니다. 텍스트, 숫자와 같은 기본 요소와 개체 및 배열과 같은 구조 유형을 결합하여 사용자 지정 개체 유형을 나타내는 스키마를 형성할 수 있습니다.

예를 들어 자동차 및 스키마를 준수하는 일부 자동차 개체에 대한 데이터의 기본 스키마는 다음과 같습니다.

개요:

{
  "title": "car",
  "required": [
    "_id",
    "year",
    "make",
    "model",
    "kilometers"
  ],
  "properties": {
    "_id": { "bsonType": "objectId" },
    "year": { "bsonType": "string" },
    "make": { "bsonType": "string" },
    "model": { "bsonType": "string" },
    "kilometers": { "bsonType": "number" }
  }
}

사물:

{
  "_id": ObjectId("5af712eff26b29dc5c51c60f"),
  "year": "2022",
  "make": "Honda",
  "model": "Civic",
  "kilometers": 123
}
{
  "_id": ObjectId("5af714eff24b294c5251cf04"),
  "year": "2016",
  "make": "Honda",
  "model": "City",
  "kilometers": 135794
}

스키마는 애플리케이션의 데이터 모델 사양입니다. Realm은 정의한 스키마를 준수하는 데이터로 작업할 수 있는 추가 도구와 서비스를 제공합니다.

Realm의 많은 애플리케이션 서비스는 스키마를 사용합니다:

  1. 영역과 MongoDB Atlas 간에 데이터를 동기화하기 위해 영역 동기화는 스키마를 사용합니다. 스키마를 기반으로 관용적인 SDK 개체 모델을 개발할 수도 있습니다.
  2. GraphQL API는 자동으로 스키마를 사용하여 유형, 쿼리 및 변형을 자동으로 포함하는 GraphQL 스키마를 생성합니다. 스키마에 의해 정의된 유형을 참조하는 사용자 지정 확인자를 앱의 API에 추가할 수 있습니다.
  3. 각 요청 전후에 데이터 액세스 규칙은 데이터가 스키마를 준수하는지 확인합니다. 또한 Realm은 어떤 문서가 유효성 검사에 실패하면 전체 요청을 방지하거나 롤백합니다.

MongoDB에서 스키마 설계 시 고려 사항

  1. 사용자 요구 사항에 따라 스키마를 설계합니다.
  2. 개체를 함께 사용하는 경우 단일 문서로 결합합니다. 필요한 경우 분리하십시오(조인이 필요하지 않은지 확인하십시오).
  3. 디스크 공간이 컴퓨팅 시간보다 저렴하기 때문에 데이터를 복제합니다(그러나 제한됨).
  4. 읽을 때가 아니라 쓰는 동안 조인을 하십시오.
  5. 가장 빈번한 사용 사례에 맞게 스키마를 최적화합니다.
  6. 스키마에서 복잡한 집계를 수행합니다.

이를 설명하는 예는 다음과 같습니다.

클라이언트가 자신의 블로그나 웹 사이트를 위한 데이터베이스 디자인이 필요하고 RDBMS와 MongoDB 스키마 디자인의 차이점을 확인한다고 가정합니다. 웹 사이트에는 다음과 같은 요구 사항이 있습니다.

  1. 모든 게시물에는 고유한 제목, 설명 및 URL이 있습니다.
  2. 모든 게시물은 하나 또는 여러 개의 태그를 가질 수 있습니다.
  3. 모든 게시물에는 게시자 이름과 총 좋아요 수가 있습니다.
  4. 모든 게시물에는 사용자 댓글과 이름, 메시지, 데이터 시간 및 좋아요가 포함됩니다.
  5. 각 게시물에는 댓글이 없거나 많을 수 있습니다.

RDBMS 스키마에서 위의 요구 사항에 대한 설계에는 최소 3개의 테이블이 있습니다.

RDBMS 스키마 설계

MongoDB 스키마에 있는 동안 디자인에는 하나의 컬렉션 게시물과 다음 구조가 있습니다.

{
  _id: POST-ID
  title: TITLE-OF-POST,
  description: POST-DESCRIPTION,
  by: POST-BY,
  url: URL-OF-POST,
  tags: [TAG1, TAG2],
  likes: TOTAL-LIKES,
  comments: [
    {
        user: 'COMMENT-BY',
        message: TEXT,
        dateCreated: DATE-TIME,
        like: LIKES
    },
    {
        user: 'COMMENT-BY',
        message: TEXT,
        dateCreated: DATE-TIME,
        like: LIKES
    }
  ]
}

따라서 RDBMS에서는 세 개의 테이블을 결합하여 데이터를 표시해야 합니다. 그러나 MongoDB에서는 데이터가 하나의 컬렉션에서만 표시됩니다.

MongoDB에서 스키마 정의

유형의 속성을 지정하는 추가 스키마는 루트 수준 컬렉션 스키마에서 찾을 수 있습니다. 각 루트 수준 스키마는 다음과 같은 객체 스키마입니다.

{
  "bsonType": "object",
  "title": "<Type Name>",
  "required": ["<Required Field Name>", ...],
  "properties": {
    "<Field Name>": <Schema>
  }
}

사용자는 다음과 같은 지원되는 스키마 유형을 사용하여 개체의 속성을 구성할 수 있습니다.

  1. 개체
  2. 어레이
  3. 문자열
  4. 부울
  5. 개체 ID
  6. 바이너리 데이터
  7. 혼합
  8. 설정
  9. 사전

MongoDB 영역을 사용하여 스키마 적용

MongoDB 컬렉션의 모든 쓰기 작업(삽입, 업데이트 및 삭제)은 MongoDB Realm의 컬렉션 스키마에 대해 유효성이 검사됩니다.

또한 각 요청 전후에 각 문서를 검사하여 모든 속성이 스키마와 일치하고 잘못된 변경이 이루어지지 않았는지 확인합니다.

쓰기 작업을 클러스터에 커밋하기 전에 Realm은 모든 문서 쓰기 결과를 확인하고 스키마와 비교합니다.

MongoDB Realm은 요청을 변경하지 않고 요청의 쓰기 작업 결과가 스키마에 맞지 않으면 사용자에게 오류를 전달합니다.

이에 대한 예가 아래에 나와 있습니다. 컬렉션에는 다음과 같은 스키마가 있습니다.

{
  "title": "person",
  "properties": {
    "_id": {"bsonType": "objectId" },
    "name": {"bsonType": "string" }
    }
}

모든 필드에 대한 전체 액세스 권한이 있는 사용자가 특정 문서에서 이름 필드를 변경하려고 합니다. 그들은 다음에 대해 문의합니다.

collection.updateOne(
  { "_id": BSON.ObjectId("5ae782e48f25b9dc5c51c4d0") },
  { "$set": { "name": 22 } }
)

쿼리는 이름 값을 숫자 22로 설정하려고 시도합니다. 그럼에도 불구하고 스키마는 값이 문자열임을 지정합니다.

사용자가 문서를 업데이트할 수 있는 권한을 받았더라도 쓰기 결과가 스키마를 준수하지 않기 때문에 MongoDB Realm은 이 쓰기 작업을 거부합니다.