2010-11-24 49 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