누군가 관계형 DBMS를 통해 MongoDB (또는 유사한)를 언제 사용합니까?


134

나는 NoSQL과 관련하여 약간 혼란스러워합니다. 언제 Oracle 또는 MySQL과 같은 MongoDB와 같은 것을 사용 하시겠습니까? 사용법이 서로 다른 한 "차이"를 실제로 이해하지 못합니다.

내 이해에서 NoSQL 유형 데이터베이스는 RDBMS를 대체하기위한 것이 아니라 정확히 무엇을 의미합니까?


무엇을 읽고 있습니까? 당신은 우리에게 따옴표 나 링크 또는 배경을 제공 할 수 있습니까? 우리는 당신이 얼마나 알고 있는지 또는 모른다.
S.Lott

3
여기로 옮길 때까지 / MongoDB 또는 다른 문서 지향 데이터베이스 시스템을 사용하는시기를 포함하여 StackOverflow에 대해 매우 유사한 몇 가지 질문이 있습니다.
Nicole

1
그것은 웹 규모 mongodb-is-web-scale.com / s
Froome

3
냉소적으로 : 그것은 과대 광고이기 때문에 많은 사람들이 과대 광고를 따르기를 좋아합니다.
Sjoerd

@ 페이스 : 나는 이 게시물 을 이길 어렵다고 생각합니다 .
Robert Harvey

답변:


34

나는 애완 동물 프로젝트를 위해 CouchDB를 사용했습니다.

  • 마이크로 블로그 시스템.
  • 내가 작성한 작은 메모 작성 앱의 정보를 저장하십시오.
  • 범용 브레인 스토밍 애플리케이션.

내가 MSSQL 또는 MySQL과 같은 것을 선택했을 때 가장 큰 이유는 사용시 얻을 수있는 유연성 때문입니다. 엄격한 스키마가 없습니다. 3 개월 줄 아래로 여분의 필드를 가지려면 특정 테이블이 필요합니다.이 테이블과 그 테이블을 변경하면 테이블이 변경됩니다.

내가 사용 CouchDB를부터 그것을 사용하는 방법을 배울 Apress의에 의해.

예를 들어, CouchDB는 json을 사용하여 데이터베이스와 통신합니다. 언어가 데이터를 POST 할 수 있으면이를 사용하여 DB와 통신 할 수 있습니다.

또한 읽기 : 관계형 데이터베이스 대신 문서 기반 데이터베이스를 사용해야하는 이유는 무엇입니까? StackOverflow에서


31
처음 두 예제는 전통적인 관계형 DBMS에 대한 좋은 도메인처럼 들립니다.
Jonas

4
@ yati : 그런 종류의 응용 프로그램은 StackOverflow.com과 비슷하며 전통적인 관계형 데이터베이스와 매우 잘 작동합니다.
조나스

4
@yatisagade : 우리는 역동적 인 소셜 사이트에 대해 이야기하고 있지 않습니다. 그러나 약간의 메모는 앱마이크로 블로그 시스템을 가지고 있습니다.
조나스

2
정의 된 스키마가 더하기 어떻습니까? 관계형 DB를 사용하면 3 개월 동안 추가 필드가 필요한 경우 필드를 추가하기 만하면됩니다. 관계형 DB를 사용하면 필드를 동적으로 추가 할 수 없지만 동적으로 추가 된 필드를 사용하도록 응용 프로그램 코드를 동적으로 변경할 수도 없습니다.
솔로몬 오프의 비밀

12
이 답변은 관계형 데이터베이스의 스키마를 변경할 수 없음을 나타냅니다. 나는 누군가가 이것을 믿게 만들 수있는 오해의 양을 이해할 수 없다. 관계형 데이터베이스에 새 열을 추가하는 것은 쉽지 않습니다. 일반적으로 멋진 UI가 있거나 스크립트를 선호하는 경우 단일 SQL 문으로 수행 할 수 있습니다.
JacquesB

24

다른 답변을 추가하여 죄송하지만 여기에 대한 답변 중 어느 것도 매우 만족스럽지 않습니다. 이 답변은 MongoDB에만 해당됩니다 (관계형 데이터베이스가 아닌 광범위한 다른 데이터 저장소 옵션과 대조적 임).

장점 :

  • MongoDB는 쿼리 당 대기 시간이 짧고 쿼리 당 CPU 시간을 줄입니다 (조인, 트랜잭션 등). 결과적으로 초당 쿼리 측면에서 더 높은로드를 처리 할 수 있으므로 많은 수의 사용자가있는 경우에 종종 사용됩니다.
  • MongoDB는 트랜잭션 및 일관성에 대해 걱정할 필요가 없기 때문에 클러스터에서 사용하기더 쉽습니다 .
  • MongoDB는 쓰기 속도가 빠르기 때문에 트랜잭션이나 롤백에 대해 걱정할 필요가 없으므로 잠금에 대해 걱정할 필요가 없습니다.
  • MongoDB 에는 이를 활용할 수있는 특수 사용 사례가있는 경우 스키마가 없습니다 .

