Ignorando, por el momento, la parte SQL del problema, el algoritmo que usaría es bastante simple:comience tomando cada palabra en su diccionario y produciendo una versión con las letras en orden, junto con un puntero hacia atrás a la versión original de esa palabra.
Esto daría una tabla con entradas como:
sorted_text word_id
act 123 /* we'll assume `act` was word number 123 in the original list */
act 321 /* we'll assume 'cat' was word number 321 in the original list */
Luego, cuando recibimos una entrada (digamos, "tac"), ordenamos sus letras, las buscamos en nuestra tabla de letras ordenadas unidas a la tabla de palabras originales, y eso nos da una lista de las palabras que se pueden crear a partir de esa entrada.
Si yo estuviera haciendo esto, tendría las tablas para eso en una base de datos SQL, pero probablemente usaría algo más para preprocesar la lista de palabras en la forma ordenada. Del mismo modo, probablemente dejaría la clasificación de las letras de la entrada del usuario a lo que sea que estuviera usando para crear el front-end, por lo que SQL se quedaría para hacer lo que es bueno:la gestión de bases de datos relacionales.