我是否加入,循环查询或其他东西以从SQLiteDatabase检索嵌套表?

时间:2016-07-05 09:17:47

标签: android sqlite android-sqlite

如果我有一个深层嵌套表(5层)关系,那么检索相关数据的好方法是什么,以便我可以将它们存储在我的Java对象中?

这是表格的样子:

 ___________   ___________   ___________   ___________   ___________
|  Table A  | |  Table B  | |  Table C  | |  Table D  | |  Table E  |
|___________| |___________| |___________| |___________| |___________|
| tableA_id | | tableB_id | | tableC_id | | tableD_id | | tableE_id |
| some_data | | some_data | | some_data | | some_data | | some_data |
|___________| | tableA_id | | tableB_id | | tableC_id | | tableD_id |
              |___________| |___________| |___________| |___________|

方法1 是我目前使用的

  1. 从基表中检索行的查询。我将其存储在 ObjectA
  2. 从第二个表中检索与上一个查询的id匹配的所有行的查询。我将它们存储在List< ObjectB >中在ObjectA内部。
  3. 对于每个ObjectB,一个查询以检索与ObjectB的id匹配的第三个表的所有行。我将这些存储在List< ObjectC >中在ObjectB内。
  4. 对于每个ObjectC,一个查询以检索与ObjectC的id匹配的第四个表的所有行。我将这些存储在ObjectC中的List< ObjectD >中。
  5. 对于每个ObjectD,一个查询以检索与ObjectD的id匹配的第五个表的所有行。我将这些存储在ObjectD中的List< ObjectE >中。
  6. 以上所有查询都位于“db.beginTransaction”和“db.endTransaction”语句中,因此如果一个查询失败(错误),则不会创建ObjectA。
  7. 上面的方法有很多循环和很多查询。我觉得这不是要走的路,因为我经常在循环的每次迭代中从数据库发送和接收数据。

    方法2

    我想到的另一种方法是将5个表连接在一起。这导致只有一个查询但循环仍然存在,因为我需要对每个层的外部id进行分组和循环。至少这样,我预先获得了所有信息。但是,一旦我将这些数据整合在一起,我就不知道如何将数据分析到各自的对象中。这是我的加入的样子:

    SELECT * FROM (((tableA
    JOIN tableB ON tableA._id = tableB.tableA_id)
    JOIN tableC ON tableB._id = tableC.tableB_id)
    JOIN tableD ON tableC._id = tableD.tableC_id)
    JOIN tableE ON tableD._id = tableE.tableD_id
    

    现在我如何浏览光标以剖析连接并将各自的数据放入正确的对象?

1 个答案:

答案 0 :(得分:0)

经过一番思考后,解决方案有两个方面:

将服务质量决策传递给用户:

为避免遇到持续性能问题,请为用户提供从服务器“签出”objectA的功能。然后,用户可以在离线时查看/修改objectA。显然,前期性能成本是巨大的,但由于它不是默认行为,因此不是一个问题。

避免N + 1选择问题并避免通过网络传输不必要的数据:

每个嵌套表都将存储根表引用键,如下所示:

 ___________   ___________   ___________   ___________   ___________
|  Table A  | |  Table B  | |  Table C  | |  Table D  | |  Table E  |
|___________| |___________| |___________| |___________| |___________|
| tableA_id | | tableB_id | | tableC_id | | tableD_id | | tableE_id |
| some_data | | some_data | | some_data | | some_data | | some_data |
|           | | tableA_id | | tableB_id | | tableC_id | | tableD_id |
|___________| | tableA_id | | tableA_id | | tableA_id | | tableA_id |
              |___________| |___________| |___________| |___________|

当需要检出ObjectA的数据时,会按照与此相反的顺序进行查询:

1. SELECT * FROM tableE WHERE tableA_id=?
2. Store the result in MAP<long, List>
3. Each unique entry of TablD_id are stored in a list, mapped by the unique id.

对每个表重复上述过程,最后一个是tableB。在这种情况下,总共有5个查询而不是N + 1。

然后,应用程序将遍历MAP以完整地恢复objectA。