NoSQLと他のSQL Drupalセットアップ


14

DrupalでMySQL、PostGRE SQL、MSSQLよりもNoSQL(MongoDBなど)を実行する利点は何ですか?ストレージを使用するだけで得られる利点はありますか、それともDrupalの構成を変更する必要がありますか?


これは、カロリー・ネギエシが「権威ある」答えを出す質問です。彼は、MongoDBをDrupalで使用する利点を確実に知っています。
キアムルノ

私の心を読んでください。実質的な利点があれば、他のオプションにも非常に興味があり、もちろん長所には短所があります。
ケビン

回答:


13

MongoDBを使用して、ほとんどまたはすべてのエンティティを高速のドキュメント指向ストレージに保存できます。このタイプのストレージは、Drupalコアにある標準のSQLベースのストレージ(「フィールドごとに1つのテーブル」スキーマに基づいています)よりもはるかに優れています。

Drupal 7の現在の状態では、次のものがあります。

  • SQLに保存されているエンティティのベーステーブル(ユーザーテーブル、ノードテーブルなど)
  • SQLに保存されているすべてのフィールド
  • MongoDBで複製されたベーステーブルのエンティティのプロパティ

これにより、MongoDBのエンティティに対する高速クエリが可能になり、オープンソースSQLデータベースがサポートしない複雑なインデックス(テーブル間のインデックスを含む)を追加できます。同時に、エンティティのベーステーブルはまだSQLに格納されているため、SQLのみのモジュール(Flagなど)で結合できるため、相互運用性を失うことはありません。

このタイプの高速クエリは、EntityFieldQueryメカニズムのおかげで利用できます。これは、エンティティ、プロパティ、およびフィールドに対するクエリを抽象的な方法で構築する方法です。コアのデフォルト実装はこれらのクエリをSQLに変換しますが、MongoDBモジュールには、MongoDBからのクエリを直接満たすことができるフル機能の実装があります。

ViewsEntityFieldQueryバックエンドのおかげで、使い慣れたツールを使用することで、この機能を簡単に活用できます。唯一の欠点は、リレーションシップがサポートされていないことです(ただし、実際には、それらを必要とすることはめったにありません。これは、エンティティオブジェクトに追加データをプッシュし、エンティティの追加プロパティとして公開することで回避できます)。

一言で言えば、クエリのパフォーマンスがプロジェクトで問題になると、それは重要なデータセット(たとえば、特定のエンティティタイプの数万のエンティティから始まる)が発生するとすぐに発生し、MongoDBは純益です非常に少数の欠点のため。強くお勧めします。


Damien Tournoud:わずか1万分の1のエントリでパフォーマンスの問題が発生する場合は、潜在的な問題がある可能性があります(DBMS構成、不十分な記述のクエリ、それは何でもかまいません)。基礎となるSQLスキーマが十分であれば、1つのテーブルに100万個のエントリがあることを心配する必要はありません(ただし、おそらくリビジョンと複数値フィールドを考慮すると、フィールドは急速に成長する可能性があります)。
ピエール

正確に言うと、スキーマが正規化されているため、クエリパフォーマンスが非常に低くなります。クエリのパフォーマンスを改善するには、スキーマを非正規化する必要があります。このケースでMongoDBを使用する主な利点は、それが何らかの「自動非正規化エンジン」であることです。
ダミアントゥルヌード

そしてもちろん、MongoDBはドキュメント指向のデータベースであるため、ここで素晴らしいです。エンティティのような複雑なドキュメントをSQLストレージに保存するのは、単なる愚かです。これはデフォルトの実装ですが、使用する必要があるという意味ではありません:)
ダミアントゥルヌード

@Pierre:Damienは、数万のエンティティについて話しました。これは、テーブルの行とはまったく異なるものです。たとえば、そのエンティティに10個以上のフィールドがあり、そのようなエンティティがロードされるたびに個別のクエリでクエリする必要がある10個の追加テーブルがあります。また、MongoDBは、エンティティベーステーブルではなく、これらの追加テーブルを置き換えることができます。
ベルディール

2
どのモジュールも、フィールドがMySQLにあることを期待するべきではありません。Drupal 7でフィールドを照会する唯一の方法は、EntityFieldQueryです。フィールドテーブルを直接照会している場合は、モジュールのバグを開きます。現時点では、これらのモジュールは知りません。
ダミアントゥルヌード

7

MongoDBなどは、比較的柔軟な方法で構造化(階層)データを格納するように設計されています。

たとえばDrupal 7、を使用する場合field_sql_storage、すべてのフィールドは独自のテーブルを取得します。コンテンツタイプに10個のフィールドを添付すると、データベースに10個のテーブルが作成されます。そのノードをロードfield_sql_storageすると、フィールドごとおよびノー​​ドごとにクエリを実行します(使用する場合は複数のノードnode_load_multiple)。

mongodb_field_storageを使用すると、ノードのすべてのフィールドを単一のドキュメントに保存し、単一のクエリで取得できます。

ウォッチドッグ、セッション、キャッシュ、ブロックなど、MongoDBに保存することもできます。

ただし、MySQLは引き続き必要ですが、MongoDBはそれを置き換えません(特定の部分のみ)。

もう1つの利点は、MongoDBを使用すると簡単に拡張できることです。クラスターに多くのサーバーを追加して、それらの間でデータを共有できます。


こんにちは、Berdir!パフォーマンスをテストするために既存のプロジェクトにMongoDBをドロップした場合、結果なしでモジュールを有効化および無効化できますか?mongoを試してみたいのですが、うまくいかない場合はどうすればいいですか?試しても安全ですか?(私はあなたがそれを保証できないことを知っているが、私はほとんどの場合に何が起こるか疑問に思う)
ベトAveiga

1
まず、ドロップインすることはできません。各フィールドは、使用するストレージバックエンドを構成します。フィールドを変更/再作成し、ビューを再作成する必要があります(efq_viewsバックエンドを使用する必要があるため) )、フィールドデータテーブルに対して直接クエリを記述した場合は、おそらく独自のクエリです。最初の比較のために、新しいインストールで同じ構造を簡単に再作成できる場合があります。
ベルディール

ありがとうBerdir!数日前にMongoDBを試してみましたが、パフォーマンスに目立った向上はありませんでしたが、あなたが今私に言っていることや変更を認識していませんでした。「MongoDBはより大きなサイトで違いを生むはずだ」と考えました。MongoDBを再試行します。
ベトアヴェイガ

5

長所には短所があります。

Drupal全体をMongoDbに切り替えることはできないため、2つのデータベースをサポートし、それらが連携して正常に動作することを確認する必要があります。

多くのモジュールはmongodbと連携できないため、相互運用性が失われます。

差し迫った必要がない限り(システムの一部がリクエストの数やデータの量に対応していないなど)、私は切り替えません。そして、限界に近づき始めたときでも、問題にハードウェアを投げたり、切り替える前にチューニングしたりすることを検討してください。

私は以前にこれに答えたと思っていました、SOにはほとんど重複しています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.