3

最近在构建一个 Web 应用程序时,我开始考虑从我所做的查询返回的信息:

查找用户信息和(为简单起见)与该用户相关联的电话号码。像这样简单的东西:

SELECT a.fname, a.lname, b.phone 
FROM users a 
JOIN users_phones b 
    ON (a.userid = b.userid) 
WHERE a.userid = 12345;

这里没问题(是的,我正在防止注射等,而不是这个问题的重点)。但是,当我考虑返回的数据时,我会返回(可能)几行信息,每行都带有该用户名。假设单个用户有 1000 个与之关联的电话号码。这是每个电话都会返回的名字和姓氏。我们还假设我想要返回的不仅仅是该用户的名字和姓氏,实际上我开始返回相当多的额外行,而我实际上只需要一次。

是否存在对数据库进行多次调用“更合适”的情况?

例如

SELECT firstname, lastname 
FROM users 
WHERE userid = 12345;

SELECT phone 
FROM users_phones 
WHERE userid = 12345;

如果答案是肯定的,是否有一种好的/正确的方法来确定何时使用多个查询而不是单个查询?

4

3 回答 3

3

我认为这真的取决于你的用例。在您给出的示例中,将其作为两个查询返回似乎是有意义的,特别是如果您将该信息传递回移动设备,您希望确保向它们发送尽可能少的数据(不是每个人都有无限的数据.....)

如果这会根据您的表产生影响,我可能也会在这些查询中添加一个 DISTINCT。

于 2013-09-13T15:23:57.547 回答
2

带有 a 的查询JOIN可能比两个独立的查询慢。这实际上取决于您正在执行的访问类型。

对于您的示例,我将使用两种查询方法。这些查询可以并行执行,它们可以被缓存,JOIN除了任意表示问题之外没有其他真正的理由。

您还需要担心返回重复数据。在您的示例中,它看起来像fname并且lname会针对每个电话号码重复,从而导致传输大量实际上没有用的数据。这是因为您描述的一对多关系。

JOIN通常,如果这意味着发送更少的数据,或者因为这两个查询不是独立的,您会想要这样做。

于 2013-09-13T15:25:16.070 回答
0

这应该由应用程序驱动。基本上,您可以在一个查询中检索一个位置所需的所有信息。如果您以这个问题页面为例,您会看到您的用户 ID、信誉计数器和徽章计数器。首次显示问题页面时,无需检索其他用户个人资料信息。

仅当单击用户 ID 时,才能查询到配置文件的其余部分,甚至可能不是全部,因为配置文件页面上有多个选项卡。

但是,如果您的应用程序保证可以一次访问所有 1000 个电话号码以及用户名,那么您可能应该将它们全部一起获取。

于 2013-09-13T15:30:02.133 回答