最近在构建一个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个与之关联的电话号码。这是一个名字和姓氏,每次回复很多。我们还假设我想要返回的不仅仅是该用户的名字和姓氏,实际上我开始返回相当多的额外行,我真的只需要一次。< / p>
是否存在更合适的情况&#34;多次调用数据库?
e.g。
SELECT firstname, lastname
FROM users
WHERE userid = 12345;
SELECT phone
FROM users_phones
WHERE userid = 12345;
如果答案是肯定的,是否有一个好的/适当的方法来确定何时使用多个查询而不是单个查询?
答案 0 :(得分:3)
我认为这实际上取决于您的用例。在您给出的示例中,将其作为两个查询返回似乎是有意义的,特别是如果您将该信息传递回移动设备,您希望确保以尽可能少的数据发送它们(并非每个人都无限制)数据.....)
我可能会在这些查询中添加DISTINCT,如果这会根据您的表格产生影响。
答案 1 :(得分:2)
使用JOIN
的查询可能比两个独立查询慢。这实际上取决于您正在进行的访问类型。
对于您的示例,我将使用两种查询方法。这些查询可以并行执行,可以缓存,除了任意表示问题之外,JOIN
没有真正的理由。
您还需要关注返回重复数据。在您的示例中,对于每个电话号码,将会重复显示fname
和lname
,从而导致传输大量实际无用的数据。这是因为您所描述的一对多关系。
一般来说,如果这意味着发送更少的数据,或者因为这两个查询不是独立的,你会想JOIN
。
答案 2 :(得分:0)
这应该由应用程序驱动。基本上,您在一个查询中检索一个地方所需的所有信息。如果您以此问题页面为例,则会看到您的用户ID,信誉计数器和徽章计数器。首次显示问题页面时,无需检索其他用户配置文件信息。
只有当用户点击一个用户ID时,才会查询其余的个人资料,甚至可能都不是全部,因为个人资料页面上有几个标签。
但是,如果您的应用程序保证一次访问所有1000个电话号码以及用户名,那么您可能应该一起获取它们。