我的用户在数据库中的表变得越来越大(就列而言不是行),因此减慢了我站点的各个区域。这是因为每次对用户进行连接时,它都会尝试从用户表中抓取每一列。
我想我会保留用户表中的所有常用字段,然后将其他字段放在单独的表中。例如,假设我的数据库中有以下表格:
Users:
- UserID (PK, Identity)
- UserName
- Password
...
UsersActivity:
- UserID (PK, FK)
- LastActivityDate
- LastLoginDate
...
UsersPreferences:
- UserID (PK, FK)
- HtmlEmail
- HideEmail
...
使用以下实体:
public class User {
public virtual int UserID { get; set; }
public virtual string UserName { get; set; }
public virtual string Password { get; set; }
public virtual UserActivity Activity { get; set; }
public virtual UserPreferences Preferences { get; set; }
}
public class UserActivity {
public virtual User User { get; set; }
public virtual DateTime LastActivityDate { get; set; }
public virtual DateTime LastLoginDate { get; set; }
}
public class UserPreferences {
public virtual User User { get; set; }
public virtual bool HtmlEmail { get; set; }
public virtual bool HideEmail { get; set; }
}
我只是想知道映射这个以获得最佳性能的最佳方法是什么?我想我可以在User实体的Activity和Performance属性上做一对一的映射。但据我所知,一对一映射不支持延迟加载,这种方法最终会变慢。
我也查看了组件映射,并且不太确定我是否可以将它映射到一个单独的表中(如果最好将它保存在同一个表中,请更正我)以及组件是否支持延迟加载。
在我对我的应用程序进行一些重度重构之前,我想我会得到可能已经做过这个的人的意见。真的很感激帮助。
由于
编辑:我发现只要需要/约束,您就可以延迟加载一对一的关系。这是我的情况。因此,我继续执行以下文章中的说明:
http://brunoreis.com/tech/fluent-nhibernate-hasone-how-implement-one-to-one-relationship/
现在的麻烦是我得到了错误:
NHibernate.Id.IdentifierGenerationException:NHibernate.Id.IdentifierGenerationException:为以下项生成的null id:UserActivity。
答案 0 :(得分:0)
在NHibernate 3.0中,一对一的关系支持延迟加载。
我认为最好将Component与Lazy属性结合使用。然后,您将能够将所有属性保留在一个表中,而不是一次性加载它们。
答案 1 :(得分:0)
您应该进行一些额外的应用程序分析,以确定您遇到性能问题的原因。它不太可能是由于选择列表中的列数。你可能有一个N+1 select problem。
也就是说,使用轻量级对象有很多很好的理由,因此您可能希望为此实现DTO(数据传输对象)。