Одним из параметров является модель EAV (Entity-Attribute-Value).
Эту модель хорошо применять, если у вас есть один класс в вашем домене, представление таблицы которого приведет к широкой таблице (большое количество столбцов, много нулевых значений)
Первоначально он был разработан для медицинской области, где объекты могут иметь тысячи столбцов (симптомов).
В основном у вас есть
Entity (Id) (например, ваша таблица продуктов)
Атрибут (Id, ColumnName)
Значение (EntityId, AttributeId, значение)
Вы можете иметь несколько дополнительных таблиц метаданных.
Значение должно быть лучше нескольких таблиц, одна для типа.
Например:
ShortStringValue (EntityId, AttributeId, значение nvarchar (50));
LongStringValue (EntityId, AttributeId, значение nvarchar (2048));
MemoValue (EntityId, AttributeId, значение nvarchar (max));
IntValue (EntityId, AttributeId, значение int);
или даже полный тип:
ColorComponentsValue (EntityId, AttributeId, R int, G int, B int);
Одна из вещей из моего опыта заключается в том, что у вас не должно быть EAV для всего. Просто используйте EAV для одного класса, например, Product.
Если вам нужно использовать расширяемость для разных базовых классов, пусть это будет отдельный набор таблиц EAV.
Другое дело, что вы должны придумать разумную стратегию материализации для ваших объектов.
Не сводите эти значения к широкому набору строк, просто измените небольшое количество столбцов для ваших критериев запроса, а затем верните узкую коллекцию строк значений для каждого из выбранных объектов. В противном случае поворот повлечет за собой массовое соединение.
Есть несколько моментов, на которые следует обратить внимание:
, Каждое значение занимает место для хранения внешних ключей
, Например, блокировка на уровне строк будет вести себя иначе для таких запросов, что может привести к снижению производительности.
, Может привести к увеличению размеров индекса.
На самом деле, в тесте с малой глубиной, мое решение EAV превзошло его статический аналог в таблице из 20 столбцов в запросе с 4 столбцами, включенными в критерии.