관계형 데이터베이스와 비교하여 MongoDB와 같은 스키마없는 데이터베이스를 사용하면 어떤 이점이 있습니까?


95

저는 MySQL 또는 PostgreSQL과 같은 관계형 데이터베이스를 사용하고 Symfony, RoR 또는 Django와 같은 MVC 프레임 워크와 결합하는 데 익숙하며 훌륭하게 작동한다고 생각합니다.

그러나 최근에 나는 인용, 비 관계형 데이터베이스, 또는 MongoDB에 대해 많이 들었어요 공식 정의를 ,

확장 가능한 고성능 오픈 소스 스키마가없는 문서 지향 데이터베이스입니다.

저는 엣지에있는 것에 정말 관심이 있고, 다음 프로젝트를 위해 내가 가질 모든 옵션을 인식하고 최고의 기술을 선택하고 싶습니다.

어떤 경우에 MongoDB (또는 유사한 데이터베이스)를 사용하는 것이 "전통적인"관계형 데이터베이스를 사용하는 것보다 낫습니까? 그리고 일반적으로 MongoDB와 MySQL의 장점은 무엇입니까? 아니면 적어도 왜 그렇게 다른가요?

문서 및 / 또는 예제에 대한 포인터가 있으면 큰 도움이 될 것입니다.

답변:


57

웹 애플리케이션 구축을위한 MongoDB의 몇 가지 장점은 다음과 같습니다.

  1. 문서 기반 데이터 모델. 기본 저장 단위는 JSON, Python 사전, Ruby 해시 등과 유사합니다. 이는 배열 및 기타 문서를 보유 할 수있는 풍부한 데이터 구조입니다. 즉, 관계형 db에서 적절하게 표현하기 위해 여러 테이블이 필요한 구조를 단일 엔티티로 표현할 수 있습니다. 이는 데이터가 변경 불가능한 경우 특히 유용합니다.
  2. 깊은 쿼리 기능. MongoDB는 SQL만큼 강력한 문서 기반 쿼리 언어를 사용하여 문서에 대한 동적 쿼리를 지원합니다.
  3. 스키마 마이그레이션이 없습니다. MongoDB는 스키마가 없으므로 코드가 스키마를 정의합니다.
  4. 수평 적 확장성에 대한 명확한 경로.

더 나은 아이디어를 얻으려면 그것에 대해 더 많이 읽고 가지고 놀아야합니다. 다음은 온라인 데모입니다.

http://try.mongodb.org/


3
이 답변을 수락했지만 다른 좋은 답변을 아래에서 살펴보십시오. 예를 들어 @marcgg는 흥미로운 링크로 대답했습니다.
Guillaume Flandre

"더 나은 성능"이라는 말은 오해의 소지가 있습니다. 그것은 당신이하는 일에 달려 있습니다. 조인을 지원하지 않는 MongoDB는 더 빠르지 않고 단순한 DB 작업에서 더 낫다는 것을 의미합니다. 조인이 제공하는 기능이 필요하면 Mongo와의 성능이 떨어질 것입니다. 그러나 조인이나 관계형 기능이 전혀 필요하지 않다면 Mongo가 더 성능 / 확장 성이있을 수 있습니다.
Sasha Chedygov

감사합니다 @SashaChedygov. 동의합니다. 즉 : 2010 년 나를 아주 실수였다
카일 은행

@KyleBanker : 걱정하지 마세요. 2013 년에 누군가가 그것을보고 잘못된 생각을하게 될 경우를 대비해 댓글을 달면됩니다. :) 수정을 위해 +1합니다.
Sasha Chedygov

Mongo는 특정 시나리오에서 유용한 매우 구체적인 수평 확장 경로를 제공합니다 ....
AK_

23

많은 장점이 있습니다.

예를 들어 데이터베이스 스키마가 더 확장 가능하고 마이그레이션에 대해 걱정할 필요가 없으며 코드를 작성하는 것이 더 즐거울 것입니다 ... 예를 들어 여기에 내 모델 코드 중 하나가 있습니다.

class Setting
  include MongoMapper::Document

  key :news_search, String, :required => true
  key :is_availaible_for_iphone, :required => true, :default => false

  belongs_to :movie
end

키를 추가하는 것은 코드 한 줄을 추가하는 것입니다!

더 나은 scallability 및 속도와 같이 장기적으로 나타날 다른 이점도 있습니다.

... 그러나 비 관계형 데이터베이스가 관계형 데이터베이스 보다 낫지 않다는 점을 명심하십시오 . 데이터베이스에 많은 관계와 정규화가있는 경우 MongoDB와 같은 것을 사용하는 것은 의미가 없을 수 있습니다. 작업에 적합한 도구를 찾는 것이 전부입니다.

더 많은 것을 읽으려면 " 왜 Mongo가 데이터베이스에 레일스가 프레임 워크에 있었는지 "또는 mongodb 웹 사이트 의이 게시물 을 살펴 보는 것이 좋습니다 . 흥미를 느끼고 프랑스어 를 사용하는 경우 MongoDB를 처음부터 설정하는 방법을 설명하는 이 기사를 살펴보십시오 .

편집 : 나는 Ryan 의이 railscast 에 대해 당신에게 말하는 것을 거의 잊었습니다 . 매우 흥미롭고 즉시 시작하고 싶게 만듭니다!


이 railscast는 정말 흥미로워 보입니다. 이것을 살펴보면 이것이 어떻게 작동하는지 더 잘 이해하게 될 것입니다.
Guillaume Flandre

5

스키마 프리의 장점은 부하가 무엇이든 덤프 할 수 있으며 아무도 그것에 대해 불평하거나 잘못되었다고 말할 근거가 없다는 것입니다.

그것은 또한 당신이 그 안에 버리는 것이 무엇이든 당신이 그렇게 한 후에도 의미가 전혀 없다는 것을 의미합니다.

일부는 심각한 단점이라고 표시하고 일부는 그렇지 않습니다.

관계형 데이터베이스가 잘 확립 된 스키마를 가지고 있다는 사실은 잘 확립 된 확장 술어 세트가 있다는 사실의 결과입니다. 이를 위해 필요한 전제 조건이기도합니다.

잘 확립 된 스키마, 확장 술어 및 확장 정밀도 없이는 사용자가 그 안에 채워진 것에서 의미를 만들 수 없습니다.


1
이것은 정말 반답입니다. 대부분의 사람들이 이해하는 것처럼 대부분의 의미는 단순한 관계 개념 이상에서 발생합니다. 실제로 대부분의 응용 프로그램 개발자는 문서 저장소보다 고도로 정규화 된 스키마에서 의미를 식별하기가 더 어렵습니다.
user1020853

1
논리가 가지고 있듯이 의미는 명제에서 파생됩니다. 제안은 자유 공간이 실제 데이터 항목으로 대체되는 경우 자유 공간이있는 술어에서 발생할 수 있습니다. 그러나 이러한 데이터 항목은 구조에서 가져와야합니다. 그리고 구조가 있으면 스키마가 있습니다. 그러므로 도식이 없다면, 손가락을 공중에 띄워서 구성하는 것 외에는 의미를 부여하는 명제를 구축하는 데 기여할 수있는 구조가 없습니다. 그것은 반 (反) 무엇이든 또는 프로 (pro-anything)가 아니라 단순하고 명백한 사실입니다.
Erwin Smout

3
그것은 의미에 대한 하나의 관점 일 뿐이며 매우 좁은 지적 맥락에만 부합합니다 (논리적 관점이 아니라 철학적 관점입니다). 귀하의 대답은 기본적으로 "관계형 데이터베이스와 같은 스키마가 없다면 의미가 없습니다."라고 말합니다. 이것은 "이점은 무엇인가?"라는 원래 질문에 대한 답이 아닙니다. 따라서 나는 그것을 반답이라고 부릅니다. 우리가 "의미"를 당신이 오는이 좁은 맥락으로 제한하지 않는 한 그것은 사실이 아닙니다. "잘 확립 된 스키마"없이 "의미"할 여지가 많이 있습니다.
user1020853

