我有以下表格:
使用者
userId |名称
项目
itemId | userId |描述
我想要实现的目标:我想从数据库中读取所有用户及其项目(一个用户可以有多个项目).我希望将所有这些数据存储在以下结构中:
User {
id
name
array<Item>
}
项目在哪里
Item {
itemId
userId
description
}
我的第一个选择是从用户调用SELECT *,用用户部分填充一个数组,然后为每个用户从userId = wantedId的项目中执行SELECT *,并完成项目数组.
这种方法正确吗,还是应该为此使用联接?
我不想使用连接的原因是我有很多冗余数据:
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,name1和userId2,name2
我的理由合理吗?
稍后编辑:在谈论效率时,我增加了标题速度或记忆
解决方法:
您需要权衡网络往返传输中的在线和RAM中的字节数.网络延迟通常是一个更大的问题,因为内存便宜且网络变得越来越快.随着第一个结果集的大小增加,情况变得越来越糟-Google的价格为“(n+1) query problem”.
我更喜欢加入.不要使用SELECT *;在几乎所有情况下,这都是一个坏主意.您应该准确地拼出所需的列.