2

我尝试将我的特定域问题抽象到银行账户,假设以下情况:

  • 我有某个客户的银行登录。
  • 每个客户可以拥有多个属于同一登录名的银行账户。
  • 每个银行账户可以有数千笔交易。

我将类结构设计如下(简化):

public class Login
{
    private List<Account> _bankingAccounts;
    ....more fields, ctor, getters, setters...
}

public class Account
{
   private List<Transaction> _transactions;
    ....more fields, ctor, getters, setters...
}

public class Transaction
{
   String _comment;
    ....more fields, ctor, getters, setters...
}

好吧,但是如果我假设有 20 个帐户,每个帐户有 10000 个事务,并且我从数据库中加载整个模型,则会有大量内存,即使我不知道客户是否需要所有这些事务。

我想建立一个更简化的模型,如下所示:

public class Login
{
    private List<SimpleAccount> _bankingAccounts;
    ....more fields, ctor, getters, setters...
}

public class SimpleAccount
{
    ....more fields, ctor, getters, setters...
}

public class Account
{
   private List<Transaction> _transactions;
    ....more fields, ctor, getters, setters...
}

public class Transaction
{
   String _comment;
    ....more fields, ctor, getters, setters...
}

然后我将加载一个带有简化帐户(不包含所有交易)的帐户模型,并且只有在用户请求查看特定帐户的交易时,我才会加载这个单个完整的帐户对象。

这样可以吗?有更好的方法吗?

4

4 回答 4

6

从您的问题中,我发现您的基本需求是 ORM,因为(如果我没记错的话)您想要两件事
域模型映射

延迟加载
延迟加载我们的意思是关系对象仅在我们尝试访问它们时才加载。您想查看您永远不想自动加载学生的所有课程(可能是一个集合)的特定学生数据,除非不想看到他/她的课程(如果学生和课程有关系) .
因此,对于您的问题,您应该使用 ORM 它将为您提供两种解决方案:)
这是.Net 提供的一些 ORM 的列表

于 2012-07-30T08:01:42.283 回答
2

当您构建模型时,您不应该考虑性能影响,因为域模型是您的域,而不一定是您实现的。

此外,如果您使用任何体面的 ORM 框架(例如),您可以只从数据库加载您需要的数据,而不是整个对象图。

于 2012-07-30T07:47:46.047 回答
1

正如 Serg 所说,性能思想属于实现,而不是领域模型。

如果你想避免加载整个账户,你应该实现某种延迟加载,例如:

public class Account
{
   private List<Transaction> _transactions;

   public List<Transaction> getTransactions() {
        if(_transactions == null) {
             loadTransactions();
        }
        return _transactions;
   }
}
于 2012-07-30T08:01:02.503 回答
0

有一种称为事件溯源的模式听起来可能对您有所帮助。它依赖于事件的存储(在您的情况下,这些是事务)而不是运行总计,因此您可以对数据做更多的事情。

此模式遇到了您遇到的相同问题。所以这个模式有一个补充,叫做快照。拍摄快照,例如在每个月末拍摄,您可以及时获取一个时间点并将交易记录加载回最近的快照。快照将在快照点按原样显示帐户(可能是最后一个快照或帐户开立事件的产物,其中所有交易均已重播)。

如果你在谷歌上搜索“事件溯源快照”,就会有很多文章讨论这种模式。希望这可以帮助。

于 2012-07-30T10:51:50.350 回答