У вас есть несколько альтернатив.
Если у вас не очень глубокая иерархия объектов и только несколько атрибутов, вы можете создать одну таблицу и добавить столбцы для каждого атрибута, который вам необходим для поддержки
Другой способ - создать таблицу для каждого объекта и сопоставить каждый атрибут с другим столбцом.
Подход, который вы хотите использовать, не очень хорош из-за следующих проблем:
- Трудно проверить, существуют ли все необходимые атрибуты для животного.
- Трудно загрузить все атрибуты для животного. (на самом деле, если вы хотите загрузить несколько животных в одном запросе, вы застряли)
- Трудно использовать разные значения для атрибутов.
- Сложно составлять запросы.
На самом деле это так называемый антипаттерн Entity-Attribute-Value, как описано в книге SQL Antipatterns.
Чтобы разрешить этот антипаттерн, необходимо переосмыслить, как вы будете хранить свое наследие в базе данных. Есть несколько подходов:
- таблица для иерархии классов
- таблица для каждого подкласса
- стол для конкретного класса
Точное решение зависит от вашей задачи, в настоящее время трудно решить, какое решение является наилучшим. Возможно, вам следует использовать таблицу для каждого подкласса. В этом случае вы будете хранить общие атрибуты в одной таблице, а все специфичные для животного перейдут в дополнительную таблицу.
sqlalchemy поддерживает все три основных типа наследования, читайте о конфигурации наследования в документации и выбирайте то, что лучше для ваших нужд.