EF6 Разделение таблиц против общего первичного ключа для нескольких разделений
Я обновляю унаследованную систему баз данных до.NET + Entity Framework 6 (POCO с первым кодом) + PostgreSQL. Для простоты программирования я хочу разбить большую таблицу (более 200 полей) на несколько объектов, например:
Franchise
FranchiseLegalEntity
FranchiseBilling
FranchiseSignup
FranchiseAllocation
FranchiseCompliance
FranchiseMiscellaneous
FranchiseNotifications
Я был рад обнаружить, что EF6 поддерживает "разбиение таблицы": отображение одной таблицы на несколько объектов для разделения полей.
Однако попытка реализовать это и чтение многих страниц в Интернете подтвердили, что это проблематично при многократном разделении. Для Entity Framework требуются свойства навигации не только к основной сущности, но и между ВСЕМИ сущностями, сопоставленными с таблицей. Для моего сценария, приведенного выше, это потребовало бы 21 бессмысленных навигационных свойств - 42, если я потрудился сделать их двусторонними.
См.: Как разделить большую таблицу на несколько отдельных типов, используя 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 находится под вашим контролем, поэтому вы всегда можете экспортировать только часть данных (скажем, только записи, созданные после определенной даты). Но опять же, это может не сработать для вас из-за огромного количества данных.