更高效的(速度/内存)是:一个联接或多个选择



我有以下表格:

用户

userId|name

项目

itemId|userId|description

我想实现的是:我想从数据库中读取所有用户及其项目(一个用户可以有多个项目)。所有这些数据我希望它存储在如下结构中:

User {
id
name
array<Item>
}

其中Item是

Item {
itemId
userId
description
}

我的第一个选择是调用SELECT * from users,用用户部分填充一个数组,然后为每个用户执行SELECT * from items where userId=wantedId并完成项目数组。

这种方法正确吗?还是应该使用联接?

我不想使用join的一个原因是我有很多冗余数据:

userId1|name1|ItemId11|description11
userId1|name1|ItemId12|description12
userId1|name1|ItemId13|description13
userId1|name1|ItemId14|description14
userId2|name2|ItemId21|description21
userId2|name2|ItemId22|description22
userId2|name2|ItemId23|description23
userId2|name2|ItemId24|description24

冗余的意思是:userId1,name1userId2,name2

我的理由合理吗?

后期编辑:我在谈到效率时添加了标题速度或内存

您正在用网络往返来交换线路和RAM中的字节。网络延迟通常是更大的问题,因为内存便宜,网络速度更快。随着第一个结果集的大小增长,情况变得更糟——谷歌搜索"(n+1)查询问题"。

我更喜欢JOIN。不要使用SELECT *编写;这几乎在任何情况下都是个坏主意。你应该准确地说出你想要的列。

Join是最好的性能方式。减少开销,就可以使用相关索引。你可以测试。。但我确信连接比多选更快、更优化

答案是:这取决于情况。

多重选择:

  • 如果您最终发出了大量的查询来填充描述,那么您必须考虑到,您最终将需要多次往返于数据库

使用JOIN:

  • 是的,您将返回更多数据,但您只有一次往返行程

您已经提到,您将用用户部分填充数组。你知道你想提前填写多少用户吗,因为在这种情况下,我会使用以下内容(我在这里使用的是Oracle):

select * 
  from item a,
      (select * from 
      (select * 
         from user 
        order by user_id) 
       where rownum < 10) b
 where a.user_id = b.user_id
 order by a.user_id

这将只返回前10个用户的所有项目(这样大多数工作都是在数据库本身上完成的,而不是取回所有用户,丢弃除前10个之外的所有用户…)

最新更新