2010-11-24 56 views
1

我有這方面的關係:的SQLite/C#:設計一個實體,是許多家長實體的孩子

1 Period has N Documents 
1 Pupil has N Documents 
1 Report has N Documents 

這是我的C#實體:

class Period 
{ 
    public int PeriodId {get;set;} 
    public List<Document> Documents {get;private set;} 
} 

class Pupil 
{ 
    public int PupilId {get;set;} 
    public List<Document> Documents {get;private set;} 
} 

class Period 
{ 
    public int ReportId {get;set;} 
    public List<Document> Documents {get;private set;} 

} 

class Document 
{ 
    public int DocumentId {get;set;} 

    // ??? 
    public int PeriodId {get;set;} 
    public int PupilId {get;set;} 
    public int ReportId {get;set;} 

    // ??? OR just a general Foreign-Key Id like 
    public int Id_FK {get;set;} 
} 

問題是這樣的:

當我有PeriodId 33的文檔時,有機會我也可以有一個PupilId 33,因爲這兩個表都使用主鍵/自動增量。所以可能會有一個學生和一個有Id 33的時期。現在做兩個表上的INNER JOIN我會從我的sqlite查詢中返回2個文檔,但我應該只能得到ONE

你會如何解決這個問題?

回答

0

您應該創建三個junction tables(比如period_docuemnts,pupil_documents和report_documents)。這可能比必要的更普遍一些(單個文檔也可能屬於多個時期),但更爲正常。

+0

馬丁實際上單個文檔只能屬於一個時期。無法將相同的文檔ID添加到另一個實體。我甚至會說這不需要,因爲一個時期有一個獨特的內容。我認爲我不需要兩次添加相同的「數學表」,因爲我不會每年教一次相同的課。這沒有意義。 – Elisabeth 2010-11-25 20:06:54

1

首先,爲SQLite定義您的ERD,之後是正確的,那麼您可以在C#中執行對象關係映射。您有四個主要實體,每個實體都需要SQLite中的表:文檔,學生,期間,報告。然後你需要一種方式來表達這樣一個事實:這三個表中每個表中的每個實體(行)都可以與一個或多個文檔相關聯。正如馬丁所說,這是通過使用「連接」又名連接表完成的。現在

,在C#中,如果你想有一個名爲文檔非規範化的對象,你可以這樣做:

class Document 
{ 
    public int DocumentId {get;set;} 

    // ??? 
    public int PeriodId {get;set;} 
    public int PupilId {get;set;} 
    public int ReportId {get;set;} 

    // ??? OR just a general Foreign-Key Id like 
    public int Id_FK {get;set;} 
} 

只有一個文檔可以有一個,只有一個週期,唯一相關聯一個學生,以及一個且只有一個報告。如果文檔可以鏈接到多個實體,那麼您的Document類的這些屬性必須允許多個值,即它們必須是數組或列表。

+0

多數民衆贊成在這種情況下:用戶可以添加文檔「excel表」與DocId 33只有一個實體。如果他將同一個文檔「excel表」添加到另一個實體,則它將是另一個DocId,如34。 – Elisabeth 2010-11-25 20:03:15

相關問題