1

http://martinfowler.com/articles/dblogic.html

上記の記事の用語を使用すると、コーディングのトランザクション スクリプト パターンは、SQL データベースを扱う際のアンチパターンであることは明らかです。

NoSQL データベース (MongoDB など) にも同じことが当てはまりますか? nosql クエリが使用する列がすべて適切にインデックス付けされていると仮定します。

この質問をする理由は、MongoDB でクエリを実行すると、反復可能なカーソルが返されるからです。私が知らないのは、それに関連するパフォーマンスのペナルティがあるかどうかです。

4

1 に答える 1

2

この記事では、「トランザクション スクリプト」を次のように説明しています。

[a] プロシージャは、必要な可能性のあるすべてのデータを読み込み、メモリ内で選択と操作を行って、どの [データベース エントリ] が必要かを判断します。

NoSQL データベースはそれぞれ異なるため、「NoSQL」について一般化することはできません。しかし、ほとんどすべてのデータベース システムでは、データベースに対してできる限り多くのことを行うことをお勧めします。

  1. データベースのクエリ構文を使用している限り、少なくとも理論上はインデックスを使用して特定の操作を高速化できますが、結果セットが返されるとすぐにインデックス情報が失われるため、これらの操作のコストが高くなります。
  2. データベースから膨大な結果セットを取得し、それをアプリケーション層でフィルタリングする場合、そのすべてのデータをネットワーク経由で渡す必要があります。ネットワーク インフラストラクチャの機能によっては、これがパフォーマンスのボトルネックになる可能性があります (データベースが別の物理サーバー上にあると仮定すると、通常は実稼働環境にあるはずです)。巨大なデータセットを転送すると、データベースまたはデータベース ドライバーのバッファリング システムも台無しになります。

MongoDB について具体的に尋ねている場合: MongoDB データベースは、SQL データベースほど「スマート」になるように設計されていません。この設計では、SQL データベース自体が解決する多くの問題が、代わりにアプリケーション層で解決されることを前提としています (制約、カスケード削除、結合、トランザクションなど)。クエリ構文も、40 年間の SQL 開発で蓄積されたすべての機能ほど強力ではありません。つまり、多くの場合、アプリケーション層でのフィルタリングを回避できないということです。ただし、クエリ構文で問題を解決できる場合は、通常、そうするようにしてください。

于 2012-12-17T10:41:31.247 に答える