NoSQL과 다른 SQL Drupal 설정


14

Drupal에서 MySQL, PostGRE SQL 또는 MSSQL에 비해 NoSQL (예 : MongoDB)을 실행하면 어떤 이점이 있습니까? 단순히 스토리지를 사용함으로써 얻을 수있는 이점이 있습니까? 아니면 일부 Drupal 구성을 변경해야합니까?


이것은 Károly Négyesi가 "권한있는"답변을 제공하는 질문입니다. 그는 Drupal과 함께 MongoDB를 사용하는 이점을 확실히 알고 있습니다.
kiamlaluno

내 마음을 읽으십시오. 상당한 혜택이 있다면 물론 다른 옵션에 관심이 있으며 물론 장점도 있습니다.
Kevin

답변:


13

MongoDB를 사용하면 대부분 또는 모든 엔티티를 문서 중심의 빠른 스토리지에 저장할 수 있습니다. 이러한 유형의 스토리지는 Drupal 코어에있는 표준 SQL 기반 스토리지 ( "필드 당 하나의 테이블"스키마를 기반으로 함)보다 훨씬 확장 성이 뛰어납니다.

Drupal 7의 현재 상태는 다음과 같습니다.

  • SQL에 저장된 엔티티의 기본 테이블 (예 : users 테이블, node 테이블 등)
  • SQL에 저장된 모든 필드
  • 기본 테이블의 엔티티 속성이 MongoDB에 복제되었습니다.

이를 통해 MongoDB의 엔티티에 대한 빠른 쿼리와 Opensource SQL 데이터베이스가 지원하지 않는 복잡한 인덱스를 추가 할 수 있습니다 (테이블 간 인덱스 포함). 동시에 엔터티의 기본 테이블은 여전히 ​​SQL에 저장되므로 여전히 SQL 전용 (예 : 플래그) 인 모듈에 의해 조인 될 수 있으므로 상호 운용성을 잃지 않습니다.

이러한 유형의 빠른 쿼리는 엔터티, 해당 속성 및 필드에 대한 추상적 인 방식으로 쿼리를 작성하는 방법 인 EntityFieldQuery 메커니즘 덕분에 사용할 수 있습니다. 코어의 기본 구현은 이러한 쿼리를 SQL로 변환하지만 MongoDB 모듈에는 MongoDB의 해당 쿼리를 직접 충족시킬 수있는 모든 기능을 갖춘 구현이 있습니다.

에 대한 EntityFieldQuery 백엔드 덕분에 익숙한 도구를 사용하여이 기능을 쉽게 활용할 수 있습니다. 유일한 단점은 관계가 지원되지 않는다는 것입니다 (그러나 실제로는 관계가 거의 필요하지 않습니다. 추가 데이터를 엔티티 객체로 푸시하고 엔티티의 추가 속성으로 노출시켜 추가하면 해결할 수 있습니다).

요컨대, 쿼리 성능이 프로젝트에서 문제가되는 즉시 중요한 데이터 세트를 갖 자마자 발생합니다 (예를 들어 주어진 엔티티 유형의 수만 개 엔티티에서 시작한다고 가정 해 봅시다) MongoDB는 순이익입니다 아주 적은 단점. 추천.


Damien Tournoud : 수만 항목만으로 성능 문제가 발생하면 근본적인 문제 (DBMS 구성, 잘못 작성된 쿼리, 기타 문제)가있을 수 있습니다. 기본 SQL 스키마가 충분하면 단일 테이블에서 백만 항목을 입력하기 전에 걱정할 필요가 없습니다 (그러나 개정 및 다중 값 필드를 고려하면 필드가 빠르게 커질 수 있음).
Pierre

내 요점은 정확히 : 우리 스키마는 정규화되어 결과적으로 쿼리 성능이 매우 좋지 않습니다. 쿼리 성능을 향상 시키려면 스키마를 비정규 화해야합니다. 우리의 경우에 MongoDB를 사용하는 주요 이점은 일종의 "자동 비정규 화 엔진"이라는 것입니다.
Damien Tournoud

물론 MongoDB는 문서 지향 데이터베이스이기 때문에 훌륭합니다. SQL 스토리지에 엔티티와 같은 복잡한 문서를 저장하는 것은 단순한 바보입니다. 기본 구현이지만, 반드시 사용해야한다는 의미는 아닙니다. :)
Damien Tournoud

@Pierre : 데미안 몇 십분 만에 대해 이야기 엔티티 테이블 행보다 완전히 다른 일이 될 수 있습니다. 예를 들어, 해당 엔터티에 10 개 이상의 필드가있을 수 있으며 이러한 엔터티가로드 될 때마다 별도의 쿼리로 쿼리해야하는 10 개의 추가 테이블이 있습니다. 그리고 MongoDB는 엔티티 기본 테이블이 아닌 이러한 추가 테이블을 대체 할 수 있습니다.
Berdir

2
필드가 MySQL에있을 것으로 예상하는 모듈은 없습니다. Drupal 7에서 필드를 쿼리하는 유일한 방법은 EntityFieldQuery입니다. 필드 테이블을 직접 쿼리하는 경우 모듈에서 버그를 엽니 다. 현재 해당 모듈을 모릅니다.
Damien Tournoud

7

MongoDB 등은 비교적 유연한 방식으로 구조적 (계층 적) 데이터를 저장하도록 설계되었습니다.

예를 들어에서 Drupal 7를 사용할 때 field_sql_storage모든 필드는 자체 테이블을 가져옵니다. 컨텐츠 유형에 10 개의 필드를 첨부하면 데이터베이스에 10 개의 테이블이 생깁니다. 해당 노드를로드하면 field_sql_storage필드 및 노드 당 (또는를 사용하는 경우 여러 노드) 쿼리를 실행합니다 node_load_multiple.

mongodb_field_storage 를 사용 하면 노드의 모든 필드를 단일 문서에 저장하고 단일 쿼리를 얻을 수 있습니다.

또한 감시, 세션, 캐시, 블록과 같은 다른 것을 MongoDB에 저장할 수 있습니다 .

그러나 여전히 MySQL이 필요하지만 MongoDB 는이를 대체하지 않습니다 (특정 부분 만 해당).

또 다른 장점은 MongoDB 를 사용하여 확장 하는 것이 더 쉽다 는 것입니다. 클러스터에 많은 서버를 추가하여 서버간에 데이터를 공유 할 수 있습니다.


안녕 버디! 성능을 테스트하기 위해 MongoDB를 기존 proyect에 드롭하면 결과없이 모듈을 활성화 및 비활성화 할 수 있습니까? 몽고를 시도하고 싶지만 작동하지 않거나 어떻게됩니까? 시도해도 안전한가요? (나는 당신이 그것을 보장 할 수는 없지만 대부분의 경우에 무슨 일이 일어 났는지 궁금합니다)
Beto Aveiga

1
글쎄, 시작을 위해, 당신은 그것을 떨어 뜨릴 수 없습니다. 각 필드는 사용하는 스토리지 백엔드를 구성했습니다. 필드를 변경 / 재 작성하고, 뷰를 재 작성해야합니다 (efq_views 백엔드를 사용해야함에 따라) ), 필드 데이터 테이블에 대해 직접 쿼리를 작성한 경우 자체 쿼리 일 수 있습니다. 초기 비교를 위해 새 설치에서 동일한 구조를 쉽게 다시 만들 수 있습니다.
Berdir

감사합니다 Berdir! 며칠 전에 MongoDB를 사용해 보았지만 성능이 크게 향상되지 않았지만 지금 당장 알려주는 내용 / 변경 사항을 알지 못했습니다. "MongoDB는 더 큰 사이트에서 차이를 만들어야합니다"라고 생각했습니다. MongoDB를 다시 시도하겠습니다.
Beto Aveiga

5

장점은 단점이 있습니다.

Drupal은 전체적으로 MongoDb로 전환 할 수 없으므로 두 데이터베이스를 지원하고 서로 잘 작동하는지 확인해야합니다.

많은 모듈이 mongodb와 함께 작동 할 수 없으므로 상호 운용성을 잃게됩니다.

시스템의 일부가 요청 수 또는 데이터 양에 대처하지 못하는 등 긴급한 요구가 없다면 전환하지 않을 것입니다. 한계에 다 다르기 시작하더라도 문제가 발생했을 때 하드웨어를 던지거나 전환하기 전에 튜닝하는 것을보십시오.

나는 전에 이것을 대답했다고 생각했는데, SO 에는 거의 중복이있다 .

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