SQL - 分别检索相关记录与一个联接

时间:2018-06-03 10:48:10

标签: sql postgresql rest foreign-keys

我有一个使用REST API的应用程序。其余的api从具有两个表A和B的SQL数据库中获取数据。表B具有表A的外键。

我想要的是来自应用程序:获取某些B,并获得A的所有相关记录;那些B有外国钥匙的人。

目前,我制作了一个API来检索那些特定的B。但它只返回Bs。我打算:

  1. 从应用程序中检索某些B,然后再进行第二次api调用以检索所有相关的As。然后我需要将这些B映射到应用程序中的As。
  2. 从REST的角度来看似乎没问题。但我想知道,只做一次休息api调用会更好,这会取得所有的B,还有那些相关的As?我想这需要在SQL表上做一些INNER JOIN?

    此外,从REST的角度来看,第二个选项似乎不太好。因为B没有像A这样的实体。只有As和Bs。我想明确REST api来获取实体。

    那么在我的案例中哪一个更好的解决方案呢?我正在使用POSTGRESQL作为我的数据库。如果您需要有关案例的更多信息(例如有多少记录等等......请问,我可以考虑一下)

    编辑:

    我的两个选项是:

    1. 有2个SQL查询: SELECT * FROM table_B WHERE id = ?& SELECT * FROM table_A WHERE id IN (id_1, id_2, id_3, ...)这需要2个API调用,其中第一个将启动第一个sql查询,第二个将启动第二个SQL查询

    2. 使用1个SQL查询: select b.*, a.* from b join a on b.? = a.? where b.? in (?, ?, ?, . . .); 这只需要1个API调用,1个SQL查询。但是权衡的是,我需要做sql join +它不像RESTfull那样关于资源。

1 个答案:

答案 0 :(得分:1)

如果您想从" A"和" B"对于某些" B"记录和它们是相关的,那么典型的解决方案是:

select b.*, a.*
from b join
     a
     on b.? = a.?
where b.? in (?, ?, ?, . . .);

问号代表您应该输入不在您问题中的信息的地方。

这将返回来自" A"的信息。和" B"在一排。对于大多数应用来说这很好。只需一次数据库调用即可完成。

在某些有限的情况下,进行多次查询可能会更好。请记住,每个查询都有开销 - 这是为什么让数据库完成工作更好的一个原因。但是,如果" B"真的很宽,你可能不想为" A"。

中的每一条记录复制它们