Должен ли я использовать таблицу по типу или таблицу по иерархии? - PullRequest
0 голосов
/ 18 января 2019

Если у меня есть база данных с курсами и шаблонами курсов, а также шаблонами корпоративных курсов, как лучше всего хранить их в базе данных 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 пропали, поскольку иерархия всегда требуется.

1 Ответ

0 голосов
/ 18 января 2019

Похоже, вы изначально склонялись к структуре таблицы «один-ко-многим родитель-потомок» примерно так:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...