首页 > 解决方案 > 我应该使用每个类型的表还是每个层次结构的表?

问题描述

如果我有一个包含课程和课程模板以及公司课程模板的数据库,将它们存储在 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; }
}

注意空值已经消失,因为层次结构总是需要的。

标签: c#sqldatabaseentity-framework

解决方案


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

tblCourseTemplate:
CourseTemplateID
CourseTemplateName
CourseTemplateIsCompanyTemplate
CourseTemplateCompanyNameIfApplies

tblCourse:
CourseID
CourseTemplateID(即父记录)
CourseName
CourseScore
CourseDateTaken
CourseTimeTaken

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

tblCourseTemplate:
CourseTemplateID
CourseTemplateName
CourseTemplateIsCompanyTemplate
CourseTemplateCompanyNameIfApplies

tblCourseTemplateAndCourse:
CourseTemplateAndCourseID
CourseTemplateID
CourseID

tblCourse:
CourseID
CourseName
CourseScore
CourseDateTaken
CourseTimeTaken


推荐阅读