domingo, 31 de mayo de 2020

El mejor código que puedes programar es el que mejor puedan entender los demás.- Rafael Hernampérez

miércoles, 6 de mayo de 2020

Utiliza bases de datos en tus proyectos web sin servidores

EFEMem Web Database
¿Imaginas poder usar una base de datos en tu web de forma exclusiva y sin necesidad de hacer llamadas remotas, como una API?
EFEMem DB es una base de datos NoSQL ultra ligera, rápida, sencilla y eficiente, basada en clave-valor, que se ejecuta enteramente en memoria. Está enteramente escrita en JavaScript, y se puede ejecutar directamente en el front-end, a través de páginas web, aplicaciones PWA (Progressive Web Applications) o aplicaciones móviles híbridas (desarrolladas con Ionic, React Native, Nativescript, Xamarin, etc).

Casos de uso

¿Cuáles son los escenarios ideales para usar una base de datos en un proyecto web?. He aquí algunos casos:
  • Pérdida conexión. Tu aplicación puede seguir funcionando cuando no tienes conectividad con el servidor. Cuando recuperes la conexión, puedes volcar toda la información recopilada al servidor. Esta característica asegura la alta disponibilidad de tu aplicación.
  • Juegos HTML. Los datos de las partidas se guardan en cada navegador o dispositivo.
  • Datos de sesión de usuario
  • Datos exclusivos de la aplicación web
  • Datos de configuración. Permite cambios "en caliente", eliminando la característica de datos estáticos.
  • Monitorización de datos. Puedes, por ejemplo, conectar tus dispositivos IoT a tu web, y almacenar un rango fijo de datos cíclicos (por ejemplo, las últimas 24 horas).
  • Datos caché de uso frecuente
  • Datos maestros


Características principales

Los puntos fuertes de EFEMem DB son los siguientes:
  • NoSQL. Olvídate de la complejidad de relaciones de tablas o esquemas estrictos. Utiliza pares de clave-valor.
  • Acceso ultra-rápido de lectura y escritura (unos pocos nanosegundos)
  • No requiere de instalación en un servidor ni de un canal de sockets. Es una librería JavaScript que trabaja directamente con los datos.
  • Configuración en caliente. Puedes cambiar la configuración sin reiniciar el motor de base de datos.
  • Modo de datos reciclados. Mediante este modo se puede configurar un máximo de claves. Cuando se alcanza este límite, el siguiente dato se guardará tras eliminar, automáticamente, la cave más antigua.
  • Datos con tiempo de vida. Puedes guardar un dato que expire en un tiempo concreto (expresado en segundos).
  • Comandos poderosos. Puedes gestionar tus datos mediante unos pocos y sencillos comandos.
  • Persistencia. Puedes guardar los datos de forma permanente. Para ello, utiliza localStorage y restaurarlo al iniciar la base de datos o cuando quieras.
  • Espacios. Puedes organizar tus claves mediante espacios. Esto permite tener claves con el mismo nombre y distinto valor, en diferentes espacios. También ayuda a localizar e identificar las claves.
  • Patrones de nombre. Puedes buscar y acceder de forma eficiente a multitud de espacios y claves utilizando patrones de nombre, en lugar de acceder uno a uno.
  • Riqueza de tipos de datos. Puedes usar números enteros o reales, cadenas de texto, valores booleanos, arrays u objetos JSON


Comandos básicos

Lo mejor para entender cómo funciona EFEMem DB es el ejemplo.

Importar la librería

Lo primero es descargar la librería efememdb.js, que contiene todo el motor de la base de datos. Se encuentra en el repositorio Github: https://github.com/efememdb/EFEMemDB
Una vez descargado, en nuestro código HTML, importamos la librería:
<SCRIPT src="[/path/]efememdb.js"></SCRIPT>


/ Una vez importado, el motor de EFEMem DB entra en funcionamiento. Si hubo datos persistidos, automáticamente se cargarán estos para su uso.

Guardar datos con set()

Comencemos con el comando set(). Este comando guarda una clave y su valor:
<SCRIPT> var result = efemem.set("saludo", "Hola Mundo"); </SCRIPT>


Si no se especifica un nombre de espacio, asumirá el espacio 'public' por defecto.
Si el espacio y la clave no existen, se creará esta nueva clave en dicho espacio. Si ya existía previamente el espacio y la clave, el valor de ésta se actualizará con el nuevo valor.
El resultado de este comando sería el siguiente:
{   "ok":true,   "cmd":"set(key, value[,space[,due]])",   "data":{     "key":"saludo",     "space":"public",     "value":"Hola Mundo",     "due":"9999-12-31T22:59:59.000Z" },   "msg":"Key 'saludo' saved successfully in space 'public'",   "affected":1,   "time":"< 1 ms" }


Si se produjese un error, la respuesta de cualquier comando de EFEMem DB sería la siguiente:
{   "ok":false,   "msg":"[mensaje de error]", }


Recuperar datos con get()

El comando get() permite recuperar datos a través de la clave:
<SCRIPT> result = efemem.get("saludo"); </SCRIPT>


Si no se especifica un nombre de espacio, por defecto todos los espacios existentes. Lo mismo ocurre si no se especifica un nombre de clave. El comando get() (al igual que otros comandos), utilizan patrones de nombre para referirse a un espacio o a una clave. El nombre que se pase, se tomará como "parte del nombre". Es decir, que la cadena de caracteres especificada se utilizará como parte del nombre, ya sea al principio, en el medio o al final, muy similar a los patrones o comodines utilizados en un sistema operativo. Si se especifica un patrón 'al', es como si se especificara '*al*', con lo que buscaría cualquier nombre que empiece por 'al', termine en 'al' o que contenga 'al' en cualquier parte del nombre.
El resultado de este comando retorna un array o lista con todas las claves encontradas:
{   "ok":true,   "cmd":"get(key[,space])",   "data":[     {"key":"public~saludo","value":"Hola Mundo"}   ],   "msg":"1 values found",   "affected":1,   "time":"1 ms" }


Lista de comandos

Los comandos set() y get() son los comandos más básicos y utilizados de EFEMem DB. Pero tienes a tu disposición un conjunto de comandos que te ayudarán a gestionar de forma eficiente tu base de datos:
  • copy(): Copia claves de un espacio a otro
  • delete(): Elimina claves en los espacios indicados
  • get(): Recupera claves y valores de los espacios indicados
  • getConfig(): Recupera el valor de un parámetro de configuración
  • info(): Muestra la información sobre el uso de EFEMemDB
  • keys(): Retorna las claves definidas en los espacios indicados
  • memory(): Muestra la memoria utilizada por las claves de los espacios indicados
  • move(): Mueve claves de un espacio a otro
  • persist(): Guarda o persiste los datos actuales
  • rename(): Cambia el nombre de una clave
  • restore(): Carga o recupera los datos persistidos
  • set(): Guarda una clave en un espacio
  • setConfig(): Crea o modifica un parámetro de configuración
  • spaceInfo(): Muestra la información de un espacio dado
  • spaces(): Retorna la lista de espacios utilizados


Enlaces de interés

Imagen original en pxfuel: https://www.pxfuel.com/en/free-photo-elhvj