MongoDB 또는 기타 문서 지향 데이터베이스 시스템을 언제 사용해야합니까? [닫은]


516

비디오 및 오디오 클립, 사진 및 벡터 그래픽을위한 플랫폼을 제공합니다. 우리는 MySQL을 데이터베이스 백엔드로 시작했으며 최근 MongoDB 가 요구 사항에 더 잘 맞기 때문에 파일의 모든 메타 정보를 저장하는 MongoDB 를 포함 시켰습니다 . 예를 들어, 사진에는 Exif 정보가 있고 비디오에는 메타 정보를 저장하려는 오디오 트랙이있을 수 있습니다. 비디오와 벡터 그래픽은 일반적인 메타 정보 등을 공유하지 않으므로 MongoDB는이 구조화되지 않은 데이터를 저장하고 검색 가능하게 유지하는 것이 완벽하다는 것을 알고 있습니다.

그러나 우리는 계속 플랫폼을 개발하고 기능을 추가합니다. 다음 단계 중 하나는 사용자를위한 포럼을 제공하는 것입니다. 이제 발생하는 문제는 포럼 및 포럼 게시물 등을 저장하는 데 적합한 MySQL 데이터베이스를 사용하거나 MongoDB를 사용하는 것입니까?

문제는 MongoDB 사용시기와 RDBMS 사용시기입니다. 선택했다면 mongoDB 또는 MySQL 중에서 무엇을 선택하고 왜 선택해야합니까?


12
명확하지 않은 경우 왜 이것이 의견 기반으로 표시되어 있는지 잘 모르겠습니다. 여기에는 분명한 옳고 그름의 대답이 있습니다.
스펜서

답변:


659

에서 NoSQL이 : 그것은 그렇게 쉬운 일 경우에만 MongoDB에 대한 저자의 쓰기 :

MongoDB는 키 / 값 저장소가 아니며 훨씬 더 중요합니다. RDBMS도 아닙니다. 프로덕션 환경에서 MongoDB를 사용하지는 않았지만 테스트 앱을 약간 빌드하는 데 사용했으며 매우 멋진 키트입니다. 성능이 매우 뛰어나고 내결함성과 자동 샤딩 (일명 스케일링)이 있거나 곧있을 것입니다. Mongo가 지금까지 본 RDBMS 대체품에 가장 가까운 것으로 생각합니다. 모든 데이터 세트 및 액세스 패턴에 대해 작동하지는 않지만 일반적인 CRUD에 적합합니다. 본질적으로 거대한 해시를 저장하고 해당 키를 선택할 수 있다는 것은 대부분의 사람들이 관계형 데이터베이스를 사용하는 것입니다.DB가 3NF이고 조인을 수행하지 않으면 (많은 테이블을 선택하고 모든 객체를 모으는 것, 대부분의 사람들이 웹 응용 프로그램에서하는 일명 AKA) MongoDB는 아마도 당신을 위해 엉덩이를 걷어차 것입니다.

그런 다음 결론에서 :

실제로 지적해야 할 것은 데이터베이스를 선택할 수 없기 때문에 멋진 것을 만드는 것을 막고 있다면 잘못하고 있다는 것입니다. mysql을 알고 있다면 사용하십시오. 실제로 필요할 때 최적화하십시오. ak / v store처럼 사용하고 rdbms처럼 사용하지만 신을 위해 킬러 앱을 빌드하십시오! 이 중 어느 것도 대부분의 앱에 중요하지 않습니다. Facebook은 여전히 ​​MySQL을 많이 사용합니다. 위키 백과는 MySQL을 많이 사용합니다. FriendFeed는 MySQL을 많이 사용합니다. NoSQL은 훌륭한 도구이지만 경쟁 우위가 될 수 없으며 앱을 뜨겁게 만들지 않을 것입니다. 무엇보다도 사용자는 이것에 대해 신경 쓰지 않을 것입니다.

