Las 11 mejores bases de datos de código abierto para su próximo proyecto

Los datos lo son todo. Y por extensión, también lo son las bases de datos. Aquí hay algunas fantásticas opciones de código abierto para su próximo proyecto increíble..


Para un mundo dominado durante tanto tiempo por trajes de bases de datos como Oracle y SQL Server, parece que ahora hay un sinfín de soluciones. Una parte de la razón es la innovación impulsada por Open Source: desarrolladores realmente talentosos que desean rascarse una picazón y crear algo en lo que puedan deleitarse.

La otra parte es la aparición de nuevos modelos de negocio, en los que las empresas mantienen una versión comunitaria de su producto para ganar participación mental y tracción, al tiempo que proporcionan una oferta comercial complementaria..

El resultado?

Más bases de datos de las que uno puede seguir. No hay estadísticas oficiales sobre esto, pero estoy bastante seguro de que tenemos más de cien opciones disponibles hoy si combina todo, desde bases de datos de objetos específicos de la pila hasta proyectos no tan populares de universidades.

Lo sé, también me asusta. Demasiadas opciones, demasiada documentación para recorrer, y una vida que es tan corta. ��

Es por eso que decidí escribir este artículo, presentando diez de las mejores bases de datos que puede usar para mejorar sus soluciones, ya sea construyendo para usted u otros.

No MySQL

Tenga en cuenta que esta lista no contendrá MySQL, aunque podría decirse que es la solución de base de datos de código abierto más popular que existe..

¿Por qué? Simplemente porque MySQL está en todas partes: es lo que todo el mundo aprende primero, es compatible con prácticamente todos los CMS o framework, y es muy, muy bueno para la mayoría de los casos de uso. En otras palabras, MySQL no necesita ser “descubierto”. ��

Dicho esto, tenga en cuenta que las siguientes no son necesariamente alternativas a MySQL. En algunos casos, pueden serlo, mientras que en otros son una solución completamente diferente para una necesidad completamente diferente. No se preocupe, ya que también hablaré sobre sus usos..

Nota especial: compatibilidad

Antes de comenzar, también debo mencionar que la compatibilidad es algo que debe tener en cuenta. Si tiene un proyecto que, por el motivo que sea, solo admite un motor de base de datos en particular, sus opciones están prácticamente analizadas..

Por ejemplo, si está ejecutando WordPress, este artículo no le será de utilidad. �� Del mismo modo, aquellos que ejecutan sitios estáticos en JAMStack no ganarán nada al buscar alternativas demasiado en serio.

Depende de usted averiguar la ecuación de compatibilidad. Sin embargo, si tiene una pizarra en blanco y la arquitectura depende de usted, aquí hay algunas recomendaciones interesantes.

PostgreSQL

Si eres de la tierra PHP (WordPress, Magento, Drupal, etc.), entonces PostgreSQL te sonará extraño. Sin embargo, esta solución de base de datos relacional existe desde 1997 y es la mejor opción en comunidades como Ruby, Python, Go, etc..

De hecho, muchos desarrolladores eventualmente se “gradúan” a PostgreSQL por las características que ofrece, o simplemente por la estabilidad. Es difícil convencer a alguien en una breve reseña como esta, pero piense en PostgreSQL como un producto cuidadosamente diseñado que nunca lo defraudará.

Hay muchos buenos clientes SQL disponibles para conectarse a la base de datos PostgreSQL para administración y desarrollo.

Características unicas

PostgreSQL tiene varias características fascinantes en comparación con otras bases de datos relacionales (específicamente, MySQL), como:

  • Tipos de datos integrados para matriz, rango, UUID, geolocalización, etc..
  • Soporte nativo para almacenamiento de documentos (estilo JSON), XML y almacenamiento de valores clave (Hstore)
  • Replicación sincrónica y asincrónica
  • Programable en PL, Perl, Python y más
  • Búsqueda de texto completo

Mis favoritos personales son el motor de geolocalización (que elimina el dolor al trabajar con aplicaciones basadas en la ubicación; intente encontrar todos los puntos cercanos manualmente y sabrá a qué me refiero) y soporte para matrices (muchos proyectos MySQL se deshacen por falta de matrices, optando en cambio por las infames cadenas separadas por comas).

Cuando usar PostgreSQL

