我的堆棧是ASP.NET MVC 5,實體框架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
?
不是一個真正的答案,但'入學'應該拼寫'入學'。 「註冊」也一樣。 – haim770 2014-08-31 18:48:35
本質上並不在數據庫中,但是如果添加了一些*特定*助手/便捷橋,*不影響數據庫模型和規範化這些*,那麼確定 - *如果*它使生活相對於編寫和維護這樣的助手更容易。但是,*不要破壞連接上的SQL效率*(已經有半個世紀的研究/優化) - 並且如果你這樣做了這樣的假設! SQL Server(或任何其他體面的RDBMS)*在這種「後連接」上效率非常高,並且快速縮減層次並吃午餐。並說午餐.. – user2864740 2014-08-31 18:55:15
@ haim770加拿大拼寫:) – 2014-08-31 18:56:30