私は SQLite 3 をサポートする小さな Android アプリを書いています。ATM 私はいくつかの DB 関数を実装しており、アプリケーションのパフォーマンスに関して、1 つの大きな結合クエリを使用する方がよいのか、それとも複数のクエリを使用してもよいのかを自問しています。
「drivers」、「driven_runs」、「race_disciplines」の 3 つのテーブルがあるとします。すべての Driven_run には、ドライバーと race_discipline があります。特定の分野の特定のドライバーによるすべてのレース分野を取得したいとします。
解決策 1
Driver-Object を返す関数 getDriver(driverID) と、Race Discipline を返す関数 getRaceDiscipline(disciplineID) を既にコーディングしています。だから私はちょうど関数を作成します
public ArrayList<DrivenRun> getDrivenRunsOnDiscipline(short driverID, short disciplineID) {
ArrayList<DrivenRun> drivenRuns = new ArrayList<DrivenRun>();
String sql = "SELECT * FROM " + DBHelper.TABLE_DRIVEN_RUNS + " WHERE "
+ DBHelper.DRIVEN_RUNS_COLUMN_DRIVER_ID + "=" + driverID + " AND "
+ DBHelper.DRIVEN_RUNS_COLUMN_RACE_DISCIPLINE_ID + "=" + disciplineID + ";";
Cursor result = rawQuery(sql);
if (result.moveToFirst()) {
do {
Driver driver = getDriver(driverID);
RaceDiscipline discipline = getRaceDiscipline(disciplineID);
DrivenRun run = new DrivenRun();
run.setDriver(driver);
run.setDiscipline(discipline);
run.setResult("WHATEVER");
drivenRuns.add(run);
} while(result.moveToNext());
}
return drivenRuns;
}
この場合、3 つのクエリが次々に実行されますが、コーディングははるかに単純です。
解決策 2
次のような1つの大きな結合クエリを作成します
String sql = "SELECT * FROM driven_runs CROSS JOIN drivers CROSS_JOIN race_disciplines WHERE driven_runs.driver_id=drivers.id AND driven_runs.race_discipline_id=race_disciplines.id"
Cursor result = rawQuery(sql);
Driver と DrivenRun オブジェクトを手動で作成します。
このソリューションにはさらに多くの書き込みが必要ですが、実行されるクエリは 1 つだけです (または、DB は 3 つのテーブルを結合するときに 3 つのクエリも実行しますか?)
簡単に言えば、パフォーマンスに関してはあまり違いがないので、ソリューション 1 を使用しても問題ありませんか?