Formalmente, s ( U , Q ) = { V | V ∈ U e V ⊆ Q } dove U , Q e V rappresentano tutti gli insiemi e U , più specificamente, rappresenta un insieme di insiemi. Per fare un esempio, U potrebbe essere un insieme di (insiemi di) ingredienti richiesti per varie ricette in un libro di cucina con Q che rappresenta l'insieme di ingredienti che ho V che rappresenta una ricetta che potrei fare con quegli ingredienti. La query s ( U , Q) corrisponde alla domanda "Cosa posso fare con questi ingredienti?"
Quello che sto cercando è una rappresentazione dei dati che indicizzi U in modo tale da supportare query efficienti di s ( U , Q ) in cui Q e tutti i membri di U saranno generalmente piccoli rispetto all'unione di tutti i membri di U . Inoltre, vorrei che fosse in grado di aggiornare U in modo efficiente (ad esempio, aggiungere o rimuovere una ricetta).
Non posso fare a meno di pensare che questo problema debba essere ben compreso, ma non sono stato in grado di trovare un nome o un riferimento per esso. Qualcuno conosce una strategia per risolverlo in modo efficiente o un posto dove posso leggere di più al riguardo?
Per quanto riguarda pensare a una soluzione, un pensiero che avevo era quello di costruire un albero decisionale per il set di U . Ad ogni nodo dell'albero, la domanda "l'elenco degli ingredienti contiene x ?" verrebbe chiesto con x scelto per massimizzare il numero di membri di U che vengono eliminati dalla risposta. Man mano che U viene aggiornato, è necessario riequilibrare questo albero decisionale per ridurre al minimo il numero di domande richieste per trovare il risultato corretto. Un altro pensiero è quello di rappresentare U con qualcosa di simile a un 'ottetto' booleano n- dimensionale (dove n è il numero di ingredienti unici).
Credo che "Quali ricette possono essere fatte con questi ingredienti?" si può rispondere prendendo il prodotto cartesiano delle (serie di ingredienti richieste per) le ricette nel ricettario con il powerset degli ingredienti che si hanno e filtrando le coppie ordinate risultanti per coppie in cui entrambi gli elementi sono uguali, ma questo non è un soluzione efficiente, e quello che chiedo è come ottimizzare questo tipo di operazione; come si potrebbe comporre questo in SQL in modo tale che sia efficiente e cosa fa SQL che consente di renderlo efficiente?
Anche se utilizzo l'illustrazione di un ricettario di ricette e una serie di ingredienti, prevedo che il numero di "ricette" e il numero di "ingredienti" saranno molto grandi (fino a centinaia di migliaia ciascuno), sebbene il numero di ingredienti in una data ricetta e il numero di ingredienti in un determinato set di ingredienti sarà relativamente piccolo (probabilmente circa 10-50 per una tipica "ricetta" e circa 100 per un tipico "set di ingredienti"). Inoltre, l'operazione più comune sarà la query s ( U , Q ), quindi dovrebbe essere la più ottimale. Ciò significa anche che un algoritmo a forza bruta che richiede il controllo di ogni ricetta o il funzionamento su ogni ingrediente sarebbe indesiderabilmente lento da solo, tuttavia. Con una cache intelligente,