我正在编写一个支持 SQLite 3 的小型 Android 应用程序。ATM 我正在实现一些 DB-Functions 并问自己是否最好有一个大的连接查询,或者是否可以使用多个查询来提高应用程序的性能。
假设我有 3 个表“drivers”、“driven_runs”、“race_disciplines”。每个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
我会创建一个大的连接查询,比如
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 对象。
这个解决方案需要更多的编写,但只执行一个查询(或者数据库在连接 3 个表时也执行 3 个查询?)
长话短说,是否可以使用解决方案 1,因为在性能方面没有太大区别?