我在用户和他/她的学校之间有一对多的关系。我经常想为用户(具有最高“类型”的人)获得小学。这导致必须为我想要运行的每个查询加入小学。用户的学校几乎没有变化。是否有关于如何避免持续连接的最佳实践?我应该对模型进行非规范化,如果是,那么如何?还有其他更好的方法吗?
感谢。
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
});
答案 0 :(得分:0)
在过去的项目中,当我选择对数据进行非规范化时,我已将其非规范化为单独的表,这些表在后台由数据库本身进行更新,并尝试保留数据库软件中包含的尽可能多的流程。事情要好得多。请注意,任何类型的&#34;每x秒运行一次&#34;解决方案将导致数据的最新状态滞后。对于类似这样的事情,它听起来并不像经常发生的数据变化,因此过时的几秒钟(或几分钟,或几天,它的声音)过时并不是一个大问题。如果您正在考虑非规范化,那么检索速度必须更加重要。
我从来没有过快速过的&#34;何时进行非规范化的标准,但一般来说数据必须是:
非规范化可以非常有用,但它引入了它自己的头痛,所以你要非常确定你已经准备好在你作为问题的解决方案提交它之前处理它们。