Используйте ИППП для различий в поведении, как вы сказали. Пример, который я бы использовал, был бы:
У вас есть покупка, и у вас есть PartialPurchase, единственное различие с данными состоит в том, что, когда PartialPurchase завершается, он получает отношение к вновь созданной покупке.
Так что поведение отличается, также есть случаи, когда я хотел бы, чтобы PartialPurchase и Purchase отображались в одном запросе. Для коммерческого агента они хотят видеть все свои покупки и частичные покупки одновременно, поэтому имеет смысл, чтобы эти данные были в одной таблице. В противном случае все атрибуты одинаковы для каждой модели.
В этом случае я бы использовал STI поверх CTI.
Хотя, если бы когда-либо данные стали сильно различаться, я бы, вероятно, создал бы другую таблицу, которая относится к таблице STI, а в случае многих различных полей я бы, вероятно, подумал о CTI.