[英]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.