我正在编写一个支持 SQLite 3 的小型 Android 应用程序。 ATM 我正在实现一些 DB-Functions 并问自己是否最好有一个大的连接查询,或者是否可以在应用程序性能方面使用多个查询。
假设我有 3 个表“drivers”、“driven_runs”、“race_disciplines”。每个 driven_run 都有一个 driver 和一个 race_discipline。假设我想获得某个车手在某个纪律中的所有比赛纪律。
解决方案一
我已经编写了一个函数 getDriver(driverID) 和一个返回 Driver-Object 的函数,以及一个函数 getRaceDiscipline(disciplineID) 和一个 Race Discipline 作为返回。所以我只想创建一个函数
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 个查询,但编码要简单得多。
方案二
我会创建一个像这样的大连接查询
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,因为在性能方面没有太大差异?
最佳答案
一般来说,在有良好的性能理由之前,尽量使用更简单的代码。鉴于这无论如何都是 SQLite,我认为性能差异不大,因为查询的开销非常低。
过早的优化是万恶之源。
关于Android SQLite 3,JOINS 还是多个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14294967/