다음 앱은 무엇으로 만들 예정입니까? 아마 Postgres. NoSQL을 사용합니까? 아마도. Hadoop과 Hive를 사용할 수도 있습니다. 모든 것을 평평한 파일로 유지할 수 있습니다. 어쩌면 Maglev에서 해킹을 시작할 것입니다. 나는 직업에 가장 적합한 것을 사용할 것이다. 보고가 필요한 경우 NoSQL을 사용하지 않습니다. 캐싱이 필요한 경우 Tokyo Tyrant를 사용합니다. ACIDity가 필요한 경우 NoSQL을 사용하지 않습니다. 많은 카운터가 필요한 경우 Redis를 사용합니다. 거래가 필요한 경우 Postgres를 사용합니다. 단일 유형의 문서가 많은 경우 Mongo를 사용합니다. 하루에 10 억 개의 객체를 작성해야한다면 Voldemort를 사용했을 것입니다. 전체 텍스트 검색이 필요하다면 Solr을 사용했을 것입니다. 휘발성 데이터에 대한 전체 텍스트 검색이 필요하다면 Sphinx를 사용했을 것입니다.

나는이 기사를 좋아한다. 나는 매우 유익한 정보를 얻는다. NoSQL 환경과 과대 광고에 대한 좋은 개요를 제공한다. 그러나 가장 중요한 부분은 RDBMS와 NoSQL 중에서 선택할 때 올바른 질문을하는 데 실제로 도움이됩니다. 읽을만한 가치가 있습니다.

기사에 대한 다른 링크


4
고마워, 정말 흥미로운 기사입니다.
aurora


48
@iddqd ROFL! 이봐, 재미 있었어. "당신은 바보 충분히 완전히 신뢰성을 무시하는 경우 그냥 내가하는 데이터 당신에게 관을 제안, 벤치 마크를 얻을 /dev/null, 그것은 매우 빠른 것" : D
파스칼 Thivent

3
과대 광고 답변 주셔서 감사합니다.
deamon

2
BJ Clark이 같은 프로젝트에서 모든 기술 을 사용하지 않기를 바랍니다 . 그것은 약간의 학습 곡선이 될 것입니다.
Adam Monsen

186

2 년 동안 MongoDb를 소셜 앱으로 사용한 후 SQL RDBMS없이 살기의 의미가 무엇인지 목격했습니다.

  1. RDBMS가 자동으로 수행하는 다른 테이블 / 컬렉션의 데이터 조인과 같은 작업을 수행하는 작업을 작성하게됩니다.
  2. NoSQL의 쿼리 기능이 크게 손상되었습니다. MongoDb는 SQL에 가장 가까운 것이지만 여전히 매우 뒤떨어져 있습니다. 날 믿어. SQL 쿼리는 매우 직관적이고 유연하며 강력합니다. MongoDb 쿼리는 그렇지 않습니다.
  3. MongoDb 쿼리는 하나의 컬렉션에서만 데이터를 검색하고 하나의 인덱스 만 활용할 수 있습니다. 그리고 MongoDb는 아마도 가장 유연한 NoSQL 데이터베이스 중 하나 일 것입니다. 많은 시나리오에서 이는 관련 레코드를 찾기 위해 서버로 더 많은 왕복을 의미합니다. 그런 다음 데이터 비정규 화를 시작합니다. 즉 백그라운드 작업을 의미합니다.
  4. 데이터베이스가 관계형 데이터베이스가 아니라는 사실은 데이터의 일관성을 유지하기 위해 외래 키 제약 조건이없는 것을 의미합니다. 이것이 결국 데이터베이스에 데이터 불일치를 생성 할 것이라고 확신합니다. 준비하십시오. 대부분의 경우 데이터베이스의 일관성을 유지하기 위해 프로세스 작성 또는 검사를 시작하게되므로 RDBMS가이를 수행하도록하는 것보다 성능이 떨어질 수 있습니다.
  5. 동면과 같은 성숙한 프레임 워크는 잊어 버리십시오.

모든 프로젝트의 98 %가 NoSQL보다 일반적인 SQL RDBMS에서 더 나을 것이라고 생각합니다.


10
흥미로운 생각 ...
luigi7up

3
반면에, 쿼리 기능과 설명하는 조인은 문제가되지 않습니다. MongoDB를 사용하는 경우 컬렉션을 디자인하기 위해 약간의 작업을 수행해야하고 복잡한 데이터가 필요하지 않은 데이터를 넣을 작업이 여전히 필요합니다 가입 등. 어쨌든 DB는 병목 현상이 아니며 일부 유스 케이스에는 Memcache와 같은 해결 방법이 있습니다. 처음부터 시작하면 MongoDB 디자인 및 사용이 더 간단하고 빠릅니다 (객체 코드로 작업하는 개발자로서 ORM이 필요하지 않음). 물론 몇 가지 스크립트를 작성해야하지만 실제로 그렇게 어렵지는 않으며 코드를 재사용해야합니다.
Aki

