【发布时间】:2012-01-10 06:21:33
【问题描述】:
关于设计合适的 DAO 的热门讨论总是以“DAO 应该只执行简单的 CRUD 操作”的方式结束。
那么执行聚合等操作的最佳位置是什么? DAO 是否应该返回类似于您的数据源架构的复杂对象图?
假设我有以下 DAO 接口:
public interface UserDao {
public User getByName(String name);
}
这里是它返回的对象:
public class Transaction {
public int amount;
public Date transactionDate;
}
public class User {
public String name;
public Transaction[] transactions;
}
首先,如果 DAO 所做的只是 CRUD 操作,我认为它会返回一个标准值对象。
所以现在我已经通过 DAO 建模,以基于数据存储关系返回一些东西。它是否正确?如果我有一个更复杂的对象图怎么办?
更新:我想我在这部分要问的是,DAO 的返回值,无论是 VO、DTO 还是你想调用的任何东西,都应该以数据为模型商店的数据表示?或者我应该引入一个新的 DAO 来获取用户的交易,并且对于被 UserDAO 拉取的每个用户,调用对 TransactionDAO 的调用来获取它们?
其次,假设我想对用户的所有交易执行聚合。使用这个 DAO,我可以简单地获取一个用户,并在我的服务循环中通过 transactions 数组并自己执行聚合。毕竟,完全可以说这样的聚合是属于 Service 的业务规则。
但是,如果用户的交易数量达到数万怎么办。这将对应用程序性能产生负面影响。在 DAO 上引入一种新方法来进行上述聚合是否不正确?
当然,这可能假设 DAO 由数据库备份,我可以在其中编写简单的 SELECT SUM() 查询。如果 DAO 实现更改为平面文件或其他内容,我无论如何都需要在内存中进行聚合。
那么这里的最佳做法是什么?
【问题讨论】:
标签: java design-patterns dao dto