MongoDB 및 문서 데이터베이스 소개

이 강좌에서는 NoSQL 문서 데이터베이스에 대한 기본 지식을 설명합니다.실용성을 유지하기 위해 우리는 구체적인 실현, 즉 MongoDB를 연구할 것이다.
우선, 우리는 문서 데이터베이스의 데이터 모델부터 시작하여 이를 SQL 데이터 모델과 비교할 것이다.그 다음에 우리는 MongoDB의 특성, 예를 들어 조회, 데이터 복제, 절분과 일치성을 깊이 연구했다.우리는 MongoDB에 매우 적합한 실제 용례를 총결할 것이다.

데이터 모델


SQL과 NoSQL의 근본적인 차이점은 데이터의 저장 방식에 있다.관계 데이터베이스는 행과 열이 있는 Excel 테이블과 유사합니다.이런 데이터 저장 방식은 모든 줄에 완전히 같은 필드가 있다는 것을 의미한다.이에 비해 NoSQL은 컨텐츠를 저장하는 데 있어 유연성이 뛰어납니다.수조, 알 수 없는 길이의 필드를 오래 유지하거나 새로운 데이터 필드를 추가하기 쉽습니다.우리 예를 하나 봅시다.
UML 데이터 모델:

다음은 간단한 온라인 상점의 데이터 모델입니다. 저희는 고객과 주문서를 저장합니다.주어진 고객은 여러 개의 주문을 할 수 있으며, 모든 주문은 하나의 납품 주소와 모든 구매 물품과 관련이 있다.
SQL 테이블:

SQL에서 이러한 데이터를 저장하는 가장 편리한 방법은 4개의 표(위 그림 참조)입니다.우리는 외부 키를 통해 주문서를 고객과 프로젝트에 연결할 것이다.주어진 순서를 얻기 위해서는 Order, Address, Item 테이블에 연결을 실행해야 합니다.
관계 저장 모델에서 비관계 저장 모델로 전환합시다.문서 저장소에서 우리는 모든 데이터를 이른바 문서(JSON, XML 또는 BSON 형식)에 저장합니다.
NoSQL 문서:
// in orders
{
 "_id": 99,
 "orderDate": "2020-08-22",
 "customer": {
  "customerId": 1,
  "firstName": "Philipp",
  "lastName": "Gysel"
 },
 "address": {
  "street": "Main ln",
  "city": "Bern"
 },
 "items": [
  {
   "itemId": 88,
   "price": 9.90,
   "description": "NoSQL Distilled"
  }
 ]
}
위의 코드 세그먼트는 SQL의 표 4개가 아닌 하나의 컬렉션으로 모든 데이터를 저장합니다.컬렉션 orders 의 각 문서에는 제공 주소와 모든 항목이 포함되어 있습니다.이 밖에 고객 데이터도 각각order에 존재한다.주의, 우리는 여기서 강력한 기능을 이용했다. 서로 다른 순서는 서로 다른 길이를 가지게 될 것이다. 왜냐하면 items 원소는 임의의 크기의 수조이기 때문이다.

데이터를 저장하고 조작하는 방법


