如果我有一个包含课程和课程模板以及公司课程模板的数据库,那么将它们存储在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; }
}
请注意,由于始终需要层次结构,因此可以为空的内容消失了。
答案 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