lunes, 8 de agosto de 2016

¿SQL vs NoSQL?

¿SQL o NoSQL? Una pregunta muy recurrente cuando nos encontramos iniciando en el maravillo mundo de las bases de datos, es muy probable que si ya haz tenido un encuentro con este mundo haya sido a través de las base de datos relacionales. Pero ¿qué ese exactamente una Base de datos relacionases? ¿Por qué existe bases de datos No relacionales? y ¿Por qué son tan populares hoy en día?
Dentro del mundo de bases de datos nos topamos con dos grandes vertientes, las bases de datos relacionases y las no relacionales. Las primeras son las bases de datos que todo el mundo conoce, si vas a almacenar datos de tu aplicación en automático pensamos en tablas, columnas, tuplas, relaciones y algunos gestores como MySql. Las bases de datos relacionases tiene como principal características almacenar los datos agrupados por contexto en algo llamado tablas, cada tabla debe de tener una o más relaciones con otras, las relaciones nos permitirán conectar todos los datos entre si.
Dependiente del problema en el que nos encontremos podemos aplicar diferentes niveles de normalización. La normalización nos permite a nosotros como arquitectos de la base de datos (los que vamos a modelar nuestra base de datos) eliminar la redundancia de datos que pueda existir, proteger la integridad de datos y claro permitir su fácil mantenimiento.
Existen 5 niveles de normalización y claro no todos son aplicables a todos los problemas. Cuando nos encontremos diseñando nuestra base de datos siempre debemos de pensar en el costo computacional que conllevará obtener los datos de regreso, eso implica que nuestro nivel de abstracción debe de ser muy bueno, no es lo mismo crear una tabla nueva y agregar una relación más a tener una tabla que se relacione con ella misma y realizar una consulta recursiva,
La forma con la que nosotros podemos trabajar con los datos que almacenamos en nuestra base de datos es mediante un lenguaje de consultas, si nos encontramos trabajando con bases de datos relacionases el lenguaje por excelencia es SQL (Structured Query Language). SQL nos permite trabajar con las relaciones entre tablas, es decir combinar tablas de una forma muy fácil gracias a su base de teoría de conjuntos (Joins).
Las base de datos relacionases sin dudas es un mundo muy complejo e interesante.
Existen diferentes manejadores de bases de datos que utilizan le lenguaje SQL, dentro de los más populares por mencionar algunos encontamos a :
  • Mysql
  • PostgresSql
  • Oracle
  • Microsoft Sql
  • Sqlite
Es muy probable que ya hayamos trabajado con alguno de ellos.

NoSQL

Ok, con esta pequeña introducción de base de datos relacionases pasemos a las no relacionases o mejor conocidas como NoSql o Not only Sql, ya teniendo en cuenta su contraparte será más fácil de explicar que son estas “nuevas” bases de datos.
Las bases de datos no relacionases o no Sql como su nombre lo indica son bases de datos que no se rigen por tener los datos relacionados entre si, esto conlleva a que no exista una normalización en si y claro que no se utilice la teoría de conjuntos tan fuertemente como lo haríamos en las relacionales.
Partiendo que existen poco más de 150 bases de datos NoSql y que cada una tiene su forma de trabajar con datos, es un poco complicado explicar todas sus características, sin embargo dentro de este mundo tenemos similitudes, podemos agrupar ellas.
Almacenamiento de datos.
  • Orientado a Documentos (MongoDB, CouchDB , ToroDB, RaptorDB etc …)
  • Orientado a Columnas ( Cassandra, Hadoop, MonetDB etc…)
  • Almacenamiento Clave Valor (Redis, RocksDB, BoltDB etc.. )
  • Almacenamiento de Grafos (Neo4j, TITAN, WhiteDB etc… )
