Что мне нравится делать, так это иметь несколько таблиц, которые представляют необработанные данные, так что в этом случае у вас будет
Items (ID pk, Name, <properties>)
Tags (ID pk, Name)
TagItems (TagID fk, ItemID fk)
Это работает быстро для времени записи и сохраняет все нормализованным, но вы также можете заметить, что для каждого тега вам нужно будет объединять таблицы дважды для каждого последующего тега, который вы хотите добавить в AND, так что чтение будет медленным.
Решением для улучшения чтения является создание кеширующей таблицы по команде путем настройки хранимой процедуры, которая по существу создает новую таблицу, которая представляет данные в плоском формате ...
CachedTagItems(ID, Name, <properties>, tag1, tag2, ... tagN)
Затем вы можете подумать, как часто необходимо обновлять таблицу Tagged Item, если она присутствует при каждой вставке, а затем вызвать хранимую процедуру в событии вставки курсора. Если это почасовая задача, то настройте почасовую работу для ее запуска.
Теперь, чтобы быть действительно умным в поиске данных, вам нужно создать хранимую процедуру для получения данных из тегов. Вместо того, чтобы использовать вложенные запросы в массивном выражении case, вы хотите передать один параметр, содержащий список тегов, которые вы хотите выбрать из базы данных, и вернуть набор записей Items. Это было бы лучше в двоичном формате, используя побитовые операторы.
В двоичном формате это легко объяснить. Скажем, есть четыре тега, которые должны быть назначены элементу, в двоичном виде мы могли бы представить, что
0000
Если все четыре тега назначены объекту, объект будет выглядеть следующим образом ...
1111
Если только первые два ...
1100
Тогда это просто случай поиска двоичных значений с единицами и нулями в столбце, который вы хотите. Используя побитовые операторы SQL Server, вы можете проверить наличие 1 в первом столбце, используя очень простые запросы.
Проверьте эту ссылку, чтобы узнать больше .