2014-08-31 51 views
-1

我的堆棧是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足夠肯定。

爲了簡化數據檢索,從CourseSectionEnrolment模型中的任何一個還是兩個都參考學校可能是理想選擇?如果進一步擴展,層次結構中的所有模型都應該能夠直接引用它們所屬的School

+2

不是一個真正的答案,但'入學'應該拼寫'入學'。 「註冊」也一樣。 – haim770 2014-08-31 18:48:35

+3

本質上並不在數據庫中,但是如果添加了一些*特定*助手/便捷橋,*不影響數據庫模型和規範化這些*,那麼確定 - *如果*它使生活相對於編寫和維護這樣的助手更容易。但是,*不要破壞連接上的SQL效率*(已經有半個世紀的研究/優化) - 並且如果你這樣做了這樣的假設! SQL Server(或任何其他體面的RDBMS)*在這種「後連接」上效率非常高,並且快速縮減層次並吃午餐。並說午餐.. – user2864740 2014-08-31 18:55:15

+0

@ haim770加拿大拼寫:) – 2014-08-31 18:56:30

回答

0

不,這會破壞標準化。您的績效考慮是有效的,但解決方案無法知道,不應過早實施,而且無需測量實際時間。在我看來,數據是最重要的,因爲它有可能超過代碼。因此,其他所有的數據都應該是優先考慮的。

相關問題