PostgreSQL es siempre una mejor opción que cualquier otro motor de base de datos relacional. Es decir, si está comenzando un nuevo proyecto y MySQL lo ha mordido antes, es un buen momento para considerar PostgreSQL. Tengo amigos que dejaron de luchar contra las misteriosas fallas de bloqueo transaccional de MySQL y se mudaron de forma permanente. Si decides lo mismo, no estarás exagerando.

PostgreSQL también tiene una clara ventaja si necesita instalaciones NoSQL parciales para un modelo de datos híbrido. Dado que el almacenamiento de documentos y valores clave es compatible de forma nativa, no necesita buscar, instalar, aprender y mantener otra solución de base de datos.

Cuando no usar PostgreSQL

PostgreSQL no tiene sentido cuando su modelo de datos no es relacional y / o cuando tiene requisitos arquitectónicos muy específicos. Por ejemplo, considere Analytics, donde se crean constantemente nuevos informes a partir de datos existentes. Dichos sistemas son leídos y sufren cuando se les impone un esquema estricto. Claro, PostgreSQL tiene un motor de almacenamiento de documentos, pero las cosas comienzan a desmoronarse cuando se trata de grandes conjuntos de datos.

En otras palabras, siempre use PostgreSQL, ¡a menos que sepa al 100% lo que está haciendo! ��

Mira esto SQL & Curso PostgreSQL para principiantes si está interesado en aprender más.

MariaDB

MariaDB fue creado como un reemplazo para MySQL, por la misma persona que desarrolló MySQL.

Confuso?

Bueno, en realidad, después de que Oracle asumiera MySQL en 2010 (al adquirir Sun Microsystems, que, por cierto, también es cómo Oracle llegó a controlar Java), el creador de MySQL comenzó un nuevo proyecto de código abierto llamado MariaDB.

¿Por qué importan todos estos detalles aburridos? Se debe a que MariaDB se creó a partir de la misma base de código que MySQL (en el mundo de código abierto, esto se conoce como “bifurcación” de un proyecto existente). Como resultado, MariaDB se presenta como un reemplazo “directo” para MySQL.

Es decir, si está utilizando MySQL y desea migrar a MariaDB, el proceso es tan fácil que simplemente no lo creerá..

Desafortunadamente, tal migración es una calle de sentido único. No es posible regresar de MariaDB a MySQL, y si intenta usar la fuerza, se garantiza la corrupción permanente de la base de datos!

Características unicas

Si bien MariaDB es esencialmente un clon de MySQL, no es estrictamente cierto. Desde la introducción de la base de datos, las diferencias entre los dos han ido creciendo. Al momento de escribir, adoptar MariaDB debe ser una decisión bien pensada de su parte. Dicho esto, hay muchas cosas nuevas en marcha en MariaDB que pueden ayudarlo a hacer esta transición:

  • Realmente gratuito y abierto: dado que no existe una entidad corporativa única que controle MariaDB, puede estar libre de licencias depredadoras repentinas y otras preocupaciones.
  • Varias opciones más de motores de almacenamiento para necesidades especializadas: por ejemplo, el motor Spider para transacciones distribuidas; ColumnStore para el almacenamiento masivo de datos; el motor ColumnStore para almacenamiento paralelo y distribuido; y muchos muchos mas.
  • Mejoras de velocidad sobre MySQL, especialmente debido al motor de almacenamiento Aria para consultas complejas.
  • Columnas dinámicas para diferentes filas en una tabla..
  • Mejores capacidades de replicación (por ejemplo, replicación de múltiples fuentes)
  • Varias funciones JSON
  • Columnas virtuales

. . . Y muchos muchos mas. Es agotador mantenerse al día con todas las funciones de MariaDB. ��

Cuando usar MariaDB

Debe MariaDB si desea un verdadero reemplazo de MySQL, quiere mantenerse en la curva de innovación y no planea volver a MySQL nuevamente. Un excelente caso de uso es el uso de nuevos motores de almacenamiento en MariaDB para complementar el modelo de datos relacionales existente de su proyecto.

Cuando no usar MariaDB

La compatibilidad con MySQL es la única preocupación aquí. Dicho esto, se está volviendo menos problemático a medida que proyectos como WordPress, Joomla, Magento, etc., han comenzado a admitir MariaDB. Mi consejo sería no usar MariaDB para engañar a un CMS que no lo admite, ya que hay muchos trucos específicos de la base de datos que bloquean el sistema fácilmente.

