我应该使用“每种类型的表”还是“每种层次的表”?

时间:2019-01-18 03:17:46

标签: c# sql database entity-framework

如果我有一个包含课程和课程模板以及公司课程模板的数据库,那么将它们存储在SQL数据库中的最佳方法是什么?课程中可能还会有其他有关得分,花费时间的元数据,以及其他一些信息。

每个层次的表

// Classes
public class CourseTemplate { } 
public class CompanyCourseTemplate { }
public class Course { }

每种类型的表

public class CourseTemplate { }
public class CompanyCourseTemplate : CourseTemplate { }
public class Course : CompanyCourseTemplate { }  
// Also for Course what if there are Course that belong to 
// either CompanyCourseTemplate or else CourseTemplate

混合使用两者-TPH

public class CourseTemplate { }
public class CompanyCourseTemplate : CourseTemplate { }

并且-TPT

public class Course { } 

当您需要区分表中的类型时,查询总是变得混乱。同样,如果您为每种类型创建一个表,则数据库也会被类似的命名表所困扰。我倾向于混合动力,因为它在类型上似乎更自然。

但是,假设我们正在存储对模板的引用,并且我们使用每种类型的表来管理这种关系的最佳方法是什么?

在检查表中,我可以有两个到模板表的外键。

public class ExamTemplate { }
public class CompanyExamTempalte { } 
public class Exam { 
public Int32 ? ExamTemplateId { get;set; }
public Int32 ? CompanyExamTemplateId { get;set; }  

问题是当我必须从考试模板参考中获取模板时,我的代码变得非常难看。我还没有找到真正解决这个问题的最佳方法。从两个模板之一继承的最佳方法是什么。我认为需要创建一个层次结构,其中所有考试实例都必须具有公司考试模板和主模板,并且考试可以包含对两者的引用。更改看起来像这样。

public class Exam {
    public Int32 CompanyExamTemplateId { get;set; }  
    public CompanyExamTemplate { get; set; }
    public Int32 ExamTemplateId { get; set; }
    public ExamTemplate { get; set; }
}

请注意,由于始终需要层次结构,因此可以为空的内容消失了。

1 个答案:

答案 0 :(得分:-2)

似乎您最初倾向于一对多的父子表结构,如下所示:

tblCourseTemplate:
CourseTemplateID
CourseTemplateName
CourseTemplateIsCompanyTemplate
CourseTemplateCompanyNameIfApplies

tblCourse:
CourseID
CourseTemplateID(即父记录)
课程名称
CourseScore
CourseDateTaken
CourseTimeTaken

但是随后您说一门课程可能有多个“父”记录,因此也许使用一个中间表来处理多对多关系:

tblCourseTemplate:
CourseTemplateID
CourseTemplateName
CourseTemplateIsCompanyTemplate
CourseTemplateCompanyNameIfApplies

tblCourseTemplateAndCourse:
CourseTemplateAndCourseID
CourseTemplateID
CourseID

tblCourse:
CourseID
课程名称
CourseScore
CourseDateTaken
CourseTimeTaken