1
대부분의 사람들은 자신이 만든 특정 사용 사례에 대해 NoSQL 데이터베이스를 사용하지 않으므로 나중에 많은 바퀴를 다시 만듭니다. NoSQL에 SQL 대 토론 그들이하는 시간을 거슬러 20 ~ 30 년가는 것처럼 많은 사람들이되는 NoSQL을 사용 경험할 것을 보여 -커드 사전은 사전 관계형, 사전-SQL 시간을 . 또는, 마이클 스톤 브레이커 둔다으로는 : "무엇을 일주하는 것은 주위에 온다"
루카스 에델에게

1
항목 # 3, "하나의 색인 만 활용"이 오늘날에도 유효합니까? 방금 MongoDB에 들어가고 있으며 지금까지 읽거나 본 것으로 여러 인덱스를 지원할 수 있습니까?
Jeach

1
@Jeach : 아니요. # 3은 더 이상 사실이 아닙니다. MongoDB 2.6은 인덱스 교차를 도입했습니다 .
Rob Garrison

26

이 비정형 데이터를 저장

말했듯이 MongoDB는 비정형 데이터를 저장하는 데 가장 적합합니다. 그리고 이것은 데이터를 문서 형식으로 구성 할 수 있습니다. NoSQL 데이터 저장소 ( MongoDB , CouchDB , Voldemort ) 라고하는 이러한 RDBMS 대체 기능은 대규모로 확장되고 이러한 빅 데이터 저장소에서 더 빠른 데이터 액세스가 필요한 애플리케이션에 매우 유용합니다.

그리고 이러한 데이터베이스의 구현은 일반 RDBMS보다 간단합니다. 이것들은 단순한 키-값 또는 문서 스타일 바이너리 객체이기 때문에 디스크에 직접 직렬화됩니다. 이러한 데이터 저장소는 ACID 속성스키마를 적용하지 않습니다 . 이것은 거래 능력을 제공하지 않습니다 . 따라서 확장 성이 커지고 더 빠른 액세스 (읽기 및 쓰기)를 달성 할 수 있습니다.

그러나 RDBM은 데이터에 ACID 및 스키마를 적용합니다. 구조화 된 데이터로 작업하려면 RDBM을 사용하십시오.

이런 종류의 포럼 을 만들기 위해 MySQL 을 선택합니다 . 이것은 크게 확장되지 않기 때문입니다. 그리고 이것은 데이터 사이에 구조화 된 관계를 갖는 매우 간단한 (공통) 응용 프로그램입니다.


10
"포럼을 만들기 위해 mysql을 선택합니다." 정말? 포럼과 같은 것은 관계형보다 문서 지향 데이터베이스를 사용하여 작성하는 것이 훨씬 쉽다고 생각합니다 (처음부터 작성하는 경우). RDBMS의 기능이 특별히 필요하지 않은 경우, 사용 및 확장을 쉽게하기 위해 MongoDB 또는 이와 유사한 데이터베이스를 사용하는 것이 좋습니다.
Sasha Chedygov 09

2
CouchDB는 ACID를 지원합니다. couchdb.apache.org/docs/overview.html
Sonia

2018 : MongoDB도 ACID 지원
Nepoxx

10

Mongo는 기본적으로 JSON을 저장합니다. 앱이 많은 JS 객체 (중첩 포함)를 처리하고 있으며 이러한 객체를 유지하려는 경우 Mongo를 사용하는 데 대한 강력한 논거가 있습니다. DAL 및 MVC 레이어는 모든 JS 객체 속성의 패키지를 풀지 않고 자연스럽게 맞지 않는 구조 (스키마)에 강제로 맞추려고하지 않기 때문에 매우 얇습니다.

우리는 몇 개의 복잡한 JS 객체를 중심으로하는 시스템을 가지고 있으며, 모든 것을 실제로, 정말 쉽게 유지할 수 있기 때문에 Mongo를 좋아합니다. 우리의 객체는 다소 비정질이며 구조화되어 있지 않으며 Mongo는 깜박이지 않고 그 합병증을 흡수합니다. 우리는 인간 소비에 대한 비정질 데이터를 해독하는 사용자 정의보고 계층을 가지고 있으며 개발하기가 어렵지 않았습니다.


