EF非规范化每个组连接的结果

时间:2015-03-11 20:13:56

标签: c# entity-framework denormalization

我在用户和他/她的学校之间有一对多的关系。我经常想为用户(具有最高“类型”的人)获得小学。这导致必须为我想要运行的每个查询加入小学。用户的学校几乎没有变化。是否有关于如何避免持续连接的最佳实践?我应该对模型进行非规范化,如果是,那么如何?还有其他更好的方法吗?

感谢。

public class User
{
   public int Id { get; set; }
   public virtual IList<UserSchool> UserSchools { get; set; }
   ...
}

public class UserSchool
{
   public int UserId { get; set; }
   public string Name { get; set; }
   public int Type { get; set; }
   ...
}

...

var schools = (from r in _dbcontext.UserSchools
               group r by r.UserId into grp
               select grp.OrderByDescending(x => x.Type).FirstOrDefault());

var results = (from u in _dbcontext.Users
               join us in schools on u.Id equals us.UserId
               select new UserContract
               {
                   Id = u.Id,
                   School = us.Name
               });

1 个答案:

答案 0 :(得分:0)

在过去的项目中,当我选择对数据进行非规范化时,我已将其非规范化为单独的表,这些表在后台由数据库本身进行更新,并尝试保留数据库软件中包含的尽可能多的流程。事情要好得多。请注意,任何类型的&#34;每x秒运行一次&#34;解决方案将导致数据的最新状态滞后。对于类似这样的事情,它听起来并不像经常发生的数据变化,因此过时的几秒钟(或几分钟,或几天,它的声音)过时并不是一个大问题。如果您正在考虑非规范化,那么检索速度必须更加重要。

我从来没有过快速过的&#34;何时进行非规范化的标准,但一般来说数据必须是:

  1. 经常访问。像往常每页加载多次。绝对 经常对应用程序至关重要。检索时间必须至关重要。
  2. 时间不敏感。如果您需要的数据一直在变化,并且您检索的数据最新是至关重要的,那么非规范化会产生太多的开销,为您带来很多好处。
  3. 非常大的数据集或相对复杂的查询结果。简单连接通常可以通过适当的索引来处理,也可以是索引视图。
  4. 已尽可能优化。我们已经尝试了索引视图,重新组织索引,重写基础查询等事情,但事情仍然太慢。
  5. 非规范化可以非常有用,但它引入了它自己的头痛,所以你要非常确定你已经准备好在你作为问题的解决方案提交它之前处理它们。