"Эффективное" может означает много вещей, но нормализованный способ состоял бы в том, чтобы иметь таблицу Items со всеми возможными элементами и таблицу Sets со всеми наборами и таблицу поиска ItemsSets. Если у вас есть наборы A и B в таблице Sets, запросы, подобные (для этого, для ясности, а не для оптимизации ... также «Set» - плохое имя для таблицы или поля, поскольку это ключевое слово)
SELECT itemname FROM Items i
WHERE i.itemname IN
(SELECT itemname FROM ItemsSets isets WHERE isets.setname = 'A')
AND i.name IN
(SELECT itemname FROM ItemsSets isets WHERE isets.setname = 'B')
Это, например, пересечение A и B (вы можете почти наверняка ускорить это как ОБЪЕДИНЕНИЕ, опять же, «эффективный» может означать много вещей, и вам понадобится архитектура, которая позволяет использовать запрос, например что). Аналогичные запросы могут быть сделаны, чтобы узнать разницу, дополнение, тест на равенство и т. Д.
Теперь я знаю, что вы спросили об эффективности, и это ужасно медленный способ запроса, но это единственный надежный масштабируемый архитектуре для таблиц, чтобы сделать это, и запрос был просто простым, чтобы показать, как создаются таблицы. Вы можете делать всевозможные сумасшедшие вещи, скажем, пересечения кешей или хранить несколько элементов, которые находятся в одном наборе, и обрабатывать это или что у вас есть. Но не надо. Cached информация в конечном итоге будет устаревать; статические ограничения на количество элементов в размере поля будут превзойдены; ad-hoc члены новых кортежей будут неверно истолкованы.
Опять же, «эффективный» может означать много разных вещей, но в конечном итоге информационная архитектура, которую вы, как программист, можете понять и рассуждать, будет наиболее эффективной.
Пример данных поможет –
Пожалуйста, добавьте, что хорошо отформатирован на ваш вопрос. Спасибо. –
Какая СУБД вы используете? Postgres? Oracle? Btw: SQL имеет оператор 'intersect',' except' '' ' –