단점 :

  • MongoDB 는 트랜잭션을 지원하지 않습니다 . 이것이 대부분의 이점을 얻는 방법입니다.
  • 일반적으로 MongoDB는 클라이언트 서버에 더 많은 작업 (예 : CPU 비용)을 생성합니다 . 예를 들어, 데이터를 결합하려면 여러 쿼리를 발행하고 클라이언트에서 결합을 수행해야합니다.
  • 2017 년에도 MongoDB에 대한 툴링 지원 은 관계형 데이터베이스보다 새롭기 때문에 덜 지원 됩니다. 또한 관계형 전문가 보다 MongoDB 전문가적습니다 .

종종 오해 된 점 :

  • MongoDB 및 관계형 데이터베이스 모두 인덱싱을 지원합니다. 쿼리 성능은 큰 쿼리 실행 측면에서 비슷합니다 .
  • MongoDB는 마이그레이션의 필요성을 제거하지 않으며 스키마가 발전함에 따라 기존 데이터를 업데이트 하지 않습니다 . 예를 들어, 특정 데이터를 포함하기 위해 users 테이블에 의존하는 응용 프로그램이 있고 다른 데이터를 포함하도록 해당 테이블을 수정하는 경우 (프로필 그림 필드를 추가한다고 가정) 여전히 다음 중 하나를 수행해야합니다.
    • 이 속성이 정의되지 않은 객체를 처리하는 응용 프로그램을 작성하십시오. 또는
    • 이 특성의 기본값을 설정하기 위해 일회성 마이그레이션을 작성하거나
    • 이 필드가 없으면 쿼리시 기본값을 제공하는 코드 작성 또는
    • 다른 방법으로 누락 된 필드 처리

2
많은 NoSQL 대 RDBMS 토론에서 놓친 큰 점을 추가하고 싶습니다. NoSQL 데이터베이스는 임시 쿼리 ( "SQL 부분 없음")에 훨씬 더 어렵습니다. 이는 개발자 든 아니든간에 사실입니다. 또한 보고서 작성이 훨씬 어려워 심각한 비즈니스에 매우 중요합니다.
Michael

나는 데이터베이스와의 이러한 상호 작용을 권장하지 않기 때문에 거의 MongoDB의 기능이라고 부릅니다. 그러나 Mongo에는 임시 쿼리 언어와 그래픽 임시 클라이언트 (Compass)가 있습니다. SQL만큼 기능이 풍부하지 않으므로 잠재적 인 단점이라고 생각하지만 개인적으로 사용할 데이터베이스를 결정할 때 결코 변화를주지 않을 것입니다.
페이스

1
데이터베이스의 데이터 탐색을 권장하지 않는 이유는 무엇입니까? 이 데이터베이스에 비즈니스에 유용한 정보가 있으면 가능한 한 액세스 할 수 있어야합니다. 프로덕션에로드를 추가하지 않는 것은 분명히 복제본을 읽은 것입니다.
Michael

이것은 아마도 흥미로운 질문 일 것입니다. 많은 사람들이 다른 관점을 가질 것이라고 생각합니다. 개인적으로 유지 관리 문제가되므로 피하십시오. 웹 응용 프로그램을 만들고 성능을 유지 관리하고 최적화하기 위해 노력하는 REST API를 공개합니다. 너무 많은 영업 엔지니어의 쿼리 스크립트를 손상시킬 수 있기 때문에 데이터베이스를 도매로 변경할 수없는 상황에 처해 있었고 지금은 그 시나리오를 피하려고합니다. 예를 들어 최근에 PostgreSQL에서 Cassandra로 DB의 일부를 확장하여 성능을 높이고 API를 변경할 필요가 없었습니다.
페이스

결국 데이터를 보는 데 관심이있는 이해 관계자가 항상 있습니다. SQL 쿼리 또는 ipython 노트북 스크립트 또는 re : dash를 통한 여부 따라서 데이터베이스를 변경할 때 항상 이러한 종속성을 위반하지 않도록해야합니다. RDBMS가 아닌 SQL은 데이터를보다 쉽게 ​​액세스 할 수있게 해주 며 비즈니스에게는 좋은 일입니다.
Michael

13

르네 시스 에서 부끄러운 도둑질하기 위해 (실제로 나는이 답변을 CW로 만들고 있습니다) :


다른 유형 대신 RDBMS 사용 :