CucarachaDB

El equipo detrás de CockroachDB parece estar compuesto por masoquistas. Con un nombre de producto como ese, seguramente quieren volver todas las probabilidades en su contra y aún así ganar?

Bueno, no del todo.

La idea detrás de la “cucaracha” es que es un insecto construido para sobrevivir. Pase lo que pase: depredadores, inundaciones, oscuridad eterna, comida podrida, bombardeos, la cucaracha encuentra la manera de sobrevivir y multiplicarse..

La idea es que el equipo detrás de CockroachDB (compuesto por antiguos ingenieros de Google) estaba frustrado con las limitaciones de las soluciones SQL tradicionales cuando se trata de gran escala. Esto se debe a que históricamente se suponía que las soluciones SQL estaban alojadas en una sola máquina (los datos no eran tan grandes). Durante mucho tiempo, no hubo forma de construir un grupo de bases de datos que ejecuten SQL, por lo que MongoDB captó tanta atención.

Incluso cuando la replicación y la agrupación aparecieron en MySQL, PostgreSQL y MariaDB, fue doloroso en el mejor de los casos. CoackroachDB quiere cambiar eso, brindando fragmentación, agrupamiento y alta disponibilidad sin esfuerzo al mundo de SQL.

Cuando usar CockroachDB

CucarachaDB es el sueño del arquitecto de sistemas hecho realidad. Si jura por SQL y ha estado cocinando a fuego lento con las capacidades de escala de MongoDB, le encantará CockroachDB. Ahora puede configurar rápidamente un clúster, enviarle consultas y dormir tranquilo por la noche. ��

Cuando no usar CockroachDB

Mejor el diablo que conoces que el que no. Con eso quiero decir, si su RDBMS existente está funcionando bien para usted y cree que puede manejar los dolores de escala que trae, quédese con él. Para todos los genios involucrados, CockroachDB es un producto nuevo, y no querrás luchar contra él más adelante. Otra razón importante es la compatibilidad con SQL: si está haciendo cosas SQL exóticas y confía en él para cosas críticas, CockroachDB presentará demasiados casos extremos para su gusto.

De ahora en adelante, consideraremos soluciones de base de datos que no sean SQL (o NoSQL, como se le llama) para necesidades altamente especializadas..

Neo4j

Uno de los desarrollos más significativos en la última década son los datos conectados. El mundo que nos rodea no está dividido en tablas, filas y cuadros, es un desastre gigante con todo conectado a casi todo lo demás..

Las redes sociales son un excelente ejemplo, y construir un modelo de datos similar usando SQL o incluso bases de datos basadas en documentos es una pesadilla.

Esto se debe a que la estructura de datos ideal para estas soluciones es el gráfico, que es una bestia completamente diferente. Y para eso, necesitas una base de datos gráfica como Neo4j.

El ejemplo anterior se tomó directamente del sitio web de Neo4j y muestra cómo los estudiantes universitarios están conectados a sus departamentos y cursos. Tal modelo de datos es simplemente imposible con SQL, ya que será difícil evitar bucles infinitos y desbordamientos de memoria.

Características unicas

Las bases de datos de gráficos son únicas en sí mismas, y Neo4j es prácticamente la única opción para trabajar con gráficos. Como resultado, las características que tiene son únicas. ��

  • Soporte para aplicaciones transaccionales y análisis gráfico..
  • Habilidades de transformación de datos para digerir datos tabulares a gran escala en gráficos.
  • Lenguaje de consulta especializado (Cypher) para consultar la base de datos de gráficos
  • Funciones de visualización y descubrimiento.

Es un punto discutible discutir cuándo usar Neo4j y cuándo no. Si necesita relaciones basadas en gráficos entre sus datos, necesita Neo4j. ��

MongoDB

MongoDB fue la primera base de datos no relacional que hizo grandes olas en la industria tecnológica y continúa dominando una parte justa de la atención.

A diferencia de las bases de datos relacionales, MongoDB es una “base de datos de documentos”, lo que significa que almacena datos en fragmentos, con datos relacionados agrupados en el mismo fragmento. Esto se entiende mejor imaginando una agregación de estructuras JSON como esta:

