c# - 我应该使用每个类型的表还是每个层次结构的表?
问题描述
如果我有一个包含课程和课程模板以及公司课程模板的数据库,将它们存储在 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; }
}
注意空值已经消失,因为层次结构总是需要的。
解决方案
似乎您最初倾向于一对多的父子表结构,如下所示:
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
推荐阅读
- sql - 如何将列与不同表中的计数进行比较?
- spring - 如何使用 Spring 编写用于从 Eclipse 连接数据库的代码。这应该是一个没有使用spring boot的简单spring maven项目
- java - 如何修复来自 mysql 数据库的 ComboBox getSelectedItem() 匹配
- postgresql - 使用 Homebrew 安装 icu4c 版本 63
- php - 使用 imagerotate 旋转 jpeg
- powershell - 打开 WinSCP 会话时,对象引用未设置为对象的实例
- sql-server - 如何阻止统计数据库无休止的增长
- css - 多个框边框 CSS
- python - 获取字典的缺失日期并对其进行排序
- sql - SQL选择相交区间的最小值和最大值