代码之家  ›  专栏  ›  技术社区  ›  Elisabeth

sqlite/c:设计一个实体,它是许多父实体的子实体

  •  1
  • Elisabeth  · 技术社区  · 14 年前

    我有这些关系:

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

    这些是我的公司:

    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,因为这两个表都使用主键/autoincrement。所以可能有一个学生和一个周期的ID为33。现在对这两个表进行内部联接,我将从我的sqlite查询返回2个文档,尽管我应该只获取 .

    你怎么解决这个问题?

    2 回复  |  直到 14 年前
        1
  •  0
  •   Martin v. Löwis    14 年前

    你应该创造三个 junction tables (例如,句号文档、学生文档和报告文档)。这可能比必要的更一般(一个文档也可能属于多个时间段),但更正常。

        2
  •  1
  •   Tim    14 年前

    首先,为sqlite定义您的erd,然后在正确之后,您可以在C中进行对象关系映射。您有四个主要实体,每个实体都需要在sqlite中有一个表:document、pupil、period、report。然后,您需要一种方法来表示这样一个事实:这三个表中的每一个实体(行)都可以与一个或多个文档相关联。正如马丁所说,这是使用一个“连接”即链接表来完成的。

    现在,在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;}
    }
    

    只有当一个文档可以与一个且只能与一个期间、一个且只能与一个学生以及一个且只能与一个报告关联时。如果文档可以链接到这些实体中的多个实体,则文档类的这些属性必须允许多个值,即它们必须是数组或列表。