Lenguaje de consultas.
Bien ya nos damos una idea de como estas base de datos manejan los datos, pero ¿cómo puedo realizar las consultas si ahora no tengo a SQL? bien la respuesta es simple, para la mayoría de los casos utilizaremos Java Script, ese lenguaje de programación que se encuentra del lado del cliente ( a veces en el servidor) es el que nos permitirá realizar las consultas para la obtención de datos.
Datos semi estructurados.
Otra de las características de las bases de datos no relacionases es que a diferencias de las relacionases estas no requieren un schema para trabajar, es decir no se requiere una “plantilla” en la cual los datos sepan en que parte deben de almacenarse, con que tipo de valor y bajo que condiciones deben de almacenarse.
Dentro de una registro a otro pueden existir atributos completamente diferentes, atributos que pueden o no existir en otros registros. Hablemos con un ejemplo, supongamos que tengo tengo la necesidad de almacenar prospectos de mi tienda en linea, los datos que me interesan son los de contacto, sabemos que pueden ser muchos, múltiples correos, números telefónicos, páginas web, direcciones, sabemos de igual forma que no todos nuestros prospectos pueden tener números telefónicos o pueden tener más de uno. Soluciones:
En base de datos relacionases tendríamos que realizar un universo de medios de contactos, y dependiendo del nivel de normalización pudiéramos tener diferentes tablas para cada tipo de medio de contacto, una relación uno a muchos y claro un super tipo.
Cuando nos encontremos con este tipo de base de datos debemos de olvidarnos de gran parte de la planificación que tendremos al momento de maquetar esta.
En base de datos no relaciones es algo más sencillo, pongamos el ejemplo con MongoDB, basta con crear un documento donde se almacenen los medios de contactos y si tienen o no muchos medios de contactos se almacenan, si no, simplemente no, Algo así:
{
 'direcciones' : []
 'telefonos': [
  { número: 12341234, ext: 123 },
  { número: 55566777, ext: 456 },
  { número: 55566777, },
 ]
 'correos' : [
  {'test@test_dos.com'}
 ]
}
*Dejo el arreglo de direcciones para comprender más el ejemplo.
vemos que los teléfonos pueden o no tener extensión, cosa que en las bases de datos relacionases pudiéramos tener campos nulos. pueden o no existir correos al igual que direcciones, si contiene esta bien, si no las contiene de igual forma esta bien.
Si te interesa aprender bases de datos no relacionales ahora tenemos un curso de MongoDB completamente gratis en Código Facilito, Curso Mongo
Cuando nos encontremos con este tipo de base de datos debemos de olvidarnos de gran parte de la planificación que tendremos al momento de maquetar esta.
Optimización de consultas.
Las ventajas de utilizar NoSql es que nos permiten obtener datos con un costo computacional mucho menor que utilizando Sql, como ustedes pueden ver en el ejemplo los datos se encuentran en el mismo documento y no existen atributos que no contengan un valor, si no que todos los datos que están allí tienen una función, además que el equipo de computo que necesitemos para nuestro servidor puede no contener especificaciones de hardware tan altas.
Real time.
La mayoría de este tipo de base de datos nos permiten trabajar con los datos en tiempo real y eso claro esta más que genial.
Un comercial más, tenemos un taller de tiempo real con Redis y la arquitectura PUBSUB Aquí por si te interesa, Taller redis.

¿Cuándo debo de utilizar una base de datos Sql o Cuándo uno NoSql?

Bien ahora viene la pregunta obligada.
Me centraré en la capacidad que tienen ambos tipos de base de datos para poder adaptarse a los cambios ya que la consideró la parte más importante a la hora de tomar una decisión.
Ambos tipos de bases de datos nos permiten realizar escalabilidad, así que por ese tema están bien.
Para lo que no sepan la escalabilidad es el termino que usamos cuando necesitamos hacer que nuestra base de datos tenga el mismo o un mejor rendimiento cuando existan ciertos problemas en el entorno, el mayor problema que existe es la generación de datos de una forma muy rápida, algo que quizás no hayamos contemplado al iniciar el proyecto. La escalabilidad podemos dividirla en dos grandes vertientes,
Horizontal y Vertical, siendo la primera el ingreso de software al equipo de computo para que este mantenga o mejore el performance ante estos problemas, por otro lado la escalabilidad vertical se trata de ingresar nuevos equipos de computo a la red para que se distribuya la información y cada equipo trabaje en cosas más especificas.
Por otro lado tenemos que nuestros proyectos pueden crecer muy rápidamente lo que implica poder realizar cambios constante, en ambos casos es posible realizar modificaciones en producción.
Si bien una base de datos relacional bien normalizada nos permite realizar modificaciones muy fácil al momento de insertar nuevos datos, en muchas ocaciones las obtención de datos es su lado débil, la comprensión se vuelve más difícil y los joins que debemos de realizar son complicados de manejar, realizar joins a una tabla con miles de registros es un grabe problemas de performance que no se debe tomar a la ligera,.
Por otro lado las base de datos no relaciones como ya hemos visto nos permiten almacenar datos si y solo si los necesitaremos, los cambios son más sencillos de realizar, el problema aquí es que no podemos almacenar todos nuestros datos en una sola colección (grafo, tupla, diccionario) y al no tener relaciones entre ellas debemos de ingeniárnosla para obtener los datos, es decir debemos de crear nuestros propios joins.
Y el punto más importante, si estamos generando datos debemos tener en cuenta si los datos los necesitamos almacenarlos de una forma estructurada. Si es así no hay forma, siempre usaremos Sql en caso contrario NoSql. Quizás necesitemos un par de reportes, una par de gráficas tener muy separados los datos o quizás no.
Es importante tener esto muy en cuenta antes de comenzar el proyecto.
Por ultimo considero el real time como un punto de suma importancia, no en todos los proyectos son necesarios, pero si fuera el caso, podemos apoyarnos en alguna base de datos NoSql.

No hay comentarios:

Publicar un comentario