7

복잡한 트랜잭션이 필요한 경우 RDBMS를 사용한다고 말합니다. 그렇지 않으면 MongoDB와 함께 갈 것입니다-더 유연하게 작업하고 필요할 때 확장 할 수 있다는 것을 알고 있습니다. (하지만 편견이 있습니다-MongoDB 프로젝트에서 작업합니다)


7
복잡한 트랜잭션은 MongoDB에서 작동하지 않지만 MarkLogic과 같은 다른 NoSQL 데이터베이스에서는 작동합니다 (MarkLogic의 개발자 커뮤니티를 실행 한 이후에도 편향적입니다).
Eric Bloch

MarkLogic에 대한 힌트를 주셔서 감사합니다. 몰랐습니다.
오로라

나는 mdirolf로부터 그것에 대해 듣고 싶습니다. MongoDB가 트랜잭션을 구현하지 않기로 선택한 이유는 무엇입니까?
Aki

7

분산 된 샤드 포럼이 필요한 사람은 누구입니까? 아마도 Facebook이지만 Facebook 경쟁자를 만들지 않는 한 Mysql, Postgres 또는 가장 편한 것을 사용하십시오. MongoDB를 사용 해보고 싶다면 좋아하지만 마술을 기대하지 마십시오. 당신이 이미 이미 작업하고 있다면 이미 발견했듯이 다른 모든 것과 마찬가지로 기발하고 일반적인 성실함이 있습니다.

물론, MongoDB는 과장되어 표면에서 쉬워 보일 수 있지만 더 성숙한 제품이 이미 극복 한 문제가 발생할 수 있습니다. 그렇게 쉽게 유혹하지 말고 "nosql"이 성숙하거나 죽을 때까지 기다리십시오.

개인적으로, "nosql"은 정해진 표준 (거의 정의에 따라)이 없기 때문에 조각화로 시들어 죽을 것이라고 생각합니다. 그래서 나는 장기 프로젝트에 개인적으로 투자하지 않을 것입니다.

필자의 책에 "nosql"을 저장할 수있는 유일한 방법은 Ruby 나 유사한 언어에 완벽하게 통합 될 수 있고 코딩과 디자인에 거의 오버 헤드없이 언어를 "지속적"으로 만들 수 있다는 것입니다. 그것은 지나갈 지 모르지만 지금은 아니고 그때까지 기다릴 것이고 물론 더 성숙해야합니다.

Btw, 왜 처음부터 포럼을 만들고 있습니까? 차세대 포럼을 만들지 않는 한 대부분의 요구 사항에 맞게 조정할 수있는 수많은 오픈 소스 포럼이 있습니다 (의심 할 것입니다).


5
답변 주셔서 감사합니다. 포럼을 통합하는 것은 엉망입니다. 우리는 이미 이것을 해왔고 다시는 가지 않기로 결정했습니다. 수천 가지 기능이 필요하지 않지만 소프트웨어에 완전히 통합되었습니다.
오로라

4

많은 회사에서 애플리케이션 로그의 실시간 분석을 위해 MongoDB를 사용하고있는 것을 보았습니다. 스키마가없는 것은 레코드 스키마가 때때로 변경되는 경향이있는 응용 프로그램 로그에 실제로 적합합니다. 또한 Capped Collection 기능은 오래된 데이터를 자동으로 제거하여 데이터를 메모리에 맞추기 때문에 유용합니다.

그것은 실제로 MongoDB가 적합하다고 생각하는 영역이지만 MySQL / PostgreSQL이 일반적으로 더 권장됩니다. 웹에는 기능과 견고성뿐만 아니라 많은 문서와 개발자 리소스가 있습니다.


4

몽고를 선호하는 2 가지 주요 이유는

  • 스키마 디자인의 유연성 (JSON 유형 문서 저장소).
  • 확장 성-노드를 추가하기 만하면 수평 확장이 가능합니다.

빅 데이터 애플리케이션에 적합합니다. RDBMS는 빅 데이터에 적합하지 않습니다.


3

