При рассмотрении вопроса о том, как представлять наследование в базе данных, необходимо учитывать несколько вещей.
Если у вас много разных подклассов, у вас может быть много дополнительных объединений в запросах, затрагивающих более сложные типы, которые могут снизить производительность. Одним из больших преимуществ TPH является то, что вы запрашиваете одну таблицу для всех типов в иерархии, и это благо для производительности, особенно для больших иерархий. По этой причине я склоняюсь к такому подходу в большинстве сценариев
Однако TPH означает, что вы больше не можете иметь поля NOT NULL
для подтипов, поскольку все поля для всех типов находятся в одной таблице, что возлагает ответственность за целостность данных на ваше приложение. Хотя на практике это может звучать ужасно, я не считаю это слишком большим ограничением.
Однако я бы предпочел использовать TPT, если бы было много полей для каждого типа и что число типов в иерархии, вероятно, было бы небольшим, означая, что производительность не была такой большой проблемой с объединениями, и Вы получаете лучшую целостность данных.
Обратите внимание, что одним из преимуществ EF и других ORM является то, что вы можете передумать, не влияя на свое приложение, поэтому решение не должно быть полностью высечено в камне.
В вашем примере он не имеет отношения наследования, он выглядит как один ко многим от типа адреса до адреса
Это будет представлено между вашими классами примерно так:
Address.AddressType
AddressType.Addresses