Aquí, a diferencia de una estructura basada en tablas, los detalles de contacto y los niveles de acceso de un usuario residen dentro del mismo objeto. Obtener el objeto de usuario recupera los datos asociados automáticamente, y no existe el concepto de una unión. Aquí hay una introducción más detallada a MongoDB.

Características unicas

MongoDB tiene algunas características serias (casi quiero escribir “kick-ass” para transmitir el impacto, pero tal vez no sería apropiado en un sitio web público) características que han hecho que varios arquitectos experimentados abandonen la tierra relacional para siempre:

  • Un esquema flexible para casos de uso especializados / impredecibles.
  • Ridículamente simple fragmentación y agrupamiento. Solo necesita configurar la configuración para un clúster y olvidarse de él.
  • Agregar o eliminar un nodo de un clúster es muy sencillo.
  • Cerraduras transaccionales distribuidas. Esta característica faltaba en las versiones anteriores, pero finalmente se introdujo.
  • Está optimizado para escrituras muy rápidas, por lo que es muy adecuado para datos analíticos como un sistema de almacenamiento en caché.

Si sueno como un portavoz de MongoDB, me disculpo, pero es difícil exagerar las ventajas de MongoDB. Claro, el modelado de datos NoSQL es extraño al principio, y algunos nunca se acostumbran, pero para muchos arquitectos, casi siempre gana sobre un esquema basado en tablas..

Cuando usar MongoDB

MongoDB es un gran puente cruzado del mundo estructurado y estricto de SQL al amorfo, casi confuso de NoSQL. Se destaca en el desarrollo de prototipos, ya que simplemente no hay un esquema del que preocuparse y cuándo realmente necesita escalar. Sí, puede usar un servicio SQL en la nube para deshacerse de los problemas de escalado de la base de datos, pero vaya que es costoso!

Finalmente, hay casos de uso en los que las soluciones basadas en SQL simplemente no funcionan. Por ejemplo, si está creando un producto como Canva, donde el usuario puede crear diseños complejos arbitrarios y poder editarlos más tarde, buena suerte con una base de datos relacional!

Cuando no usar MongoDB

La completa falta de esquema que proporciona MongoDB puede funcionar como un pozo de alquitrán para aquellos que no saben lo que están haciendo. No coinciden los datos, datos muertos, campos vacíos que no deberían estar vacíos: todo esto y mucho más es posible. MongoDB es esencialmente un almacén de datos “tonto”, y si lo elige, el código de la aplicación debe asumir una gran responsabilidad para mantener la integridad de los datos..

Si eres un desarrollador, encontrarás esta útil.

RethinkDB

Como su nombre dice, RethinkDB “Repensar” la idea y las capacidades de una base de datos cuando se trata de aplicaciones en tiempo real.

Cuando se actualiza una base de datos, la aplicación no puede saberlo. El enfoque aceptado es que la aplicación active una notificación tan pronto como haya una actualización, que se envía al front-end a través de un puente complejo (PHP -> Redis -> Nodo -> Socket.io es un ejemplo).

Pero, ¿y si las actualizaciones se pudieran enviar directamente desde la base de datos al front-end??!

Sí, esa es la promesa de RethinkDB. Entonces, si va a crear una aplicación en tiempo real real (juego, mercado, análisis, etc.), vale la pena echar un vistazo a Rethink DB.

Redis

Cuando se trata de bases de datos, es casi demasiado fácil pasar por alto la existencia de Redis. Esto se debe a que Redis es una base de datos en memoria y se usa principalmente en funciones de soporte como el almacenamiento en caché.

Aprendiendo esta base de datos es un trabajo de diez minutos (¡literalmente!), y es un simple almacén de valores clave que almacena cadenas con un tiempo de caducidad (que puede establecerse en infinito, por supuesto). Lo que Redis pierde en funciones lo compensa en utilidad y rendimiento. Dado que vive completamente en RAM, las lecturas y escrituras son increíblemente rápidas (no se conocen unos cientos de miles de operaciones por segundo).

Redis también tiene un sofisticado sistema pub-sub, lo que hace que esta “base de datos” sea dos veces más atractiva.

En otras palabras, si tiene un proyecto que podría beneficiarse del almacenamiento en caché o tiene algunos componentes distribuidos, Redis es la primera opción.

SQLite

Sí, prometí que habíamos terminado con las bases de datos relacionales, pero SQLite es demasiado lindo para ignorar.

