2012-01-14 41 views
3

这是我一直想知道的相当长一段时间的问题。我会试着通过一个例子来解释,但这是一个普遍的问题。SQL查询 - 尽量避免结果集中的数据不准确?

说你有两个表:

  1. 用户,其持有的第一个名字,姓氏,......用户的
  2. 的帖子,其中包含由用户撰写的帖子,与这些字段标题,文字,...

现在,假设我想显示其已在过去24小时内已创建的所有帖子。在此表中,我想显示创建此帖的用户的名字,姓氏,...。查询可能会是这个样子:

SELECT ... FROM的帖子,用户WHERE posts.user_id = users.id和[过去24小时]

现在,我的问题。由于一个用户很可能在过去的24小时内创建了多个帖子,我们基本上是一次又一次地检索他/她的名字,姓氏......。换句话说,上述查询的结果集包含重复数据(但不包含重复行)。

是不是会好一些:

  1. SELECT ... FROM帖子WHERE [过去24小时]
  2. SELECT ... FROM用户其中id IN(SELECT DISTINCT user_ID的帖子中WHERE [最后24小时])
  3. 将第一个查询的结果与第二个查询的结果在应用程序级别或SQL过程中进行映射,以找出帖子的名字,姓氏...... - 这可以很容易地完成,如果标识符(主键)是某种哈希映射,数组或类似的索引/键。

我知道这是一个非常普遍的问题,但任何见解都值得欢迎。谢谢!

+0

什么意思在你的上下文中更好? – EvilTeach 2012-01-14 12:29:52

回答

2

无论哪种方法应该可行,但你打的重要组成部分:

在应用层面做吧。

对我来说,我会拉重复的数据,以便我的结果集的每一行都包含我需要的所有数据。与几乎任何声明性语言相比,SQL在JOIN和set操作上效率更高。

如果将数据保存在一起,如果需要,您可以更轻松地将数据分解到下游,并且只需对数据库调用一次而不是两次。

随着重复数据的增长,这种好处会减少。如果只是几个领域,这不是一个很大的影响。如果有数十个冗余数据字段,性能差异将更加明显。

对于您的具体示例,最好在单个查询中完成所有操作。

如果困扰您,可以在应用程序级别消除重复,但与进行多个数据库调用相比,同一用户多次返回2或3个附加字段不会很显着。

+0

+1,用于“在单个查询中更好” – 2012-01-14 13:08:05

0

我认为最好的解决方案可能是选择用户,有消息持续24小时,并根据用户ID选择消息。

1. step: 

SELECT DISTINCT id, first_name, last_name 
FROM users INNER JOIN 
posts ON posts.user_id = users.id 
WHERE [last 24 hours] 

2. step: 

SELECT * 
FROM posts 
WHERE user_id = @userId AND [last 24 hours] 

这样造成更大的数据库调用但使用更少的内存,因为您检索消息只是每次1个用户。

+0

您认为运行数十个查询更好吗?他可能会有很多用户在过去24小时内发布帖子。 – JNK 2012-01-14 12:36:25

+0

你认为最好是阅读所有消息并将用户详细信息的数据复制到内存中,哪里会有大量消息? – pistipanko 2012-01-14 12:41:48

+0

是的。在这种情况下,我们正在讨论每行额外20-30个字节。这种影响比创建数百次数据库调用要少得多。 – JNK 2012-01-14 12:46:51

0

最好的解决方案取决于每个表中的行数以及每个用户每天的帖子数。

如果有相对较少的职位和大量用户,然后一气呵成选择两个职位和用户是OK。

如果每个用户的用户和帖子数量很少,最好使用第二个选项来分别选择它们。首先,你会选择过去24小时内的帖子,然后你会选择这样的作者:

SELECT users.id, first_name, last_name 
FROM users 
LEFT JOIN posts ON users.id = user_id 
WHERE [posts in the last 24 h]