我的堆栈是ASP.NET MVC 5,Entity Framework 6.1,代码优先,SQL Server。
我正在申请一个涉及多所学校的申请,每所学校都有课程(每个都有部分)和学生。这些形成了相关对象的层次结构,每个对象都由一个学校实例生成。
到目前为止的基本布局:
一所学校有很多课程和学生
一门课程有很多部分
模型的简化版本如下。
public class School
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Course> Courses { get; set; }
public virtual ICollection<Student> Students { get; set; }
}
public class Student
{
public int Id { get; set; }
public int SchoolId { get; set; }
public virtual School School { get; set; }
public virtual ICollection<Enrolment> Enrolments { get; set; }
}
public class Course
{
public int Id { get; set; }
public string Title { get; set; }
public int SchoolId { get; set; }
public virtual School School { get; set; }
public virtual ICollection<CourseSection> CourseSections { get; set; }
}
public class CourseSection
{
public int Id { get; set; }
public int CourseId { get; set; }
public virtual Course Course { get; set; }
public virtual ICollection<Enrolment> Enrolments { get; set; }
}
还涉及其他模型和关系,但这应该足以构成我的问题的基础。
课程部分与课程有关,而课程又与学校有关。鉴于课程部分,我可以确定它所属的学校,例如var school = givenSection.Course.School
。相反,考虑到学校,我可以获得属于学校的课程部分。在代码中,它只是几个引用,而在数据库中,它只是几个表连接。但它仍然变得更有趣。考虑下一个模型:
public class Enrolment
{
public int Id { get; set; }
public int StudentId { get; set; }
public int CourseSectionId { get; set; }
public virtual Student Student { get; set; }
public virtual CourseSection CourseSection { get; set; }
}
Enrolment
实例是学生和课程部分之间的多对多桥梁。获取学校的注册列表是需要多个表连接的多个步骤。在一个可能变得非常大的记录数量的系统中,我担心这种设置的效率。然后再次,应用程序配置为延迟加载,所以也许这样可以,我还不太了解EF确定。
为了简化数据检索,从CourseSection
和Enrolment
模型中的任何一个或两者引用学校可能是理想的吗?如果层次结构中的所有模型都能够直接引用它们所属的School
,那么进一步扩展它吗?
答案 0 :(得分:0)
不,这会破坏正常化。您的性能问题是有效的,但解决方案无法知晓,不应过早实施,也不能在不测量实际时间的情况下实施。在我看来,数据是最重要的,因为它可能会比代码更长久。因此,所有其他与数据良好形状相同的应该是优先考虑的事项。