조인과 '복잡한 트랜잭션'에 관한이 모든 것들을 알고 있습니다.하지만 수년 전에 COMMIT / ROLLBACK의 "필요한"부분을 설명해 준 Monty 자신이었습니다. (데이터베이스가 아닌) 어쨌든 '-다시 한 번 같은 일입니다. 필요한 것은 웹 앱의 99 %에 대해 멍청하지만 매우 정교하고 빠른 데이터 저장 / 검색 엔진입니다.


고마워요, 당신은 여기서 흥미로운 점을 제기하고 있습니다. 여러 테이블에서 복잡한 업데이트 롤백이 순수한 응용 프로그램 논리에 어떻게 적용되는지 확실하지 않기 때문에 Monty의 설명에 정말로 관심이 있습니다. 이것이 실제로 가능한지 확실하지 않습니까?
오로라

'최상의'방법도 확실하지 않습니다. 우리는 항상 DB에 대한 모든 작업을 추적 한 다음 애플리케이션 수준에서 코드로 허용하거나 실행 취소했습니다. 우리는 언제 어디서나 거래에 의존하지 않았습니다. Mongo 문서는 메타 데이터를 사용하여 롤백 가능한 트랜잭션의 어떤 부분이 발생했는지, 트랜잭션이 중단되어 롤백해야하는 경우의 상태를 추적하도록 제안합니다. 재밌는 점은, 우리는 이미 MySQL 및 다른 것들과 함께 모든 일을 해왔 었다는 것입니다. 그것은 더 많은 일이 아니며 블랙 박스 대신에 언제, 어디서, 왜 일어나고 있는지에 초점을 유지합니다.
FYA

10gen 웹 사이트에 'interlock'필드 또는 'ratchet'을 수동으로 사용하여 다단계 프로세스의 상태를 나타내는 방법에 대한 메모가 있습니다. MySQL 엔진 자체를 확대해도 "블록 트랜잭션"은 계속해서 일련의 단계로 확장됩니다. 데이터베이스 필드에서 수동으로 추적을 수행하는 것보다 인터 락 또는 래칫이 훨씬 작고 빠른 방식으로 수행됩니다.
FYA

아직 MongoDB 데몬을 제한 할 수있는 좋은 방법을 찾지 못했습니다. 인덱스와 데이터 저장소에 사용 가능한 거의 모든 RAM을 메모리에 저장하지만 다른 프로세스에서 필요할 때 빠르게 메모리를 생성합니다. 여전히 'go_max_memory'또는 쉽게 정의 할 수있는 다른 제한이있어 MongoDB가 실행되지 않도록하고 서버를 스왑 스 래싱으로 보내도록하는 것이 좋습니다 (최신 버전에서도 여러 번 보았습니다). 적어도 MySQL은 모든 종류의 정의 가능한 제한 및 작업 힌트를 허용합니다.
FYA

직접 관련이 없지만 종류 : memcached를 사용하고 있었지만 아직 해결되지 않은 Memcache / Memcached PHP 드라이버 fiasco로 인해 포기했습니다. 우리는 apc_store ()가 얼마나 빠르고 쉬운 지 발견 할 때까지 MongoDB를 빠르고 임시 키 : val 저장소로 사용했습니다. APC가 memcached에서 사용했던 임시 크루 드 (vs 사전 컴파일 된 PHP)로 가득 차면 key : val 스토리지를 위해 MongoDB로 돌아갑니다.
FYA

1

이전에 말했듯이 많은 선택 중에서 선택할 수 있으며 모든 선택을 살펴보십시오. http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

내가 제안하는 것은 최고의 조합을 찾는 것입니다 : MySQL + Memcache는 ACID가 필요하고 일부 테이블을 조인하려는 경우 정말 좋습니다. MongoDB + Redis는 문서 저장소에 적합 Neo4J는 그래프 데이터베이스에 완벽합니다

내가하는 일 : 사용하기 때문에 MySQl + Memcache로 시작한 다음 다른 데이터베이스 프레임 워크를 사용하기 시작합니다. 단일 프로젝트에서 예를 들어 MySQL과 MongoDB를 결합 할 수 있습니다!


MySQL + memcached는 최종 일관성을 제공합니다. RDMB 컨텍스트에서 ACID를 고려하지 않습니다.
R. van Twisk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.