Open guilleiguaran opened 5 years ago
Cuando diseñamos aplicaciones complejas lo que hacemos es contruir niveles de abstraccion sobre otros niveles de abstraccion de mas bajo nivel tratando cada vez de ocultar la complejidad de nuestras aplicaciones a travez de APIs; estas abstracciones permiten que diferentes grupos de personas trabajen efectivamente usando un mismo "lenguaje" ubicuo, en este caso los lenguajes de las bases de datos permiten que los desarrolladores de una aplicacion puedan trabajar con los ingenieros de una base de datos usando un mismo lenguaje.
En este capitulo se trabajara sobre los diferentes modelos de datos (SQL, NoSQL, Grafos entre otros) y sus lenguajes para consulta de datos (Query Languages)
El mejor ejemplo y mas conocido sobre el Modelo Relacional son las bases de datos SQL basados en el modelo relacional de Edgar Codd en donde los datos estan organizados en relaciones llamadas tablas (tables) en SQL y cada relacion es una coleccion the tuplas sin orden llamadas filas (rows). a mediados los 80s las bases de datos relacionales fueron las herramientas predilectas de la mayoria de personas y projectos que requerian almacenar datos relacionales que tuvieran cierta estructura y desde entonces su predileccion ha durado cerca mas de 25 años.
La preferencia sobre las bases de datos relacionales nace a rason de que en los años 60s y 70s otros modelos de base de datos obligaban a los desarrolladores de aplicaciones a pensar sobre la representacion interna de los datos mientras que el modelo relacional oculta esta representacion a travel de un lenguaje declarativo con el cual se pueden explorar los datos de una manera mas corta y conciza dejando que el motor de busqueda decida como recorrer los datos, optmizar consultas, alamcenamiento y muchas mas cosas.
NoSQL nace en el 2010 cuando alguien le puso un titulo llamativo a su charla para un meetup sobre bases de datos no relaciones y que fuera tendencia en twitter para que a la gente le diera curiosidad saber que era eso de NoSQL pero en realidad significa No Solo SQL (Not Only SQL) y no hace referencia a alguna tecnologia.
El movimiento NoSQL esta impulsado por la necesidad de una escalabilidad mucho mas grande que de lo que las bases de datos relacionales nos pueden brindar (tanto en tamaño de datos como en cantidad de escrituras), una gran variedad de productos de codigo libre (OpenSource) sobre base de datos comerciales y costosas y lo restrictivo que podrian llegar a ser los esquemas relacionales ofreciendo modelos de datos sin esquemas y mas expresivos aunque hoy en dia muchas de estos modelos relacionales an adoptado algunos de attributos de los modelos no relacionales como por ejemplo soporte para documentos JSON.
En la actualidad muchas aplicaciones usan lenguajes basados en objetos para modelar sus dominios, el problema radica en la discordancia que existe para mapear esos objectos y sus relaciones a una base de datos relacional, donde normalmente solo se tienen tablas, filas y columnas, es alli donde nacen herramientas complicadas que ayudan hacer la traduccion de estos objectos y sus relaciones a lenguaje SQL, estas herramientas son llamados ORMs o Object Relational Mapping pero no pueden ocultar por completo todas las differencias que existen entre ambos modelos.
Por lo general las bases de datos no relacionales optan por una representacion de los datos en lenguaje JSON, en este caso hablaremos de las base de datos basadas en documentos (Document Data Bases), las cuales pueden representar varios pros y contras como por ejemplo:
PROS:
CONS:
SQL fue introducido como un lenguage de datos declarativo que fue desarrollado siguiendo la misma estructura que el algebra relacional, en este se describe el objetivo de la consulta, los patrones deseados y como transformar los datos, mas no los pasos para llegar a ella, ocultando asi los detaller de la implementacion lo cual permite que los motores de busqueda que han sido el resultado de decadas de investigacion para optimizar esas consultas sean los encargados de escoger como ejecutar la instruccion; por otro lado los lenguajes imperativos describen una serie de pasos ordenados de como realizar una consulta usando estructuras de control de flujo que ya se conocen de la programacion, e.g condicionales, ciclos y actualizacion de variables, pero esto hace casi imposible que el motor de la base de datos haga optimizaciones sobre el codigo sin romper la consulta. otras diferencias son:
MapReduce es un modelo de programacion de bajo nivel para el procesamiento de datos en grupos a gran escala, donde pueden ser utilizadas muchas maquinas (un cluster) de forma distribuida gracias a su facilidad de paralelizacion y distribucion. Este modelo es usado en bases de datos como MongoDB pero solo para hacer busquedas de solo lectura a travez de muchos documentos. Habiendo dicho esto MapReduce no es un lenguaje ni declarativo ni completamente imperativo, ya que a travez de un lenguage declarativo hace filtros sobre los datos recibidos, y usando lenguaje imperativo mapea, modifica y reduce la informacion a los resultados deseados.
MapReduce se define en 2 funciones, una funcion Map que se encarga de transformar los datos y moldearlos a corde se necesitan, y una funcion Reduce que se encarga de acumular y computar el resultado final con los datos mapeados de la funcion Map; ambas funciones son puras, lo que quiere decir que no se puede realizar otras busquedas dentro de ellas ni otro efecto colateral o side effect.
La implementacion de MapReduce de MongoDB dio soporte a un lenguage declarativo para las funciones de Map y Reduce las cuales permiten que, como ya se habia hablado antes, el motor de busqueda pueda optimizar y paralelizar de una mejor manera las operaciones en la base de datos, este lenguage declarativo ha sido llamado "Aggregation Pipeline"
Las relaciones muchos-a-muchos son una funcionalidad importante para distinguir si el modelo de la aplicacion se adapta a un modelo basado en documentos si la aplicacion tiene principalmente relaciones uno-a-muchos, se adapta a un modelo relacional si la aplicacion tiene muchas relaciones simples de muchos-a-muchos, pero en los casos en los que las relaciones comienzan a ser mas complejas, mas anidadas, se vuelva mas natural ver nuestras aplicaciones y sus datos como grafos, donde cada vertice son nuetras entidades y cada conexion o edge son sus relaciones; un ejemplo de aplicaciones que pueden ser moldeadas como grafos son las redes sociales, la web tal y como la conocemos, las redes entre otros usos, ya que los grafos no estan limitados solo a datos homogeneos, el poder de los grafos es la manera consistente en la cual se pueden almacenar todo tipo de datos distintos en un sola base de datos.
Existen varias maneras distintas, pero relacionadas, de organizar y consultar los datos en un grafo como por ejemplo usando Grafos de Propiedades (Property Graphs), Almacenamiento de Tripletas (Triple Store) y varios lenguajes declarativos para consultas en grafos como Cypher, SPARQL y Datalog.
En su mayoria es equivalente al modelo de Grafos de Propiedades pero con distintas palabras; toda la informacion en este modelo es almacenado en 3 partes (Sujeto, Predicado, Objeto) e.g (Jim, likes, Bananas) donde el sujeto es equivalente a un vertice en un grafo, el objecto puede ser un tipo de dato primitivo e.g (Texto, Numero etc) donde el predicado haria las veces de una tupla llave-valor del vertice asociado. U otro vertice en el grafo, donde en ese caso el predicado es una conexion, el Sujeto es el (Tail Vertex) y el Objecto es el (Head Vertex) e.g (lucy, marriedTo, alain)
@sescobb27 excelente overview!
Para agregar algo que tambien menciona el autor es que la linea que separa las DB relacionales y algunas NoSQL se ha hecho cada vez mas delgada en los ultimos años.
Por una parte DBs como Postgres y MySQL ya tienen soporte para almacenar columnas de tipo JSON[1][2] y soportan operaciones sobre estas columnas[3][4] y algunas base de datos NoSQL como RethinkDB soportan joins[5] mientras que otras usan lenguajes de consulta muy similares a SQL como Cassandra que usa CQL[6]
Adicionalmente ya hay algunas DB NoSQL con soporte para transacciones como MongoDB[7] (aunque esto seria algo que habria que examinar posteriormente en detalle porque no todas las DBs que soportan transacciones ofrecen las mismas garantias en estas y todos los vendors usan su propia definicion de ACID)
[1] https://www.postgresql.org/docs/10/datatype-json.html [2] https://dev.mysql.com/doc/refman/8.0/en/json.html [3] https://www.postgresql.org/docs/9.3/functions-json.html [4] https://dev.mysql.com/doc/refman/8.0/en/json-functions.html [5] https://www.rethinkdb.com/docs/table-joins/ [6] http://cassandra.apache.org/doc/latest/cql/dml.html [7] https://www.mongodb.com/transactions
Polyglot persistence el uso de bases de datos relacionales y no-relacionales en un mismo sistema.
Esta semana a cargo: @sescobb27 Siguiente semana: @ricardorojass