Формально нехай s ( U , Q ) = { V | V ∈ U і V ⊆ Q }, де U , Q і V всі являють собою множини, а U , більш конкретно, являє собою набір множин. Для прикладу, U може бути набором (наборів) інгредієнтів, необхідних для різних рецептів у кулінарній книзі з Q, що представляє собою набір інгредієнтів, у мене V, що представляє рецепт, який я міг би скласти з цими інгредієнтами. Запит s ( U , Q) відповідає на запитання "Що все я можу зробити з цими інгредієнтами?"
Що я шукаю, це представлення даних, яке індексує U таким чином, що воно підтримує ефективні запити s ( U , Q ), де Q і всі члени U , як правило, невеликі порівняно з об'єднанням усіх членів U . Крім того, я хотів би, щоб він міг ефективно оновити U (наприклад, додати або видалити рецепт).
Я не можу не стверджувати, що цю проблему треба добре зрозуміти, але я не зміг знайти її ім’я чи посилання. Хтось знає про стратегію ефективного вирішення цього питання або про місце, де я можу прочитати більше про нього?
Наскільки думати про рішення, один думав , що я повинен був побудувати дерево рішень для безлічі U . На кожному вузлі дерева питання "чи містить ваш список інгредієнтів х ?" буде запропоновано з x, вибраним для максимізації кількості членів U, які усуваються у відповідь. По мірі того, як U оновлюється, це дерево рішень потрібно буде знову збалансувати, щоб мінімізувати кількість питань, необхідних для пошуку правильного результату. Інша думка полягає в тому, щоб зобразити U з чимось на зразок n -вимірної булевої 'octree' (де n - кількість унікальних інгредієнтів).
Я вважаю, що "Які рецепти можна зробити з цими інгредієнтами?" можна відповісти, взявши декартовий продукт (набір інгредієнтів, необхідних для) рецептів у кулінарній книзі з набором інгредієнтів, який є, та фільтруючи отримані впорядковані пари для пар, у яких обидва елементи рівні, але це не ефективне рішення, і про що я запитую - це оптимізація такого роду операцій; як би скласти це в SQL, щоб воно було ефективним, і що робить SQL, що дозволяє зробити це ефективним?
Хоча я використовую ілюстрацію кулінарної книги рецептів та набору інгредієнтів, я передбачаю, що кількість "рецептів" та кількість "інгредієнтів" будуть дуже великими (до сотень тисяч кожен), хоча кількість інгредієнтів у даному рецепті і кількість інгредієнтів у даному наборі інгредієнтів буде відносно невеликим (ймовірно, приблизно 10-50 для типового "рецепту" і приблизно 100 для типового "набору інгредієнтів"). Крім того, найпоширенішою операцією буде запит s ( U , Q ), тому він повинен бути найбільш оптимальним. Це також означає, що алгоритм грубої сили, який вимагає перевірити кожен рецепт або діяти над кожним інгредієнтом, сам по собі буде небажаним повільним. Із розумним кешуванням,