Как мне эффективно / эффективно создавать полиморфные ассоциации в .NET?
При этом у меня есть несколько более детальных вопросов, которые я бы хотел видеть как часть более широкого ответа.
Технологии
- .NET 4.0
- ASP.NET MVC 3
- MS SQL 2008
- C # (последний),
- ADO.NET Entity Framework / LINQ-to-Entities
Контекст
Я занимаюсь разработкой приложения для потребителя, состоящего из DAL, уровня бизнес-объектов, уровня брокера служб (для служб REST) и, в конечном счете, веб-интерфейсов, планшетов, мобильных устройств и настольных компьютеров.
Это приложение включает в себя сотни продуктов, которые придерживаются различных классификаций. Кроме того, продукты состоят из различных атрибутов, которые также могут быть признаком их более широких классификаций.
* 1 028 * Пример:
«Виджет А» и «Виджет Б» оба красного цвета, поэтому их можно сгруппировать в виде под «Вещи красного цвета». Однако «Widget A» - это игрушечный автомобиль, а «Widget B» - красный велосипед, поэтому , хотя оба они являются красными объектами , они являются объектами различных типов . Как таковые, они могут быть сгруппированы по-разному в других представлениях (например, «Велосипеды», которые показывают красные велосипеды, синие велосипеды и т. Д.).
Цель
Создайте эффективный уровень ядра и сервиса, который будет отзывчивым на вызывающего и легко обслуживаемым.
Что я думаю делать
Чтобы легко управлять всеми этими различными атрибутами и связями, я подумал о создании «глобальной» таблицы атрибутов, в которой атрибуты могли бы регистрироваться для объектов различных типов:
GLOBAL_ATTRIBUTES_TABLE
ID
(int)
ObjectType
(int) - таблица FK to ObjectTypes, которая содержит список типов (например, велосипед, игрушечный автомобиль и т. Д.)
ObjectId
(int) - идентификатор объекта в его собственной таблице (например, «Таблица велосипедов»)
AttributeType
(int) - таблица FK to AttributeTypes, которая содержит различные типы атрибутов (например, «Цвет», «Материал», «Возрастная группа»).
AttributeId
(int) - идентификатор атрибута в его собственной таблице (например, "Таблица цветов")
Таким образом, в идеале столбцы 3 и 5 (ObjectId
и AttributeId
) должны иметь внешний ключ динамический таблицы, соответствующий их типам.
Я думаю, что это сделает поиск быстрым, построение модели более простым и менее подробным (с точки зрения кода), упростит добавление будущих атрибутов и типов объектов, упростит обслуживание и т. Д.
Вопросы
Является ли это приемлемым или хорошим методом для подражания (в отличие от создания, например, таблицы продуктов, таблицы серии и т. Д. Со списком столбцов длиной в милю)?
Есть ли способ выполнить динамические внешние / полиморфные ассоциации в .NET без простого создания запроса, построения модели с результатами, запроса этой модели и т. Д .?
Есть ли другие предложения по улучшению архитектуры данных?