Примеры для Entity Framework 4: Отображение POCO в базу данных EAV? - PullRequest
8 голосов
/ 29 сентября 2010

Наш клиент рекламирует товары, но их характеристики сильно отличаются друг от друга. Продуктовых «классов» почти столько же, сколько и продуктов.

Первоначально мы создали базу данных EAV, в которую добавляли и удаляли атрибуты для каждого «класса» продукта. Все это работает очень хорошо, но сложность сводит с ума. Это база данных № 1.

Мы наконец-то придумали набор общих полей для представления всех продуктов (POCO), переместив «лишние» поля в поле XML «перехватить все». Это база данных № 2.

Теперь у нас есть клиенты, использующие старые, и некоторые клиенты, которые будут использовать новые. Мы действительно не хотели обновлять старую версию, пока нам не потребовалось это сделать, но время от времени у нас бывают изменения, которые просто требуют больше времени, чем необходимо, из-за структуры EAV.

Вопросы:

  1. Есть ли какие-нибудь примеры того, как кодировать EF для сохранения POCO в базах данных EAV (где у вас есть таблица имен полей и таблица данных)?
  2. Должны ли мы просто отбросить базу данных и написать «нормальные» таблицы для всех этих старых клиентов, учитывая, что время от времени у нас происходят изменения?

Нормальный, конечно, относится к нормальной форме Бойса Кодда.
Мы обработали старую базу данных, применив ее структуру к программному обеспечению, а затем сопоставив ее с POCO в хранилище.

1 Ответ

10 голосов
/ 30 сентября 2010

Таблицы EAV, как правило, беспорядочные, и Джо Селко (в Избежание EAV разрушения ) и многие другие эксперты отрасли (например, Пять простых ошибок проектирования баз данных, которых следует избегать ) справедливо предупреждаю против использования конструкций EAV слишком много.

За исключением всех критиков базы данных: как будет выглядеть объект в .NET, основанный на таком EAV, ??Он может иметь любое количество свойств любого типа, поэтому, по сути, это должен быть «универсальный» объект, который может принимать любую форму, в значительной степени.

Эта мысль заставляет мою кожу ползать и идет вразрез сбольшинство основных понятий строго типизированного языка - да, вы можете делать такие вещи на динамическом языке, таком как Ruby и Python, но в C #?

Единственная жизнеспособная опция, которая у вас есть, может прийти с новым «динамическим» типом в .NET 4.0 и ExpandoObject - объектом, который может принимать любую форму, иметь любые свойства любого типа и в основном быть тем, кем выхочу, чтобы это было.

Вы можете представить себе соответствие между структурой EAV в SQL Server и ExpandoObject в C # 4.0 - но я очень сомневаюсь, что команда EF что-то сделала в этом отношении, и, честно говоря, я не думаю, что они это сделаютв любое время скоро.Но это может быть возможностью для вас.

Информацию о ExpandoObject см. В

...