2016-09-09 6 views
1

bookshelf.jsの関連モデルのクエリを結合するにはどうすればよいですか?Bookshelf.js/Knex.jsが単一のクエリでネストされています

ORMは、結合したいデータベースに対して2つの別々のクエリを実行します。 knex.jsデバッガが実行二つの別々のクエリを示し除き、

Model 
    .where({ someField: 'someValue' }) 
    .fetch({ withRelated: [{ 
    otherModel: q => q.where({ 
     someOtherField: 'someOtherValue' 
    }) 
    }] }); 

これは動作します:bookshelf.js

Model.find({ 
    where: { 
    someField: 'someValue' 
    }, 
    include: [{ 
    model: OtherModel, 
    as: 'otherModel', 
    where: { 
     someOtherField: 'someOtherValue' <--- part of the same query 
    } 
    }] 
}) 

私の現在の設定(ModelOtherModel間の関係が設定されている):それはこのようなことができましたsequelizeから来ますデータベースに対してブックシェルフは、1つのクエリで結合するSQLを構築するのに十分なほどスマートになると思います。

これは構成やその他の手段で回避できるものですか?

答えて

1

これは私の周りを包み込むのに長い時間がかかりましたが、複数のクエリの動作は設計によるものです。 Bookshelfは、ジョイン以上の複数の結合されていないラウンドトリップを優先しますが、N + 1は行いません。 1つのテーブルにつき1回クエリを実行します。問合せを分割することで、ノードの非同期性のために単一の表に複数の結合がある場合には、いくつかを並列に実行することができます。深くネストされた関係には意味をなさないが、多くの第1世代の関係を持つデータモデルには当てはまりません。私はトランザクションや行のロックがあるかどうかは決して確認していません。

Knex(http://knexjs.org/#Builder-join)を使用して結合を強制してブックシェルフコードに混在させることができますが、ほとんどの時間に敏感で最適化されたアプリケーションを除いて、DBに対する待ち時間が貧弱でない限り。

実際に複雑なクエリを実行していて、パフォーマンスにはジョインが必要な場合は、本棚の代わりにknexまたはknex.rawを使用することをおすすめします。

+0

興味深い。この動作を説明するドキュメントへのリンクはありますか?私はそれが非常に奇妙であり、Sequelizeに移ったことがわかりました。 –

関連する問題