4
"RDBMS는 성능을 위해 인덱싱을 많이 사용합니다" MongoDB에도 인덱싱이 사용되지 않습니까?
Rotareti

MongoDB 또는 기타 문서 지향 데이터베이스 시스템을 언제 사용해야합니까? 현재 SO에서 삭제되었습니다. 더 이상 .. 질문을 다시 열었으므로 보호했습니다. 삭제 이유가 확실하지 않습니다.
Rahul

9

데이터가 관계형이 아닌 경우 성능 및 확장 성 (환경에 따라 다름)과 같은 NoSQL 데이터베이스를 사용하면 큰 이점이 있습니다. CQRS와 같은 일부 디자인 패턴은 일반적으로 SQL 데이터베이스의 독점적 사용을 요구하는 영역에서 비 관계형 데이터를 훨씬 쉽게 활용할 수 있도록합니다.

캐시 된 데이터에 mongo와 같은 데이터베이스를 사용하는 것이 일반적입니다. 예를 들어, 보고서를 생성해야하는 경우 즉시 많은 데이터를 결합하고 집계하는 복잡한 SQL 쿼리를 수행하거나 이미 생성해야하는 모든 것이있는 몽고 데이터베이스에서 단일 json 문서를 가져올 수 있습니다. 보고서. 이렇게하면 데이터를 정말 쉽고 빠르게 읽을 수 있지만 데이터를 매우 복잡하게 만들 수 있습니다 (CQRS가 들어오는 곳).


8

MongoDB와 같은 데이터베이스는 일반적으로 데이터가 어디에 있는지 알고있을 때 유용합니다 (복잡한 쿼리를 여러 개 작성하지 않아도 됨). Mongo를 사용하면 "관련"데이터가 상위 데이터에 중첩되거나 기본 / 외국 키가 있습니다. 예를 들어 게시물과 댓글이있는 경우 유용합니다. 일반적으로 게시물 컨텍스트 외부에 주석을 표시하지 않으므로 게시물에 주석을 포함시키는 것이 좋습니다 (따라서 별도의 테이블을 쿼리 할 필요없이 게시물에 대한 모든 주석을 얻습니다).

MongoDB는 스키마가 없습니다. 즉, 대부분의 경우 데이터 구조를 취하게됩니다.

반면에 집계 함수를 사용해야하고 Mongo에서 임베드 또는 간단한 관계를 통해 달성 할 수없는 복잡한 방식으로 데이터를 쿼리해야하는 경우, MySQL 또는 PostgreSQL과 같은 RDBMS를 사용할 때가되었음을 알 수 있습니다.

MongoDB는 SQL을 대체하지 않습니다. 단순히 다른 요구를 충족 시키며 MongoDB와 RDBMS를 함께 사용할 수 있습니다. 내 의견으로는 MongoDB가 데이터를 유연하게 만들거나 부모 문서에 포함 할 필요가 없다면 필요한 것은 아닙니다. MongoDB를 사용한 개발은 프로젝트를 시작하고 실행하는 데 훨씬 적은 단계가 있기 때문에 매우 재미 있습니다. 변경이 필요하십니까? 문제 없어요. 모델에 속성을 추가하기 만하면됩니다. 끝난.

다른 많은 NoSQL 데이터베이스에 대해서는 말할 수 없지만 RDBMS가 충족 할 수없는 특정 요구를 충족하도록 유사하게 설계되어 있다는 것을 알고 있습니다. 일부는 전적으로 메모리에 상주하거나 매우 쉽게 샤딩 또는 확장 할 수 있습니다. Cassandra는 노드가 다운되면 데이터 손실없이 계속 작동하도록 설계되었습니다. Redis는 기본적으로 메모리에 상주하는 주요 값 저장소이며 (지속성을 위해 주기적 디스크 쓰기 사용) 세트와 같은 데이터 유형을 저장하고 정렬 할 수 있습니다.


6

주요한 승리는 데이터를 분할하거나 다중 마스터 데이터베이스를 보유하려는 경우입니다. MySQL에서 데이터를 파쇄 할 수 있지만 큰 고통으로 바뀝니다. 많은 쓰기 작업을 수행하는 경우 여러 서버에서 데이터를 분할하는 것이 유용한 경우가 종종 있습니다. 문제가되는 동안 강력한 참조 일관성을 유지하려면 CAP 정리를 조회 할 수없는 경우 매우 어려울 수 있습니다.

SQL 데이터베이스는 일관성은 뛰어나지 만 파티션 지원은 매우 나쁘고 NoSQL 데이터베이스는 다른 방향으로 가고 있습니다. 분할하기 쉽지만 종종 최종 일관성이라고합니다. 은행이 괜찮다면 메시징 사이트를 구축하는 것이 좋습니다.

