Если у меня есть база данных с курсами и шаблонами курсов, а также шаблонами корпоративных курсов, как лучше всего хранить их в базе данных 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 { }
А - ТПТ
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; }
}
ПРИМЕЧАНИЕ. Значения nullables пропали, поскольку иерархия всегда требуется.