EF6 Разделение таблиц против общего первичного ключа для нескольких разделений

Я обновляю унаследованную систему баз данных до.NET + Entity Framework 6 (POCO с первым кодом) + PostgreSQL. Для простоты программирования я хочу разбить большую таблицу (более 200 полей) на несколько объектов, например:

Franchise
FranchiseLegalEntity
FranchiseBilling
FranchiseSignup
FranchiseAllocation
FranchiseCompliance
FranchiseMiscellaneous
FranchiseNotifications

Я был рад обнаружить, что EF6 поддерживает "разбиение таблицы": отображение одной таблицы на несколько объектов для разделения полей.

Однако попытка реализовать это и чтение многих страниц в Интернете подтвердили, что это проблематично при многократном разделении. Для Entity Framework требуются свойства навигации не только к основной сущности, но и между ВСЕМИ сущностями, сопоставленными с таблицей. Для моего сценария, приведенного выше, это потребовало бы 21 бессмысленных навигационных свойств - 42, если я потрудился сделать их двусторонними.

См.: http://social.msdn.microsoft.com/Forums/en-US/0f65caae-8a66-431f-aa02-4b2c68f871e9/ef-41-rc-code-first-split-one-table-into-multiple-entities?forum=adodotnetentityframework

См.: Как разделить большую таблицу на несколько отдельных типов, используя EF-Code-First

Рекомендуется использовать несколько таблиц с общим первичным ключом, для меня это вариант. Однако, учитывая раздутую генерацию SQL-запросов EF и оптимизатор случайных запросов PostgreSQL со сложными запросами, у меня есть опасения по поводу производительности этой опции (100 ГБ + база данных).

Подвести итоги:

Разделение таблицы

Плюсы: лучшая производительность запросов, быстрая реализация на уровне базы данных

Минусы: загрязнение моих моделей и метода OnModelBuilding() дерьмом, сбивающее с толку других разработчиков

Общие первичные ключи для нескольких таблиц

Плюсы: чистые модели и код, рекомендуемое решение для устаревших баз данных

Минусы: дополнительная работа для реализации, потенциально более низкая производительность

Мои вопросы:

1) Улучшил ли EF6 разделение таблицы с помощью 2+ разделений?

2) Есть ли факторы, которые я не учел?

3) Есть ли другие варианты?

PS Я не заинтересован в использовании [ComplexType]

2 ответа

Решение

Решение, на котором я остановился - это опция разделения таблицы.

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

Я изложил решение более подробно (включая код) в этой теме:

EF6 не удалось построить модель для Table Split/Shared Primary Key + Базовый класс?

С большим количеством предположений вы можете попытаться BCP-вывести необходимые подмножества полей и BCP-в них обратно к нужным таблицам БД. Это простой и повторяемый процесс, поскольку оператор SQL BCP-out находится под вашим контролем, поэтому вы всегда можете экспортировать только часть данных (скажем, только записи, созданные после определенной даты). Но опять же, это может не сработать для вас из-за огромного количества данных.

Другие вопросы по тегам