1
그렇다면 "의미"에 대한 "더 넓은"관점이 어떤 것인지, 논리의 술어 나 명제없이 어떻게 존재할 수 있는지 보여 주실 수 있습니다. 내 의견에는 "관계"라는 단어가 한 번 언급되지 않았습니다. 사전 관계형 데이터 기술에는 스키마가 있으므로 "의미"를 추론하는 데 적합했습니다. 데이터베이스 이전 기술에는 스키마가 있으므로 "의미"를 추론하는 데 적합했습니다. 스키마없는 스키마에는 스키마가 없으므로 ( "자유"부분이 명백한 거짓말이 아닌 경우) "의미"를 추론하는 데 적합하지 않습니다. ...
Erwin Smout

1
... 스키마없는 사용자는 추측 게임을하게됩니다. 그리고 그러한 사용자가 90 % 또는 99 %의 시간 동안 올바르게 작동 할 수 있다고해도 여전히 추측 게임입니다.
Erwin Smout


3

내 프로젝트에서 두 데이터베이스를 모두 사용한 후 Postgres와 Mongo에 대한 나의 경험.

Postgres (RDBMS)

Postgres는 향후 애플리케이션에 많은 조인이 필요한 복잡한 스키마가 있거나 모든 데이터에 관계가 있거나 많은 쓰기 작업이있는 경우 권장됩니다. Postgres는 오픈 소스이고 더 빠르며 ACID를 준수하며 디스크에서 메모리를 적게 사용하며 JSON 스토리지에 대해 모두 우수한 성능을 제공하며 3 단계의 트랜잭션 격리를 통해 트랜잭션의 완전한 직렬 성을 포함합니다.

Postgres에 머무르는 것의 가장 큰 장점은 두 가지 장점을 모두 갖추고 있다는 것입니다. 제약, 일관성 및 속도로 데이터를 JSONB에 저장할 수 있습니다. 반면에 다른 유형의 데이터에 대해 모든 SQL 기능을 사용할 수 있습니다. 기본 엔진은 매우 안정적이며 다양한 데이터 볼륨에 잘 대처합니다. 또한 선택한 하드웨어 및 운영 체제에서 실행됩니다. 전체 트랜잭션 지원과 함께 NoSQL 기능을 제공하는 Postgres는 필드 데이터에 대한 제약 조건이있는 JSON 문서를 저장합니다.

Postgres에 대한 일반 제약

Postgres를 수평으로 확장하는 것은 훨씬 어렵지만 가능합니다.

Postgres로는 빠른 읽기 작업을 완전히 수행 할 수 없습니다.

SQL 데이터베이스 없음

Mongo DB (Wired Tiger)

MongoDB는 "수평 적 규모"측면에서 Postgres를 능가 할 수 있습니다. JSON 저장은 Mongo가 최적화 된 작업입니다. Mongo는 데이터를 BSONb라는 바이너리 형식으로 저장하는데, 이는 (대략) JSON 상위 집합의 바이너리 표현입니다. MongoDB는 설계된 그대로 객체를 저장합니다. MongoDB에 따르면 쓰기 집약적 인 애플리케이션을 위해 Mongo는 새로운 엔진 (Wired Tiger)이 사용자에게 쓰기 성능을 최대 10 배 향상시키고 (이것을 시도해야 함) 스토리지 사용률을 80 % 감소시켜 스토리지 비용을 절감 할 수 있다고 말합니다. , 하드웨어 활용도를 높이십시오.

MongoDb의 일반 제약

스키마가 적은 스토리지 엔진을 사용하면 암시 적 스키마 문제가 발생합니다. 이러한 스키마는 스토리지 엔진에 의해 정의되지 않고 대신 애플리케이션 동작 및 기대치를 기반으로 정의됩니다.

독립형 NoSQL 기술은 비정형 애플리케이션의 높은 처리량 성능을 위해 중요한 데이터 보호를 희생하기 때문에 ACID 표준을 충족하지 못합니다. NoSQL 데이터베이스에 ACID를 적용하는 것은 어렵지 않지만 데이터베이스를 어느 정도까지 느리고 유연하지 않게 만듭니다. "대부분의 NoSQL 제한 사항은 이전 제한 사항을 크게 극복 한 최신 버전 및 릴리스에서 최적화되었습니다."


2

트레이드 오프에 관한 모든 것입니다. MongoDB는 빠르지 만 ACID는 아니며 트랜잭션이 없습니다. 일부 사용 사례에서는 MySQL보다 낫고 다른 사례에서는 더 나쁩니다.


