当从多个表中提取数据并映射到 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 到 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 上发现的唯一匹配问题处理的情况略有不同,但在其答案中提倡两种有些相似的解决方案:Select from multiple tables - One to Many relation
数据库:MariaDB
最佳答案
评论太长了。
但是,您应该以应用程序中需要的格式提取数据。如果您想要 Java 中的 As、B 和 C 三个不同的对象,则拉取数据三次。如果您想要一个组合表中属性的单个对象,请使用带有 JOIN
的单个查询。
您的描述表明您需要单独的对象,因此请使用单独的查询。您确实需要在 SQL 中这样做,因为一个查询只能返回一组列。
在这种情况下,第一种方法有缺点。一是每行的大小——每行包含 B 和 C 的列。即使值为 NULL
,它也会占用空间。
一个更大的缺点是结果的倍增。如果对于 A 中的给定行,B 中有 10 个匹配项,C 有 20 个匹配项,那么您的查询将返回该值的 200 行。然后,您将必须在应用程序端进行大量重复数据删除。
运行多个查询有一个小缺点——运行和编译查询以及返回多个数据集的开销。我不会担心这一点,因为三个单独的查询更适合您想要完成的任务。
关于mysql - 查询任意相关表时的 JOIN 与 SELECT IN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59730141/