2011-01-11 59 views
1

我的用户在数据库中的表格变得越来越大(按列而不是行),结果是减慢了我的网站的各个区域。这是因为它会在每次对它进行连接时尝试从用户表中获取每一列。拆分表以提高性能

我想我会保留用户表中的所有常用字段,然后将其他字段放在单独的表中。例如,假设我有我的数据库中下表:

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; } 
} 

我只是想知道什么是映射这个以获得最佳性能的最佳方式是什么?我想我可以在用户实体的活动和性能属性上进行一对一的映射。不过,据我了解,一对一映射不支持延迟加载,并且这种方法最终会变慢。

我还查看了组件映射,并不太确定我是否可以将其映射到单独的表(请更正我,如果最好将它保留在同一个表中)以及组件是否支持延迟加载。

在我开始对应用程序进行一些大量的重构之前,我想我会得到某个可能已经这样做的人的意见。真的很感谢帮助。

感谢

编辑:我发现,你可以延迟加载一比一的关系,只要它需要/约束。这是我的情况。所以我说干就干,在下面的文章中进行了说明:

http://brunoreis.com/tech/fluent-nhibernate-hasone-how-implement-one-to-one-relationship/

现在的问题是,我得到的错误:

NHibernate.Id.IdentifierGenerationException:NHibernate.Id.IdentifierGenerationException:空id为UserActivity生成。

+0

我已经发布了一个后续问题,这是更具体的映射一对一的关系,你可以在这里找到http://stackoverflow.com/questions/4660160/map-one-to-one-relationship -doesnt-允许-插入。我会在不久的将来用我的发现更新这个问题。 – nfplee 2011-01-11 16:52:41

回答

0

在NHibernate 3.0中,一对一关系支持延迟加载。

而且我认为最好使用Component和Lazy属性的组合。然后,您将能够将所有属性保留在一张表中,而不是一次加载它们。

+0

我无法升级到版本3 atm。如果我无法获得一对一的关系,组件构想将成为我的后备。我已经更新了我的问题,并详细介绍了使用一对一映射时遇到的问题。我使用流畅的nhibernate,但在xml中的等价物非常相似。 – nfplee 2011-01-11 15:40:57

+0

最新版本的NHibernate 3看起来解决了我遇到的问题,现在我可以升级。 – nfplee 2011-05-23 10:19:32

0

您应该执行一些额外的应用程序分析以确定您遇到性能问题的原因。这不太可能是由于选择列表中的列数所致。您可能有N+1 select problem

也就是说,使用轻量级对象有很多很好的理由,所以您可能需要考虑为此实现DTO(数据传输对象)。