지금이 의견을 검토하십시오. MongoDb 4.0은 이제 산성 트랜잭션을 지원합니다.
아난 트 심란 싱

1

MongoDB에 작성된 벨로우 라인 : 최종 가이드.

몇 가지 좋은 이유가 있습니다.

  1. 같은 컬렉션에 여러 종류의 문서를 보관하는 것은 개발자와 관리자에게 악몽이 될 수 있습니다. 개발자는 각 쿼리가 특정 종류의 문서 만 반환하는지 또는 쿼리를 수행하는 응용 프로그램 코드가 다른 모양의 문서를 처리 할 수 ​​있는지 확인해야합니다. 블로그 게시물을 쿼리하는 경우 작성자 데이터가 포함 된 문서를 걸러내는 것이 번거 롭습니다.
  2. 컬렉션의 유형 목록을 추출하는 것보다 컬렉션 목록을 얻는 것이 훨씬 빠릅니다. 예를 들어 컬렉션에 각 문서가 "skim", "whole"또는 "chunky monkey"문서인지 여부를 나타내는 유형 키가있는 경우 단일 컬렉션에서 이러한 세 가지 값을 찾는 것보다 훨씬 느립니다. 세 가지 별도의 컬렉션과 이름에 대한 쿼리가 있습니다.
  3. 같은 종류의 문서를 같은 컬렉션으로 그룹화하면 데이터 지역성이 가능합니다. 게시물 만 포함 된 컬렉션에서 여러 블로그 게시물을 가져 오는 것은 게시물과 작성자 데이터를 포함하는 컬렉션에서 동일한 게시물을 가져 오는 것보다 디스크 검색이 더 적게 필요할 수 있습니다.
  4. 인덱스를 만들 때 문서에 일부 구조를 적용하기 시작합니다. (특히 고유 인덱스의 경우에 그렇습니다.) 이러한 인덱스는 컬렉션별로 정의됩니다. 단일 유형의 문서 만 동일한 컬렉션에 넣으면 컬렉션을보다 효율적으로 인덱싱 할 수 있습니다.

0

텍스트 스토리지가있는 데이터베이스에 대한 질문 후) MongoDB 및 유사한 시스템을 살펴 보았습니다.
내가 올바르게 이해했다면 사용 및 설정이 더 쉽고 훨씬 빠릅니다. SQL이 없기 때문에 SQL 삽입이 방지되므로 더 안전 할 수도 있습니다
. MongoDB는 대부분 웹 애플리케이션에 사용됩니다.
기본적으로, 그들은 이러한 데이터베이스가 복잡한 쿼리, 데이터 마이닝 등에 적합하지 않다고 말합니다. 그러나 그들은 많은 플랫 데이터를 빠르게 검색하는 데 빛을 발합니다.


1
답변에 몇 가지 오해가 있습니다. MongoDB는 SQL 주입에 취약하지 않지만 일반적으로 주입에 취약합니다. 쿼리의 $ where 절에 임의의 Javascript를 지정할 수 있습니다. 또한 다른 많은 NoSQL 옵션과 달리 MongoDB는 실제로 꽤 복잡한 쿼리를 수행 할 수 있습니다.
Emily

정확성에 감사드립니다. 앞서 언급했듯이 관계형 쿼리에 대한 제한을 내 보낸 것은 MongoDB 사이트 자체입니다. 다른 I 오해 뭔가하지 않는 한 ...
PhiLho

MongoDB가 복잡한 관계형 쿼리에 적합하지 않다고 말했을 가능성이 높지만 복잡한 비 관계형 쿼리에는 매우 적합합니다. 한 번 봐 가지고 mongodb.org/display/DOCS/Advanced+Queries 당신이 할 수있는 멋진 물건의 일부를.
Emily

0
  1. MongoDB는 필드 별 검색, 정규식 검색을 지원하며 사용자 정의 자바 스크립트 함수를 포함합니다.
  2. MongoDB는 파일 저장을 위해 여러 머신에서로드 밸런싱 및 데이터 복제 기능을 활용하여 파일 시스템으로 사용할 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.