web-dev-qa-db-ja.com

リレーショナルデータベースはNode.jsに適していませんか?

最近、Node.jsで少し遊んでいます。私の特定のケースでは、MongoDBを使用することにしました。これは、プロジェクトが非常に単純であり、Mongooseを使用して開始するのが非常に簡単な方法であるため、プロジェクトにとって意味があったからです。

Node.jsを使用する場合、リレーショナルデータベースに対してある程度の反感があるように思えます。 Node.jsエコシステム内の非リレーショナルデータベースと比較して、サポートが不十分なようですが、これについての簡潔な理由を見つけることはできないようです。

だから、私の質問は、リレーショナルデータベースが、MongoDBなどの代替よりもNode.jsでの作業に適していない確かな技術的理由はありますか?

編集:いくつかのことを明確にしたいだけです:

  • 具体的には、作成中の特定のアプリケーションに関する詳細を探していません
  • また、非技術的な理由も探していません(たとえば、「NodeとMongoDBは両方とも新しいので、開発者が一緒に使用する」などの回答を求めているわけではありません)

私が探しているのは、完全に技術的な理由だけです。たとえば、Node.jsで使用したときにリレーショナルデータベースのパフォーマンスが異常に低下するという技術的な理由がある場合、それは私が探している種類のものです(これまでのところ、答えからは、ケース)

57
Matthew Daly

いいえ、技術的な理由はありません。それはほとんど意見であり、Node.jsでNoSQLを使用することは現在人気のある選択です。

確かに、Nodeのエコシステムは 大部分はコミュニティ主導 です。 Nodeの core API を超えるものはすべて、コミュニティの関与が必要です。そして、確かに、人々は自分の好みに合ったものをサポートする可能性が高くなります。

ただし、Node.jsでリレーショナルデータベースを使用およびサポートしている人はまだ多くいます。いくつかの注目すべきプロジェクトが含まれます:

31

Node.jsは大好きですが、Node=を使用すると、非リレーショナルDBではなく、実際にRDBMを使用するより理にかなっています)。 Node.jsコードで手動結合を行う必要があることが多く、時にはトランザクション/コミット/ロールバック機能を備えたRDBMの技術的機能で作業する必要があるnoSQL /非リレーショナルソリューション。リレーショナルDB + Node.jsサーバー:

(a)NodeはC/C++ではないため、結合は遅くなり、応答は遅くなります。

(b)高価な結合は、イベントループをブロックします。これは、結合がデータベースサーバーではなくNode.jsコードで行われているためです。

(c)多くの場合、結合を手動で記述するのは難しく、エラーが発生しやすくなります。 noSQLクエリが簡単に間違っていたり、結合コードが間違っていたり、最適でないことがあります。最適化された結合は、以前RDBMのマスターによって行われ、RDBMの結合は、ほとんどの場合数学的に正しいことが証明されています。

(d)MongoDBなどの一部の非リレーショナルデータベースは、トランザクションをサポートしません-私のチームの場合、複数のクエリを実行できるように外部分散ロックを使用する必要がありますアトミックトランザクションにグループ化されます。トランザクションのみを使用し、アプリケーションレベルのロックを回避できれば、いくらか簡単になります。

node.jsコードではなく、データベースサーバー上のC/C++で最適化された結合を実行できる、より強力なリレーショナルデータベースシステムを使用すると、Node.jsサーバーで最適な処理を実行できます。

そうは言っても、多くの主要なnoSQLベンダーが結合をサポートしていないのはかなり馬鹿げていると思います(?)完全な非正規化は、私が見る限りでは夢です。そして、トランザクションの欠如は少し奇妙になります。トランザクションがなければ、1つのクエリのみがアトミックであり、アプリケーションレベルのロックメカニズムなしで複数のクエリをアトミックにすることはできません:/

お持ち帰り:

非リレーショナル永続性が必要な場合-リレーショナルデータベースを単純に非正規化してみませんか?従来のデータベースをリレーショナルな方法で使用することを強制する人はいません。

Node.jsでリレーショナルDBを使用する場合、このORMをお勧めします。 https://github.com/typeorm/typeorm

余談ですが、「noSQL」ではなく「非リレーショナル」という用語を好みます。

23
Alexander Mills

私の経験では、ノードはステートレスAPIを備えたデータベースで人気があり、これはノードの非同期性に非常にうまく適合します。ほとんどのリレーショナルデータベースは、トランザクションにステートフル接続を使用します。これにより、非同期非ブロックI/Oの主な利点が最小限に抑えられます。

12
Alex Savenok

選択したデータベースとnode.jsで直面している特定の問題を正確に説明できますか?

MongoDBがリレーショナルデータベースよりも人気がある理由:

  • MongoDBは本質的にJSONオブジェクトストアであるため、javascriptアプリケーションに非常によく変換されます。 MongoDB関数はjavascript関数です。

  • 私はここで推測しているだけですが、NoSQLデータベースはより新しく、より熱心なプログラマーが実験しているので、おそらくあなたはそれらのNPMモジュールにもっと関与しているでしょう。

これとは別に、Node.jsは、技術的には、あらゆる種類のデータベースアプリケーションに最適です。私は個人的に小さなNode.js/MySQLアプリケーションに取り組んできましたが、ハードルはありませんでした。

しかし、私の要点に戻って、私たちはこれについて一日中話し合うことができました。それはこのフォーラムの目的ではありません。 Node.jsと選択したデータベースのコードに特定の問題がある場合は、代わりにそれらの質問をしてください。

編集:両側のJSON互換性を除いて、厳密に技術的な理由:ありません。

10
Munim