这是我很长时间以来一直在想的一个问题。我将尝试通过示例进行解释,但这是一个普遍的问题。

假设您有两个表:

  • 用户,其中包含用户
  • 的名字,姓氏,...
  • 帖子,包含用户撰写的帖子,带有标题,文本等内容。...

  • 现在,假设我要显示最近24小时内创建的所有帖子。在此表中,我要显示创建此帖子的用户的名字,姓氏,...。该查询可能类似于:

    SELECT ... FROM posts,users WHERE posts.user_id = users.id AND [过去24小时]

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

    这样做不是更好吗?
  • SELECT ... FROM发帖地点[过去24小时]
  • SELECT ... FROM用户,其中id为IN(SELECT DISTINCT user_id FROM在哪里发布,[过去24小时])
  • 将第一个查询的结果与应用程序级别或sql过程中的第二个查询的结果进行映射,以找出帖子的名字,姓氏,...-如果标识符(主键)为某种哈希图,数组或类似物的索引/键。



  • 我知道这是一个非常笼统的问题,但欢迎提出任何见解。谢谢!

    最佳答案

    两种方法都可以,但是您遇到了重要的部分:

    在应用程序级别执行。

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

    如果将数据放在一起,则可以根据需要在下游将其拆分的时间更短,并且只需要对数据库进行一次调用即可,而无需两次调用。

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

    对于您的特定示例,最好在单个查询中全部完成。

    您可以在应用程序级别消除重复操作(如果您感到困扰),但是对于同一用户多次返回的2或3个其他字段,与进行多个数据库调用相比,意义不大。

    10-04 15:30
    查看更多