Если вы пришли из мира реляционных баз данных, у вас может быть четкое представление о нескольких взаимосвязанных концепциях, включая реляционные объединения, нормализацию данных, логическую независимость данных, данные с самоописанием, транзакции ACID и контроль параллелизма. Новичку трудно по-настоящему понять силу и простоту каждого из этих понятий, не будучи немного знакомыми со всеми из них. Хотите верьте, хотите нет, но специалистам по объектному моделированию нелегко понять каждую из этих концепций, просто сравнив их с вещами, которые они уже знают.
Подобное происходит, когда вы впервые начинаете изучать моделирование объектов. Три взаимосвязанных понятия - наследование, инкапсуляция и полиморфизм. Ни один из них не имеет большого смысла без некоторого понимания двух других. Все они работают вместе, чтобы создать мощную и простую систему.
Не поддавайтесь искушению считать объектную модель похожей на реляционную модель, только без каких-либо особенностей. Это упрощение объектной модели. Правда в том, что каждая из этих модельных парадигм была огромным достижением в области современного искусства моделирования, примерно сорок-пятьдесят лет назад. Каждый из них позволяет намного легче думать о существующих или предлагаемых системах, которые еще предстоит построить.
Но они не похожи друг на друга , и ни один не был получен из другого.
Если вы собираетесь начать с реляционного мышления, вот с чего начать. Решите, являются ли отношения между Product и ProductFamily отношениями HAS-A или IS-A. Отношения HAS-A легко моделируются (реляционно) с использованием отдельных таблиц и внешних ключей. С точки зрения объектов их лучше всего моделировать как отдельные классы со ссылкой на один из них. IS-A отношения разные. Например, в зоомагазине могут быть кошки, собаки, птицы и змеи, но все они домашние животные. Есть некоторые атрибуты или методы, которые относятся только к птицам или кошкам, но есть и другие, которые относятся ко всем из них.
Ближайший аналог суперкласса / подкласса в реляционном моделировании не в реляционной модели, а в модели расширенных отношений сущностей. Здесь есть концепция, которая называется Обобщение / Специализация. Кошка, собака, птица или змея - это специализация обобщающего питомца. Это отношения IS-A. Если обобщение / специализация имеет смысл для вас в данном случае, то подклассы и наследование будут вам полезны. Если нет, то лучше не пытаться использовать здесь подклассы.
Здесь, в StackOverflow, буквально сотни вопросов, которые задают люди, которые привыкли к объектному моделированию и хотят знать, как добиться взаимосвязей IS-A с таблицами SQL. Последний пример находится рядом с вашим вопросом и называется Расписание объединения нескольких таблиц . Для этих людей есть тег таблица классов-наследование . Трудно понять, как реляционная модель может делать что-либо без концепции наследования. Ваша проблема в обратном. Как и когда использовать наследование, чтобы сделать жизнь проще, чем в реляционной схеме. И когда не использовать наследование.
Вам необходимо решить, являются ли Product и ProductFamily случаем, когда наследование полезно Опять же, если это отношения HAS-A, забудьте о подклассах и наследовании. Если это отношения IS-A, наследование является ключом к простому решению. Чтобы выполнять значимые операции над суперклассом, вам нужно либо ограничить себя операциями, значимыми для суперкласса, либо научиться создавать полиморфные операции. Это много обучения, но в конце пути есть много ценности.