【问题标题】:NHibernate and Large CollectionsNHibernate 和大型集合
【发布时间】:2009-10-02 15:59:01
【问题描述】:

作为学习 NHibernate 的一种方式,我想出了一个包含典型用户和组身份验证系统的小项目。这让我开始思考如何做到这一点。我很快将以下类放在一起并将它们映射到数据库,经过大量试验和错误后,它工作了。我最终得到了一个三表数据库模式,其中用户表和组表之间存在多对多关联表。

public class User
{
    public virtual string Username { get; set; }
    public virtual byte[] PasswordHash { get; set; }
    public virtual IList<Group> Groups { get; set; }
}

public class Group
{
    public virtual string Name { get; set; }
    public virtual IList<User> Users { get; set; }
}

我的问题是关于这种类设计的可扩展性和潜在性能。如果这是在一个拥有数万用户的生产系统中,即使对 Group 的 Users 集合进行延迟加载,任何对 Groups 属性的调用都可能引发巨大的数据检索。

NHibernate 将如何应对这种情况以及我如何改进我的设计?

【问题讨论】:

    标签: c# nhibernate oop


    【解决方案1】:

    不要将它们创建为属性。向这些类添加函数,使您可以微调查询(通过使用参数)以检索您需要的特定数据集。

    【讨论】:

    • 我认为 ORM 的杀手级特性之一是对持久性的无知。如果我要在 Group 类上创建一个 GetUsers(...) 方法,它需要知道如何获取用户,这肯定是持久性意识。同样,如果我想调用 myGroup.AddUser(...),如果我的 Group 类不维护用户集合,那么它把用户放在哪里?
    【解决方案2】:

    我知道这个问题很老了,但只是偶然发现了它。您声明“即使对 Group 的 Users 集合进行延迟加载,对 Groups 属性的任何调用都可能引发潜在的巨大数据检索。”为什么?大概组的数量不是数万,访问 User 上的 Groups 属性只会加载 Groups 集合,而不是 Groups 集合中的 Users 集合(除非用户未标记为延迟加载)。仅当您访问 Group 中的 Users 集合时才会发生大量数据检索,在这种情况下,我建议不要从 Group 映射中访问该关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多