SQL에서:

  • 스토리지 없음: 스토리지를 저장할 수 없습니다.따라서 주문마다 시계줄이 필요합니다.

  • 귀일화: 데이터가 귀일화되다.중복 데이터가 없습니다.만약 고객이 인터넷 상점에서 이름을 바꾸고 싶다면, 우리는 단지 한 곳에서 고객의 이름을 갱신하기만 하면 된다.
  • NoSQL 문서 저장소에서:

  • 지원 그룹: 주문한 모든 항목을 함께 저장할 수 있습니다.

  • 데이터 중복: 주문마다 고객 데이터가 있습니다.불행하게도 고객이 이름을 변경하면 고객의 모든 order 에서 변경해야 합니다.

  • 집합: 문서 데이터베이스와 NoSQL에서는 일반적으로 혼합 데이터가 포함된 집합을 사용합니다.우리는 일반적으로 응용 프로그램이 데이터에 접근하는 방식에 따라 집합 경계를 그립니다.우리의 예에서 orders 포함된 것은 순서 자체만이 아니다. 이것은 매우 의미가 있다. 왜냐하면 응용 프로그램은 어쨌든 모든 데이터를 읽어야 하기 때문이다.

  • 트랜잭션에 최적화되지 않았습니다. 최신 NoSQL 버전은 트랜잭션을 지원하지만 분산 ACID 비헤이비어를 위해 설계된 것이 아닙니다.그러나 대부분의 용례에 있어서 이것은 문제가 아니다. 특히 모든 논리적으로 연결된 데이터가 같은 집합에 있을 때.

  • MongoDB


    일을 더욱 구체적으로 하기 위해서, 우리들은 구체적인 실현을 봅시다!다음 몇 절에서 우리는 MongoDB의 기초 지식을 소개할 것이다.

    MongoDB 쿼리


    MongoDB는 키 값 매핑을 저장하는 문서 저장소로 각 값이 서로 다른 패턴의 JSON 문서입니다.예를 들어, 컬렉션에는 다음 두 개의 문서가 포함될 수 있습니다.
    {
     "_id": 1,
     "firstName": "Philipp",
     "lastName": "Gysel"
    }
    {
     "_id": 2,
     "firstName": "John",
     "lastName": "Smith",
     "age": 22
    }
    
    MongoDB Shell를 사용하여 다음과 같이 Philipp라는 고객을 조회할 수 있습니다.
    > db.customers.find({firstName:"Philipp"})
    
    ... 이것은 우리에게 첫 번째 JSON 형식의 고객을 되돌려 줄 것이다.
    MongoDB는 CRUD 작업, 투영, 정렬 등 각종 조회 기능을 제공합니다. 조회에 대한 더 많은 정보는 본 시리즈의 다음 글을 참조하십시오.

    MongoDB 명명 규약


    MongoDB에서는 행과 열이 없고 문서와 JSON 요소를 처리합니다.
    신의 명령
    MongoDB
    테이블
    모으다
    한 줄
    파일
    회사 명
    _id
    MongoDB 문서의 주 키는 항상 _id 라고 하며 당연히 주 키를 눌러 조회할 수 있습니다.

    MongoDB - 모드 없음


    MongoDB에는 미리 정의된 패턴이 없습니다.만약 당신이 위의 문서를 다시 한 번 보면, "John"은 age 원소가 있는데, 이 원소는 "Philipp"에서 부족하다는 것을 발견할 수 있을 것이다.또한 기존 문서의 패턴을 변경할 수도 있습니다.
    > db.customers.updateOne({_id:1},{$set:{city:"Bern"}})
    
    ... 이것은 기존 문서에 도시 필드를 추가합니다.

    MongoDB 던전 세트


    읽기 확장성의 경우 MongoDB 지원replica sets복사본 집합은 하나의 주 복사본과 여러 개의 종속 복사본을 포함한다.각 노드에는 모든 데이터가 포함되어 있습니다.MongoDB는 더 많은 데이터 흐름을 지원해야 할 때 실행 중인 데이터베이스에 새 노드를 추가할 수 있습니다.기본적으로 응용 프로그램에서 온 모든 요청이 주 노드로 넘어갑니다.

    위 그림에서 응용 프로그램은 데이터베이스에 쓰기 작업을 하고 데이터베이스는 주 노드에 전송된 다음에 모든 노드에 전달된다.
    읽기 확장성은 모든 컴퓨터에서 모든 데이터를 포함하는 것을 통해 이루어진다.컴퓨터에서 읽은 데이터가 정상인지 지정하는 것이 중요합니다.
    Mongo mongo = new Mongo(“localhost:270127”);
    Mongo.slaveOk();
    
    3개의 종속기를 지정하면 현재 읽기 처리량이 4배 증가합니다!

    MongoDB 분할


    읽기 확장성: 확인✔️. 신축성 어때요?❓ 모든 쓰기 작업은 호스트를 통과해야 하기 때문에 복사 집합은 이곳에서 우리를 도울 수 없다.이것이 바로 sharding의 용무지이다. 절분을 통해 우리는 데이터를 여러 개의 구역으로 분할하고 각 구역은 서로 다른 절분에 저장한다.문서의 키 적용 모드와 같은 간단한 규칙을 사용하여 각 문서를 조각으로 분배합니다.

    현재 쓰기 작업은 서로 다른 노드에 분포되어 있다.이것은 로그 포획과 같은 쓰기 양이 많은 응용 프로그램(예를 들어 NewRelic에 특히 유용하다.또한 응용 프로그램의 측면에서 볼 때 MongoDB는 절단을 간단하게 하고 백그라운드에서 모든 복잡한 작업을 자동으로 수행한다. 예를 들어 절단을 균형 있게 하거나 어떤 문서가 어느 절단에 있는지 확인한다.

    MongoDB 정합성 보장


    MongoDB 클러스터에서 복제를 사용하는 경우 일관성에 대한 주의가 필요합니다.응용 프로그램이 문서를 오래 지속되어 조회할 수 있다고 가정하면 데이터베이스에서'찾을 수 없음'오류가 발생합니다.원인은 집단의 토폴로지 구조에 있다. 주종 설정에서 쓰기는 모든 종착기에 바로 도착하지 않고 모든 종착기가 업데이트를 받는 데 아초가 걸릴 수 있다.SQL은 즉각적인 정합성을 제공하지만 MongoDB는 최종 정합성만 보장합니다. 즉, 최종적으로 모든 노드에서 모든 업데이트를 진행합니다.
    MongoDB는 제어를 강화하기 위해 각 삽입 및 업데이트에 대해 하나를 지정할 수 있습니다writeConcern.
    db.companies.insert(
       {_id: 1, firstName: "Philipp", lastName: "Gysel"},
       {writeConcern: {w: "majority", wtimeout: 5000}}
    )
    
    여기서 우리는 이러한 상황이 발생하거나 5초의 시간이 초과될 때까지 삽입을 대부분의 노드에 전파하고 DB 호출을 막아야 한다.그러나 조심해야 한다. 일치성은 대가(지연)가 있기 때문에 당신의 특정한 용례와 데이터가 얼마나 일치해야 하는지 자세히 고려해 주십시오.

    MongoDB 거래


    MongoDB 4.0 이후 여러 문서transactions are supported.이 기능 때문에 서로 다른 집합에 사는 문서는 원자 방식으로 업데이트할 수 있다.하지만 조심해야 한다. 정부MongoDB documentation의 말처럼

    In most cases, multi-document transaction incurs a greater performance cost over single document writes, and the availability of multi-document transactions should not be a replacement for effective schema design.


    경험에 따르면, 가능하다면, 모든 연결된 데이터를 문서에 포장해 보아야 합니다. 그러면 업무를 걱정할 필요가 없습니다.

    MongoDB: 적합한 비즈니스 사례


    몽고DB는 손톱마다 사용할 수 있는 망치가 아니다.응용 프로그램의 업무와 비기능 수요를 분석한 다음에 일치하는 데이터베이스 솔루션을 검색하십시오.MongoDB는 많은 장점(확장성, 간단한 조회 언어, 그리고 그 개원)이 있지만 SQL에 비해 업무 처리 속도가 느린 단점도 있다.
    다음은 MongoDB에 적합한 몇 가지 예입니다.

  • 로그 응용 프로그램: 많은 로그를 추적하는 응용 프로그램은 MongoDB에 적합합니다.새 로그를 즉시 사용할 필요가 없기 때문에 즉시 일치성을 유지할 필요가 없습니다.그러나 성능은 확실히 중요하다. 특히 상세한 로그를 가진 많은 응용 프로그램과 관련이 있을 때.절분을 통해 비교적 큰 쓰기 용량을 잘 처리할 수 있다.

  • 블로그/소셜미디어: 트위터와 같은 응용 프로그램은 항목마다 형식이 다르다.일부는 텍스트, 일부는 이미지, 일부는 동영상을 포함하지만, 모든 내용은 선택할 수 있다.이것은 모든 요소를 포함할 수 있는 문서와 매우 일치합니다.또한 응용 프로그램이 미래에 새로운 유형의 블로그를 지원하기를 원한다면, 데이터베이스를 변경할 필요가 없고, 새 문서에 새 필드를 추가하기만 하면 됩니다.또한 즉각적인 일치성은 중요하지 않으며 1초 지연되는 특정 항목을 볼 수 있다.
  • 결론


    저는 이것이 당신이 MongoDB에 대한 더 많은 정보를 이해하는 데 도움을 줄 수 있기를 바랍니다.말할 것도 없이 기술을 배우는 가장 좋은 방법은 그것을 실제로 사용하는 것이다😉.
    덧붙이다❤️ 몽고DB 강좌를 좋아한다면질문/피드백이 있으면 메시지를 남겨 주십시오.
    MongoDB에 대한 더 많은 정보는 my를 보십시오. 이것은 MongoDB Shell과 Java에서 온 MongoDB 조회를 포함합니다!

    좋은 웹페이지 즐겨찾기