Наследование Entity Framework: TPT, TPH или нет? - PullRequest
15 голосов
/ 30 мая 2009

В настоящее время я читаю о возможности использования наследования с Entity Framework. Иногда я использую подход для ввода записей данных, и я не уверен, буду ли я использовать TPT или TPH или ничего ...

Например ... У меня есть интернет-магазин, который добавляет адрес доставки, биллинга и доставки

У меня есть адресная таблица:

RecordID
AddressTypeID
Street
ZipCode
City
Country

и стол AddressType

RecordID
AddressTypeDescription

Дизайн стола отличается от общего дизайна, когда люди хвастаются TPT или TPH ... Имеет ли смысл думать о наследовании, когда у тебя такой подход ..

Надеюсь, это имеет смысл ...

Спасибо за любую помощь ...

Ответы [ 3 ]

25 голосов
/ 02 июня 2009

Вы должны проверить мою серию EF Tips .

Тот, который называется Как выбрать стратегию наследования должен дать вам больше понимания

Надеюсь, это поможет

Alex

11 голосов
/ 31 мая 2009

При рассмотрении вопроса о том, как представлять наследование в базе данных, необходимо учитывать несколько вещей.

Если у вас много разных подклассов, у вас может быть много дополнительных объединений в запросах, затрагивающих более сложные типы, которые могут снизить производительность. Одним из больших преимуществ TPH является то, что вы запрашиваете одну таблицу для всех типов в иерархии, и это благо для производительности, особенно для больших иерархий. По этой причине я склоняюсь к такому подходу в большинстве сценариев

Однако TPH означает, что вы больше не можете иметь поля NOT NULL для подтипов, поскольку все поля для всех типов находятся в одной таблице, что возлагает ответственность за целостность данных на ваше приложение. Хотя на практике это может звучать ужасно, я не считаю это слишком большим ограничением.

Однако я бы предпочел использовать TPT, если бы было много полей для каждого типа и что число типов в иерархии, вероятно, было бы небольшим, означая, что производительность не была такой большой проблемой с объединениями, и Вы получаете лучшую целостность данных.

Обратите внимание, что одним из преимуществ EF и других ORM является то, что вы можете передумать, не влияя на свое приложение, поэтому решение не должно быть полностью высечено в камне.

В вашем примере он не имеет отношения наследования, он выглядит как один ко многим от типа адреса до адреса

Это будет представлено между вашими классами примерно так:

Address.AddressType
AddressType.Addresses
4 голосов
/ 08 апреля 2010

Как намекает Кит, в этой статье предполагается, что TPT в EF ужасно масштабируется, но я сам не пробовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...