从多个表中提取数据以映射到 GraphQL 结果时,哪个更有效?
伪代码如下。
版本 1 - 将 N 个表连接在一起并将它们解析为调用方的单独对象
alldata = SELECT a.*, b.*, c.*
FROM aaaa a
LEFT OUTER JOIN bbbb b on a.id = b.parent_id
LEFT OUTER JOIN cccc c on b.id = c.parent_id
WHERE a.name = 'my name';
/* Map flat DB rows to Java pojo-s */
aObj = parseRowsIntoJavaObjects(alldata)
版本 2 - 对表 1 逐个执行选择,通过父行 id-s 限制它们
a_rows = SELECT a.* FROM aaaa a WHERE a.name = 'my name';
b_rows = SELECT b.* FROM bbbb b WHERE b.parent_id IN (a_rows.id);
c_rows = SELECT c.* FROM cccc c WHERE c.parent_id IN (b_rows.id);
/* Map flat DB rows to Java pojo-s */
bObj = parseRowsIntoJavaObjects(b_rows, c_rows);
aObj = parseRowsIntoJavaObjects(a_rows, bObj);
这些表使用外键连接,并且可以具有 1:1、1:N 和 N:N 关系。否则它们的结构没有定义——解决方案必须针对任意数据模型。可以根据需要添加索引,并且可以假定存在任何必要的索引来执行查询。
询问是因为可以有任意数量的表以这种方式连接,我担心版本 1是否会导致由于多对一关系起作用而不得不在多行中多次返回相同数据的问题。
我知道如果事情可以用一个来管理并且 IN() 不是特别快,那么进行多个查询通常是一个坏主意。在这里使用 IN 仍然是一个坏主意吗?
由于该解决方案必须是通用的并适用于任意数量的数据模型,因此我不想像大多数处理 JOIN...WHERE IN().. 的问题一样尝试并针对特定模型对其进行优化。我想请教一下从任意层次结构加载关系数据的一般性能更高的方法是什么,直到……说 3 级深?
我在 SO 上发现的唯一一种匹配问题处理了一个略有不同的案例,但在其答案中提倡两种有些相似的解决方案:从多个表中选择 - 一对多关系
数据库:MariaDB