关于Dao设计中对于大型的实体对象是否应该一次查询组合全部数据

2020-01-10 23:52发布

问题:

问题来源

我在做一个网站(Spring栈完全前后端分离),设计Dao时,User实体类包含基本信息(password, username...),然后含有一个UserExt对象保存额外信息(entry_date, leave_date...),还含有List<Role>保存角色信息(角色中拥有权限),还含有一个List<Permission>保存自有的权限信息。
由于User含有非常多的信息,在做UserService时,User需分步获取的各部分信息,类似于:
// 获取用户基本信息
User user = UserDao.getUserByUsername(username);
// 获取用户额外信息
int userId = user.getId();
UserExt userExt = UserDao.getUserExtByUserId(userId);
user.setUserExt(userExt);
// 获取用户角色信息
List<Role> roles = UserDao.getRolesByUserId(userId);
user.setRoles(roles);
// 获取用户权限信息
List<Permission> permissions = UserDao.getPermissionsByUserId(userId);
user.setPermissions(permissions)
// 得到最终组装成的 user

问题

现在问题是:
因为每次请求都肯定要使用User信息,也就是每次都需要很多的Dao操作,上面还不是最惨,最惨的是还需要Dao组装role的权限,又是一批Dao请求,这样会不会导致Web性能大幅下降,应如何改善呢?

回答1:

多次获取数据组装肯定是比一次性获取数据慢,
1 建议弄个视图把,还方便筛选到底哪些字段需要加载哪些字段不需要加载,
你总结一下需要哪些字段,
然后建立一个视图
后面直接读取视图
2 上ef,信任ef的sql优化