Performance 当存在许多关联时使用NHibernate之类的ORM—性能问题

Performance 当存在许多关联时使用NHibernate之类的ORM—性能问题,performance,nhibernate,web-applications,orm,Performance,Nhibernate,Web Applications,Orm,我创建了一个应用程序(基于web的应用程序),它现在有大量关联。简言之,账户: 有很多用户 有背景 他有很多项目 同样,一个项目: 有很多项目 用户: 有许多任务 以此类推,加载更多关联。我希望这没有什么特别不寻常的。我选择使用NHibernate为我提供一组很好的持久类,映射器定义了所有关联 但这种方法正确吗?对应用程序的每个请求都会加载帐户(因为它是必需的),然后从数据库请求不需要的大量数据。延迟加载是一种选择,但我不知道我最初的方法是否能更好。在那个阶段,我只需要帐户和相关设置

我创建了一个应用程序(基于web的应用程序),它现在有大量关联。简言之,账户:

  • 有很多用户
  • 有背景
  • 他有很多项目
同样,一个项目:

  • 有很多项目
用户:

  • 有许多任务
以此类推,加载更多关联。我希望这没有什么特别不寻常的。我选择使用NHibernate为我提供一组很好的持久类,映射器定义了所有关联

但这种方法正确吗?对应用程序的每个请求都会加载帐户(因为它是必需的),然后从数据库请求不需要的大量数据。延迟加载是一种选择,但我不知道我最初的方法是否能更好。在那个阶段,我只需要帐户和相关设置,那么映射是否应该反映这一点?问题是,我希望在其他点为一个帐户创建所有项目,因此我需要映射器来反映所有关联


我担心的是,延迟加载可能只是补偿了我这方面糟糕的初始架构。我很清楚,这可能是由于我对NHibernate的内部工作机制知之甚少。因此,如果您对良好实践有任何建议,我将不胜感激。

对于NHibernate来说,默认情况下为大多数关联和对象启用延迟加载通常是一种很好的实践,除非您知道您总是需要关联的数据。然后,您可以有选择地切换到即时加载,仅用于在进入优化阶段时效率更高的项目。

域驱动设计在理解此类情况时对我帮助很大


在你的情况下,你应该问自己这样一个问题:你真的需要双向关联吗?或者在某些情况下,单向关联就足够了吗?这个决定是架构的一部分。所以你是对的。默认情况下选择双向关联时,延迟加载是一个很大的帮助。但是它可能被认为是一个设计缺陷。

好吧,在我看来,您的架构看起来很健康。联想是好的

考虑替代方案:

  • 关联较少:会导致数据库设计不佳
  • 不要使用ORM:你会发现自己在做“惰性初始化”——不管怎样,这有点像编码
  • 一切看起来都很好,惰性初始化也很好:)-但是,在实际使用中有很多陷阱:

  • 在使用惰性初始化工具之前不要关闭会话(这需要你“黑客”一些无用的关联阅读语句来强制阅读)
  • 使用NHibernate,您需要使用它执行所有DAL活动,以便启用level2缓存
  • 您可能会有一些开销(如果我不想知道accountname,只想知道其中的用户怎么办)
  • 这就是ORMs的工作原理。它们有pro(更容易开发,避免大量样板代码)和con(更高的开销,更少的灵活性)