У меня есть список продуктов {P1, P2, ...}, каждый из которых может иметь список атрибутов {a1, a2, ...}.Какой самый быстрый алгоритм, чтобы найти все элементы, НЕ имеющие некоторые атрибуты, скажем, {a2, a6, a10}?
Если P1 = {a1, a2, a3} P2 = {a3} P3 = {a1, a4}, алгоритм должен вернуть {P2, P3}
Проблема в том, что я неНе знаю, входной список атрибутов, как это передается пользователем.Список продуктов и связанные с ними атрибуты хранятся в базе данных:
Таблица продуктов (более 10000 строк)
ProductID int,
ProductName varchar
Таблица атрибутов (около 400 строк, может увеличиться вбудущее)
AttributeID int,
AttributeName varchar
Таблица Product_Attribute_Association
ProductID int,
AttributeID int
У меня есть следующий запрос:
SELECT p.ProductID, p.ProductName
FROM Product p
WHERE p.ProductID NOT IN
(SELECT pa.ProductID FROM Product_Attribute_Association pa
WHERE pa.AttributeID NOT IN (1, 4, 5) -- What ever being passed in
) t
Этот сервис получит довольно сильный удар, и я думаю о кешированииданные из 3 таблиц в памяти в некоторой структуре данных и написать эффективный алгоритм для поиска.Можете ли вы предложить что-то, что я должен изучить?Спасибо
РЕДАКТИРОВАТЬ: Обновление базы данных не является проблемой.Кэш будет восстанавливаться из базы данных каждый час, поэтому время, в течение которого создается кеш, не имеет значения.
Память также не имеет значения.