SQLite es una biblioteca ligera de C que proporciona un motor de almacenamiento de base de datos relacional. Todo en esta base de datos vive en un solo archivo (con una extensión .sqlite) que puede colocar en cualquier parte de su sistema de archivos. ¡Y eso es todo lo que necesitas para usarlo! Sí, no hay que instalar un software de “servidor” y no hay ningún servicio al que conectarse.

Características útiles

Aunque SQLite es una alternativa ligera a una base de datos como MySQL, tiene un gran impacto. Algunas de sus características impactantes son:

  • Soporte completo para transacciones, con COMMIT, ROLLBACK y BEGIN.
  • Soporte para 32,000 columnas por tabla
  • Soporte JSON
  • Soporte JOIN de 64 vías
  • Subconsultas, búsqueda de texto completo, etc..
  • Tamaño máximo de la base de datos de 140 terabytes!
  • Tamaño máximo de fila de 1 gigabyte!
  • 35% más rápido que la E / S de archivo

Cuando usar SQLite

SQLite es una base de datos extremadamente especializada que se enfoca en un enfoque sencillo y sin complicaciones. Si su aplicación es relativamente simple y no desea la molestia de una base de datos completa, SQLite es un candidato serio. Tiene un sentido particular para aplicaciones de demostración y CMS de tamaño pequeño a mediano.

Cuando no usar SQLite

Aunque impresionante, SQLite no cubre todas las características del SQL estándar o su motor de base de datos favorito. Falta la agrupación, los procedimientos almacenados y las extensiones de secuencias de comandos. Además, no hay ningún cliente para conectarse, consultar y explorar la base de datos. Finalmente, a medida que crece el tamaño de la aplicación, el rendimiento se degradará.

Cassandra

Mientras muchos proclaman que el fin está cerca para Java, de vez en cuando la comunidad lanza una bomba y silencia a los críticos. Cassandra es uno de esos ejemplos.

Cassandra pertenece a lo que se conoce como la familia de bases de datos “columnar”. La abstracción de almacenamiento en Cassandra es una columna en lugar de una fila. La idea aquí es almacenar todos los datos en una columna físicamente juntos en el disco, minimizando el tiempo de búsqueda.

Características unicas

Cassandra se diseñó con un caso de uso específico en mente: lidiar con cargas pesadas de escritura y tolerancia cero para el tiempo de inactividad. Estos se convierten en sus puntos de venta únicos.

  • Rendimiento de escritura extremadamente rápido. Cassandra es posiblemente la base de datos más rápida que existe cuando se trata de manejar grandes cargas de escritura..
  • Escalabilidad lineal. Es decir, puede seguir agregando tantos nodos a un clúster como desee, y habrá un aumento cero en la complejidad o fragilidad del clúster.
  • Tolerancia de partición sin igual. Es decir, incluso si varios nodos en un clúster Cassandra se caen, la base de datos está diseñada para seguir funcionando sin pérdida de integridad..
  • Mecanografía estática

Cuando usar Cassandra

El registro y la analítica son dos de los mejores casos de uso para Cassandra. Pero eso no es todo: el punto óptimo es cuando necesita manejar tamaños de datos realmente grandes (Apple tiene una implementación de Cassandra que maneja más de 400 petabytes de datos, mientras que en Netflix maneja 1 billón de solicitudes por día) con literalmente cero tiempo de inactividad. La alta disponibilidad es una de las características de Cassandra..

Cuando no usar Cassandra

El esquema de almacenamiento de columnas de Cassandra también tiene sus desventajas. El modelo de datos es bastante plano, y si necesita agregaciones, Cassandra se queda corta. Además, logra una alta disponibilidad al sacrificar la consistencia (recuerde el teorema CAP para sistemas distribuidos), lo que lo hace menos adecuado para sistemas donde se necesita una alta precisión de lectura.

Escala de tiempo

Los nuevos desarrollos exigen nuevos tipos de bases de datos, e Internet de las cosas (IoT) es uno de esos fenómenos. Una de las mejores bases de datos de código abierto para eso es Escala de tiempo.