또한 데이터를 저장하는 방법에 대한 여러 모델이 있으므로 SQL 데이터베이스를 사용하기 전에 물건을 구현하는 방법을 선택할 수 있습니다.

SE Radio는이 주제에 관한 몇 가지 좋은 에피소드를 가지고 있습니다.


샤딩은 데이터 센터의 아키텍처에 크게 의존한다는 것을 기억해야합니다. 서버 랙이 있으면 성능이 뛰어납니다. 분산 DC에서는 그리 많지 않습니다. NoSql DB에서의 일반적인 파티셔닝 용이성에 대한 의견에 동의하지만 신뢰성은 핵심 관심사입니다.
Apoorv Khurasia 21시 03 분

많은 쓰기 작업을 수행하는 경우 비정규 화 된 stronly 인덱스 읽기 모델과 인덱싱되지 않은 쓰기 모델의 두 가지 모델이있을 수 있습니다. 복잡성을 추가하는 자연스럽게 복제가 필요합니다. NoSQL 제한에 대처하는 것, 즉 Java 도메인의 레코드와 일치시키기 위해 더 많은 프로그래밍 작업을 직접 수행하거나 기존 DB 복제 기술이 작업을 수행하거나 더 많은 비용을 지불해야하는 경우 구성 및 하드웨어.
로렌스

1

MongoDB는 많은 양의 데이터를 작성하고 쿼리 요구가 너무 복잡하지 않을 때 잘 작동합니다. 따라서 MongoDB는 명령 측에서 이벤트 소싱으로 CQRS를 구현할 때 적합합니다. 즉, 이벤트 저장소는 MongoDB 데이터베이스입니다.

쿼리 측면에서 우리는 여전히 유연성으로 인해 뷰와 WCF 데이터 서비스가있는 SQL Server db를 사용합니다. 나는 대부분의 경우 쿼리를 위해 관계형 DB의 힘이 정말로 필요하다고 생각합니다.


많은 데이터를 쓰는 경우 전역 쓰기 잠금이 부정적인 영향을 미치지 않습니까?
Apoorv Khurasia 21시 01 분

1
Mongodb는 더 이상 전역 쓰기 잠금을 사용하지 않습니다 (위의 주석이 게시 될 때 잠금이 필요하지 않도록 이미 업데이트되었습니다).
Jules

1

MongoDB와 RDBMS의 즉각적이고 근본적인 차이점은 기본 데이터 모델입니다. 관계형 데이터베이스는 데이터를 테이블과 행으로 구성하고 MongoDB는 데이터를 JSON 문서 모음으로 구성합니다. JSON은 스스로 설명하고 사람이 읽을 수있는 데이터 형식입니다. 브라우저와 서버 간의 가벼운 교환을 위해 원래 설계된이 응용 프로그램은 많은 유형의 응용 프로그램에서 널리 사용되고 있습니다.

JSON 문서는 여러 가지 이유로 데이터 관리에 특히 유용합니다. JSON 문서는 자체적으로 키-값 쌍인 필드 세트로 구성됩니다. 즉, 각 JSON 문서는 어디에서나 사람이 읽을 수있는 사람이 읽을 수있는 스키마 디자인을 가지고 있으므로 문서가 의미를 잃지 않고 데이터베이스와 클라이언트 애플리케이션간에 쉽게 이동할 수 있습니다.

JSON은 또한 응용 프로그램 계층에서 사용하기위한 자연스러운 데이터 형식입니다. JSON은 열과 행으로 구성된 테이블보다 풍부하고 유연한 데이터 구조를 지원합니다. JSON 필드는 숫자, 문자열, 부울 등과 같은 필드 유형을 지원할뿐만 아니라 배열 또는 중첩 된 하위 오브젝트 일 수 있습니다. 이는 애플리케이션이 작업하는 객체를보다 자세히 표현하는 일련의 정교한 관계를 나타낼 수 있음을 의미합니다. 데이터베이스에서 JSON 문서를 사용한다는 것은 데이터베이스와 데이터베이스가 제공하는 애플리케이션간에 객체 관계형 매퍼가 필요하지 않음을 의미합니다. 올바른 형식으로 데이터를 유지할 수 있습니다


1

데이터에 많은 쿼리가 필요한 경우 NoSQL 솔루션이 좋지 않으며 트랜잭션 지원 (ACID)이 필요한 경우 NoSql이 가장 적합하지 않습니다. 빠른 읽기가 필요한 구조가 다소 독창적 일 때 문서 나 페이지 구조로 검색하는 경우 NoSQL이 빛을 발한다고 생각합니다. 그러나 많은 NoSQL 솔루션이 상당히 빠르게 향상되어 단점이 곧 사라질 것입니다. 어쨌든 관계형 데이터베이스는 여전히 대부분의 응용 프로그램에 적합하다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.