Чтобы описать мою дилемму, позвольте мне сначала начать с примера проблемы (украденной у здесь ). Допустим, в вашей базе данных есть таблица GradStudent, которая выглядит следующим образом:
GradStudent:
firstName
lastName
birthDate
courseAssignment
researchGrant
Но только преподаватели будут иметь назначение курса, и только научные сотрудники будут иметь исследовательский грант, поэтому один из этих двух всегда будет нулевым. Очевидно, что это не оптимально, и было бы лучше сделать это:
GradStudent:
firstName
lastName
birthDate
TeachAsst:
courseAssignment
ResearchAsst:
researchGrant
Если у TeachAsst и ResearchAsst есть внешний ключ (вероятно, суррогат "studentID") из таблицы GradStudent.
Я также понимаю, почему было бы не лучше создать две совершенно разные таблицы, такие как:
TeachAsst:
firstName
lastName
birthDate
courseAssignment
ResearchAsst:
firstName
lastName
birthDate
researchGrant
Потому что вы повторяете много атрибутов, имеющих одинаковое значение.
Однако два различных класса будут иметь смысл (я думаю), если у них почти нет общих полей, например:
TeachAsst:
name
courseAssignment
payRate
numStudents
ResearchAsst:
name
researchGrant
facultyAdvisor
researchTopic
Здесь у них есть только общее имя, поэтому было бы глупо иметь суперкласс GradStudent только с одним атрибутом name? Где переломный момент? Как вы решаете, когда иметь суперкласс общей информации, или когда два класса должны быть полностью разделены? Наличие суперкласса делает большую часть CRUD немного сложнее, потому что для создания или обновления TeachAsst вам нужно изменить две таблицы вместо одной.
В качестве другого примера, скажем, база данных, над которой вы работаете, включает измерение информации на разных электронных устройствах. И хотя камера и мобильный телефон имеют общую длину / ширину / высоту, большинство других измерений не будут совпадать (например, камера не будет иметь никакой аудиоинформации, а мобильный телефон не будет иметь никаких измерений объектива или области просмотра ). Таким образом, кажется, что намного проще иметь таблицу cameraData и mobileData, которые являются полностью раздельными, чем помещать небольшое количество общей информации в таблицу суперкласса. Как вы думаете? Существует ли общее правило, которое гласит, что вы всегда должны объединять общие данные в суперклассе, даже если это небольшой процент описательных данных подкласса?
Редактировать: Предположим, что в примере аспиранта аспирант является либо помощником преподавателя, либо научным сотрудником, никогда не поменяется ролями, а также никогда не будет ни тем, ни другим.