La escala de tiempo es un tipo de lo que se denomina una base de datos de “series temporales”. Es diferente de una base de datos tradicional, en ese momento es el eje principal de preocupación, y el análisis y la visualización de conjuntos de datos masivos es una prioridad. Las bases de datos de series de tiempo rara vez ven un cambio en los datos existentes; un ejemplo son las lecturas de temperatura enviadas por un sensor en un invernadero: nuevos datos se acumulan cada segundo, lo cual es de interés para análisis e informes.

¿Por qué no solo usar una base de datos tradicional con un campo de marca de tiempo, entonces? Bueno, hay dos razones principales para eso:

  • Las bases de datos de uso general no están optimizadas para trabajar con datos basados ​​en el tiempo. Para las mismas cantidades de datos, una base de datos de uso general será mucho más lenta.
  • La base de datos necesita manejar grandes cantidades de datos a medida que nuevos datos continúan fluyendo y eliminando datos o cambiando el esquema; luego, no es una opción.

Características unicas

Timescale DB tiene algunas características interesantes que lo diferencian de otras bases de datos en la misma categoría:

  • Está construido en PostgreSQL, posiblemente la mejor base de datos relacional de código abierto que existe. Si su proyecto ya está ejecutando PostgreSQL, Timescale se deslizará directamente en.
  • La consulta se realiza a través de la sintaxis SQL familiar, lo que reduce la curva de aprendizaje.
  • Velocidades de escritura ridículamente rápidas: millones de inserciones por segundo no son desconocidas.
  • Miles de millones de filas o petabytes de datos: no es gran cosa para Timescale.
  • Verdadera flexibilidad con el esquema: elija entre relacional o sin esquema según sus necesidades.

No tiene mucho sentido hablar sobre cuándo usar o no usar Timescale DB. Si IoT es tu dominio, o buscas características de base de datos similares, vale la pena echar un vistazo a Timescale.

CouchDB

CouchDB es una pequeña y ordenada solución de base de datos que se ubica silenciosamente en una esquina y tiene un seguimiento pequeño pero dedicado. Fue creado para lidiar con los problemas de pérdida de red y eventual resolución de datos, lo que resulta ser un problema tan desordenado que los desarrolladores cambiarían de trabajo en lugar de lidiar con él..

Esencialmente, puede pensar en un clúster CouchDB como una colección distribuida de nodos grandes y pequeños, algunos de los cuales se espera que estén fuera de línea. Tan pronto como un nodo se conecta, envía datos al clúster, que se digiere lenta y cuidadosamente, y finalmente está disponible para todo el clúster..

Características unicas

CouchDB es algo así como una raza única cuando se trata de bases de datos.

  • Primero sin conexión capacidades de sincronización de datos
  • Versiones especializadas para navegadores móviles y web (PouchDB, CouchDB Lite, etc.)
  • Resistencia a choques, confiabilidad probada en batalla
  • Agrupación fácil con almacenamiento de datos redundante

Cuando usar CouchDB

CouchDB fue creado para la tolerancia fuera de línea y sigue siendo inigualable en este sentido. Un caso de uso típico son las aplicaciones móviles donde una parte de sus datos reside en una instancia de CouchDB en el teléfono del usuario (porque allí es donde se generó). Lo emocionante es que no puede confiar en que el dispositivo del usuario esté conectado todo el tiempo, lo que significa que la base de datos debe ser oportunista y estar lista para resolver actualizaciones conflictivas más adelante. Esto se logra utilizando el impresionante Protocolo de replicación de sofá.

Cuando no usar CouchDB

Intentar usar CouchDB fuera de su caso de uso previsto conducirá a un desastre. Utiliza mucho más almacenamiento que cualquier otra cosa, simplemente porque necesita mantener copias redundantes de datos y resultados de resolución de conflictos. Como resultado, las velocidades de escritura también son dolorosamente lentas. Finalmente, CouchDB no es adecuado como un motor de esquema de propósito general, ya que no funciona bien con los cambios de esquema.

Conclusión

Tuve que dejar de lado a muchos candidatos interesantes como Riak, por lo que esta lista debe tomarse como una guía en lugar de un mandamiento. Espero haber podido lograr mi objetivo con este artículo: presentar no solo una colección de recomendaciones de bases de datos, sino también discutir brevemente dónde y cómo deben usarse (¡y evitarse!).

Si tiene curiosidad por aprender la base de datos, consulte Udemy para algunos de los brillantes cursos en línea.

TAGS:

  • Base de datos

  • Fuente abierta

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map