0

テーブルに 1:n の関係があります。

テーブル A id、名前、foo、bar

テーブル B id、x、y、z、id_A

私のドメイン モデルでは、テーブル A の各行がオブジェクトであり、B のコレクションが含まれています。

これを解析するにはどうすればよいですか?

最初に A に対してクエリを実行し、次に解析ループで各行に対して B に対してクエリを実行できます。しかし、これはあまり効率的ではないようです。

結合クエリも試しましたが、これにより B のエントリごとに新しい行が追加され、これらの各行を 1 つのモデル オブジェクトにマップできません。

結合の余分な行を1つの集計結果に「減らす」ことができるクエリはありますか?

リレーショナル データベースの標準的なケースのように見えますが、それに関する情報が見つかりません。

ありがとう。

4

1 に答える 1

1

SQLite などの組み込みデータベースでは、クライアント/サーバー通信のオーバーヘッドがないため、実際には次のような小さなクエリを多数実行できます。

SELECT id, x, y, z FROM TableB WHERE id_A = ?

すべての B サブオブジェクトの読み込みに 1 つのクエリを使用したい場合は、次のように2 つの個別のクエリを使用できます。

SELECT id,   name, foo, bar FROM TableA ORDER BY id;
SELECT id_A, id, x, y, z    FROM TableB ORDER BY id_A;

次に、2 つのカーソルを並行してステップ実行し、各 A レコードについて、同じ ID を持つすべての B レコードを収集します。ORDER BY 句により、それらが正しい順序で表示されることが保証されます。

cursorA = db.query(...);
cursorB = db.query(...);
cursorB.moveToFirst();
while (cursorA.moveToNext()) {
    id = cursor.getInt(0);
    a = new ObjectA(id, ...);
    while (!cursorB.isAfterLast() &&
           cursorB.getInt(0) == id) {
        b = new ObjectB(...);
        a.addB(b);
        cursorB.moveToNext();
    }
}

これは、各 A に対して個別のクエリを実行するよりもはるかに効率的ではないことに注意してください。id_A列のすべてのレコードを並べ替えるのは、同じ列で多くのルックアップを実行するよりも効率的ではないためです。(ただし、その列にインデックスがないと、検索は並べ替えよりもはるかに遅くなります。)

于 2013-11-03T20:19:32.480 に答える