2011-05-23 92 views
1

我有以下實體在我的系統中模擬這種如何在面向對象的方式

public class Student 
    { 
     public Guid StudentId { set; get; } 
     public string StudentName { set; get; } 
     public virtual Course[] Courses { set; get; } 
    } 

public class Teacher 
    { 
     public Guid TeacherId { get; set; } 
     public string TeacherName { get; set; } 
     public virtual Course[] Courses { get; set; } 
    } 


public class Course 
    { 
     public Guid CourseId { set; get; } 
     public string CourseName { set; get; } 
     public Student[] Students { set; get; } 
     public Teacher Teacher { get; set; } 
     public Test[] Tests{ get; set;} 
    } 


public class Test 
    { 
     public Guid TestId { get; set; } 
     public String TestName { get; set; } 
     public int TotalMarks { get; set; } 
     public int PassingMarks { get; set; } 
    } 

每個學生都可以加入了許多課程,每門課程可以有很多學生

每一位教師可以教多門課程和每個當然可以有一個教師

每個當然可以有許多測試

例如,有一種所謂的「數學」,當然,這持續6個月,在這半年內多次測試都進行

,如果我想存儲「爲測試T1學生S1痕」,「學生S1的測試T2」

標記下面的數據是什麼將b正確的數據結構

我知道我可以在測驗和學生之間有多對多的關係, 但是學生和課程之間已經有了多對多的關係,而課程包含了測驗。

+0

這是一個家庭作業問題btw?如果是這樣,應該得到作業標籤。 – 2011-05-23 15:00:54

+0

不,它不是一個家庭作業問題:)它的我的寵物項目雖然:) – 2011-05-23 15:06:25

回答

1

您應該考慮開設一個包含「學生 - >標記和標記 - >測試」關係的類,例如「標記」。

一般來說,當你在做一個面向對象的設計時,在這個域級別,你的類和關係是你的用例或描述中的名詞和動詞。在這種情況下,你知道你的學生有商標;這些是特定於學生的。學生沒有測試,因爲這些不是由學生創建或控制的。

更新

是,這個想法是,你有一個類商標,並在學生自己的商標的關係;商標與其測試有關係。換句話說,「一個學生有考試成績」 - 一旦你學會正確地看待這些問題,這些問題實際上就是問題的語言。

所以這會是這樣的

class Student { // lots of other fields 
    marks : set of Marks // any convenient structure 
          // logically a Set because you wouldn't have the 
          // same marks assigned to a student twice 
} 

class Marks { // A Mark is the Student's score for a test 
    Score s; 
    Test t; 
    Student stud; // see below 
} 

class Test { // other information needed here too 
    marks : set of Marks 
} 

現在,你有一個類的結構,讓你問「什麼是對他們的測試學生的痕跡?」,並從,你可以問:「請問是什麼那些測試?「換個角度來說,你可以問:「這些測試給了什麼印記?」和「那些學生是誰?」這就是爲什麼Marks需要與學生建立關係的原因。

有兩點需要注意:

(1)這是在面向對象的分析很常見的模式 - 一個多對多的關係變成了「輔助類」表示它。 (2)如果你打算把它放在數據庫中,還有第二個問題:自然要做的是讓每個類都成爲一個單獨的表;如果你可以以接近零的成本(比如訪問時間)查找表中的項目,那麼這個方案工作正常。在真實的數據庫中,你需要多次訪問磁盤才能訪問,並且速度變慢。這就是所謂的「對象關係阻抗不匹配問題」。有很多解決方案可以使數據庫非規範化,創建額外的索引或視圖來預先計算關係,或者修改對象模型。

+0

這是什麼意思「包含關係學生 - >馬克和馬克 - >測試。」 – 2011-05-23 15:01:06

+0

你的意思是說我將有一個名爲Marks的課程,其中將包含兩個屬性Student和Test – 2011-05-23 15:47:37

+0

非常感謝您的回答..我再次回顧了同樣的情況,並且您的回答幫助了很多 – 2012-09-16 08:40:29