簡體   English   中英

SQLite / C#:設計一個實體,該實體是許多父實體的子實體

[英]SQLite/C#: Design a entity which is a child of many parent entities

我有這些關系:

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個文檔。

您將如何解決?

首先,為SQLite定義ERD,然后正確,然后可以在C#中進行對象關系映射。 您有四個主要實體,每個實體都需要在SQLite中使用一個表:文檔,學生,期間,報告。 然后,您需要一種方法來表達以下事實:三個表中的每個表中的每個實體(行)都可以與一個或多個文檔相關聯。 正如馬丁所說,這是通過使用“連接”又稱為鏈接表來完成的。

現在,在C#中,如果要具有一個稱為Document的非規范化對象,則可以執行以下操作:

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類的這些屬性將必須允許多個值,即它們必須是數組或列表。

您應該創建三個聯結表 (例如,period_docuemnts,piece_documents和report_documents)。 這可能比必要的要籠統一些(單個文檔也可能屬於多個期間),但是更正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM