Как мне эффективно / действенно создавать полиморфные ассоциации в .NET?
При этом у меня есть несколько более подробных вопросов, которые я хотел бы видеть как часть более широкого ответа.
Технологии
Контекст
Я разрабатываю ориентированное на потребителя приложение, состоящее из DAL, уровня бизнес-объектов, уровня брокера служб (для служб REST) и, в конечном итоге, внешних интерфейсов для Интернета, планшетов, мобильных устройств и настольных компьютеров.
Это приложение включает сотни продуктов, которые соответствуют различным классификациям. Кроме того, продукты имеют различные атрибуты, которые также могут быть атрибутом их более широкой классификации.
Пример:
«Виджет A» и «Виджет B» красные, поэтому они могут быть сгруппированы в представлении в разделе «Вещи, которые красные». Однако «Виджет A» - это игрушечный автомобиль, а «Виджет B» - красный велосипед, поэтому , хотя оба они являются красными объектами , они являются объектами разных типов . Таким образом, они могут быть сгруппированы по-разному в других представлениях (например, «Велосипеды», которые будут отображать красные велосипеды, синие велосипеды и т. Д.).
Цель
Создать эффективный уровень ядра и обслуживания, который одновременно реагирует на вызывающего абонента и легко обслуживается.
Что я собираюсь сделать
Чтобы легко управлять всеми этими различными атрибутами и отношениями, я подумал о создании «глобальной» таблицы атрибутов, в которой атрибуты могут регистрироваться для объектов различных типов:
GLOBAL_ATTRIBUTES_TABLE
] ID
(int) ObjectType
(int) - Таблица FK для ObjectTypes, которая содержит список типов (например, велосипед, игрушечный автомобиль и т. Д.) ObjectId
(int) - идентификатор объекта в его собственной таблице (например, «Таблица велосипедов») AttributeType
(int) - FK для таблицы AttributeTypes, которая содержит различные типы атрибутов (например, «Цвет», «Материал», «Возрастная группа») ). AttributeId
(int) - идентификатор атрибута в его собственной таблице (например, «Таблица цветов») Итак, столбцы 3 и 5 ( ObjectId
и AttributeId
) в идеале должен иметь внешний ключ динамический для таблицы, соответствующий их типам.
Я считаю, что это сделает поиск быстрым, построение модели простым и менее подробным (с точки зрения кода), добавление будущих атрибутов и типов объектов, более легким обслуживанием и т. Д.
Вопросы
Это приемлемый или хороший метод для подражания (в отличие от создания, скажем, таблицы продуктов, таблицы серий и т. Д. Со списком столбцов длиной в милю)?
Есть ли способ выполнить динамические / полиморфные внешние ключи ассоциации в .NET без простого запроса, построения модели с результатами, запроса этой модели и т. д.?
Есть ли другие предложения по улучшению архитектуры данных?