Vem da perspectiva do big data. Basicamente, muitas estruturas (como o Apache Spark) "compensam" a falta de operações relacionais, fornecendo interfaces do tipo Functor / Monad e há um movimento semelhante em relação às conversões de gatos para SQL (Slick in Scala). Por exemplo, precisamos de junção natural (assumindo que não há repetições nos índices) para multiplicar elementos de vetores da perspectiva SQL, que pode ser considerada como zip + map(multiply)
(o MLib do Spark, no entanto, já possui ElementwiseProduct
) nas aplicações da Teoria da Categoria.
Simplesmente dizendo (os seguintes exemplos estão em Scala):
a subcaixa referenciada de junção pode ser pensada como um functor aplicativo (sobre coleção ordenada), que por sua vez nos fornece
zip
:List(1,2,3).ap(List(2,4,8).map(a => (b: Int) => a * b))
->(List(1,2,3) zip List(2,4,8)).map(x => x._1 * x._2)
. Além disso, podemos induzi-lo a outras junções, assumindo algum pré-processamento (groupBy
operador ou apenas rejeição, ou geralmente - um epimorfismo).outras junções e seleção podem ser pensadas como mônada. Por exemplo,
WHERE
é apenas:List(1,2,2,4).flatMap(x => if (x < 3) List(x) else List.empty)
->List(1,2,2,4).filter(_ < 3)
os dados em si são apenas ADT (GADT também?), que, por sua vez, se parece com uma simples categoria Set (ou, de um modo geral, fechado por Cartesiano), portanto deve (suponho) cobrir operações baseadas em Set (devido a Curry- Howard-Lambek em si) e também operações como
RENAME
(pelo menos na prática).agregação corresponde a
fold/reduce
(catamorfismo)
Então, o que estou perguntando é: podemos construir um isomorfismo entre (talvez um subconjunto da) teoria das categorias e (todo) a álgebra relacional ou há algo descoberto? Se funcionar, que "subconjunto" exato de categorias é isomórfico para relalgebra?
Você pode ver que minhas próprias suposições são bastante amplas, enquanto soluções formais como a correspondência de Curry-Howard-Lambek para lógica-gatos-lambda são mais precisas - então, na verdade, estou pedindo uma referência a um estudo realizado (que mostra uma relação direta ) com mais exemplos em Scala / Haskell.
Edit : a resposta aceita me fez pensar que eu fui longe demais representando junções e condições como uma mônada (especialmente usando um valor vazio que efetivamente instancia FALSE), acho que retrocessos devem ser suficientes pelo menos para o subconjunto relalgebra do SQL. Mônadas são melhores para coisas de ordem superior (agrupamento), como GROUP BY, que não faz parte do relalgebra.