Мне нравится иметь несколько таблиц, которые представляют необработанные данные, поэтому в этом случае у вас будет
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 в первом столбце, с помощью очень простых запросов.
Перейдите по этой ссылке, чтобы узнать дополнительную информацию.
person
digiguru
schedule
07.09.2008