Да, это возможно. То, что вы просите - это наследование " таблица на иерархию ". Ваша таблица должна содержать любой «столбец дискриминатора», который определяет тип каждой строки.
Однако ни одна запись для одного человека не может иметь более одного конкретного типа при материализации (считанной из БД), поскольку объект может иметь только один тип. Я писал об этой проблеме раньше :
Одним из ментальных барьеров, которые вы должны преодолеть при разработке хорошего объектного реляционного отображения, является склонность мыслить в первую очередь в объектно-ориентированных или реляционных терминах, в зависимости от того, что подходит вашей личности. Хорошее объектное реляционное отображение, тем не менее, включает в себя как хорошую объектную модель, так и хорошую реляционную модель. Например, допустим, у вас есть база данных с таблицей для сотрудников и связанными таблицами для сотрудников и клиентов. Один человек может иметь запись во всех трех таблицах. Теперь, с строго реляционной точки зрения, вы можете создать базу данных VIEW для сотрудников и другую для клиентов, которые содержат информацию из таблицы People. При использовании одного или другого ПРОСМОТРА вы можете временно думать об отдельном человеке как о «просто» сотруднике или «просто» клиенте, даже если вы знаете, что они оба. Таким образом, у кого-то из этого мировоззрения может возникнуть соблазн сделать OO-отображение, где Employee и Customer являются (прямыми) подклассами Person. Но это не работает с данными, которые у нас есть; поскольку у одного лица есть записи как о сотруднике, так и о клиенте (и поскольку ни один экземпляр Person не может одновременно иметь конкретный подтип Employee и Customer), отношение OO между Person и Employee должно быть составным, а не наследованием, и аналогично для Person и Customer.
Если «Боб» - это Participant
, который является одновременно Художником и Автором, то он не может быть типа, скажем, Artist
и Author
одновременно, если только один не является супертипом другого , Либо Исполнитель и Автор должны иметь отношения подтипа с другим, либо вы должны использовать агрегацию, а не наследование, чтобы связать Participant
с Artist
и Author
. Экземпляр объекта может иметь только один конкретный тип; это не меняется, потому что вы сохраняете его в БД.