Наследование Entity Framework: TPT, TPH или нет?

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

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

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

RecordID
AddressTypeID
Street
ZipCode
City
Country

и таблицы AddressType

RecordID
AddressTypeDescription

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

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

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

Ответы

Ответ 2

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

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

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

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

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

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

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

Address.AddressType
AddressType.Addresses

Ответ 3

Как подсказывает Кейт, этот article подсказывает, что TPT в шкалах EF ужасно, но я сам не пробовал.

Ответ 4

Найдите эту статью. Рассматриваются некоторые аспекты использования наследования.