如果我有一个深层嵌套表(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 是我目前使用的
上面的方法有很多循环和很多查询。我觉得这不是要走的路,因为我经常在循环的每次迭代中从数据库发送和接收数据。
方法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
现在我如何浏览光标以剖析连接并将各自的数据放入正确的对象?
答案 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。